Docker入门实战:从安装到运行第一个容器
## 引言:为什么Docker改变了开发者的工作方式?
在传统的软件开发中,我们经常会遇到这样的问题:“在我的机器上可以运行,为什么在你的机器上就不行?” 这就是经典的“环境不一致”问题。Docker通过容器化技术,将应用程序及其所有依赖项打包到一个标准化的单元中,彻底解决了这个问题。
想象一下,你开发了一个需要特定版本Node.js、Redis和PostgreSQL的Web应用。使用Docker,你可以确保从开发到生产的每个环境都完全相同。这不仅仅是便利,更是现代DevOps文化的基石。
## 一、Docker核心概念快速理解
在开始动手之前,我们先来理解几个关键概念:
```mermaid
graph TB
A[Docker镜像 Image] --> B[Docker容器 Container]
C[Docker仓库 Registry] --> A
B --> D[运行中的应用]
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
```
**镜像(Image)**:容器的蓝图,类似于虚拟机的模板。镜像包含运行应用程序所需的一切:代码、运行时、系统工具、系统库等。
**容器(Container)**:镜像的运行实例。你可以创建、启动、停止、移动或删除容器。每个容器都是相互隔离、安全的平台。
**仓库(Registry)**:存储镜像的地方。Docker Hub是最大的公共仓库,你也可以搭建私有仓库。
## 二、在不同系统上安装Docker
### 1. Windows系统安装(Windows 10/11)
**系统要求:**
- Windows 10 64位:专业版、企业版或教育版(Build 15063或更高)
- 启用Hyper-V和容器功能
**安装步骤:**
1. 访问[Docker官网](https://www.docker.com/products/docker-desktop)
2. 下载Docker Desktop for Windows安装包
3. 运行安装程序,勾选"Use WSL 2 instead of Hyper-V"(推荐)
4. 安装完成后重启电脑
5. 在开始菜单中找到"Docker Desktop"并运行
**验证安装:**
```bash
# 打开PowerShell或命令提示符
docker --version
# 输出示例:Docker version 20.10.12, build e91ed57
docker-compose --version
# 输出示例:docker-compose version 1.29.2, build 5becea4c
```
### 2. macOS系统安装
**系统要求:**
- macOS 10.15或更高版本(Catalina、Big Sur、Monterey)
- 至少4GB内存
**安装步骤:**
```bash
# 使用Homebrew安装(推荐)
brew install --cask docker
# 或者从官网下载.dmg安装包
# https://docs.docker.com/desktop/mac/install/
```
**启动Docker:**
```bash
# 在应用程序中找到Docker并启动
# 首次启动需要授权
open /Applications/Docker.app
```
### 3. Linux系统安装(以Ubuntu 20.04为例)
```bash
# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 安装依赖包
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 3. 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 添加当前用户到docker组(避免每次使用sudo)
sudo usermod -aG docker $USER
# 7. 重新登录使组更改生效
newgrp docker
```
## 三、Docker架构深入理解
Docker采用的是客户端-服务器架构:
```
┌─────────────────────────────────────────────────────────────┐
│ Docker Client │
│ (docker CLI) │
└───────────────┬─────────────────────────────────────────────┘
│
┌───────────────▼─────────────────────────────────────────────┐
│ Docker Daemon (dockerd) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Containerd │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Container Runtime (runc) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
**主要组件说明:**
- **Docker Client**:用户通过命令行与Docker交互的接口
- **Docker Daemon**:服务器组件,负责构建、运行和管理容器
- **Containerd**:行业标准的容器运行时
- **容器运行时**:实际运行容器的组件
## 四、运行你的第一个Docker容器
### 1. Hello World:经典的开始
```bash
# 运行一个简单的Hello World容器
docker run hello-world
```
你会看到类似下面的输出:
```
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```
**这个命令发生了什么?**
1. Docker客户端连接到Docker守护进程
2. 在本地查找`hello-world`镜像,如果不存在则从Docker Hub下载
3. 基于镜像创建并启动一个新的容器
4. 容器执行其预定义的程序,输出信息后退出
### 2. 运行一个实用的Web服务器:Nginx
```bash
# 运行一个Nginx Web服务器
docker run -d -p 80:80 --name my-nginx nginx
```
**参数解释:**
- `-d`:后台运行(detached模式)
- `-p 80:80`:端口映射(主机端口:容器端口)
- `--name my-nginx`:为容器指定一个名称
- `nginx`:使用的镜像名称
**验证Nginx运行:**
```bash
# 查看运行中的容器
docker ps
# 访问Nginx
curl http://localhost
# 或者在浏览器中打开 http://localhost
```
### 3. 进入容器内部探索
```bash
# 以交互模式进入容器
docker exec -it my-nginx /bin/bash
# 在容器内部执行命令
ls -la /usr/share/nginx/html/
cat /etc/nginx/nginx.conf | head -20
# 退出容器
exit
```
## 五、常用Docker命令速查手册
### 镜像管理
```bash
# 搜索镜像
docker search ubuntu
# 拉取镜像
docker pull ubuntu:20.04
# 列出本地镜像
docker images
docker image ls
# 删除镜像
docker rmi <镜像ID>
docker image rm <镜像名>
# 查看镜像详情
docker inspect nginx
```
### 容器管理
```bash
# 运行容器
docker run [选项] 镜像 [命令]
# 列出容器
docker ps # 运行中的容器
docker ps -a # 所有容器
docker ps -q # 只显示容器ID
# 停止/启动容器
docker stop <容器ID或名称>
docker start <容器ID或名称>
docker restart <容器ID或名称>
# 删除容器
docker rm <容器ID或名称>
docker rm -f <容器ID或名称> # 强制删除运行中的容器
# 查看容器日志
docker logs <容器ID或名称>
docker logs -f <容器ID或名称> # 实时查看
docker logs --tail 50 <容器ID> # 查看最后50行
```
### 信息查看与调试
```bash
# 查看容器内部进程
docker top <容器ID>
# 查看容器资源使用情况
docker stats
# 查看容器详细信息
docker inspect <容器ID>
# 复制文件
docker cp <容器ID>:<容器内路径> <主机路径> # 从容器复制到主机
docker cp <主机路径> <容器ID>:<容器内路径> # 从主机复制到容器
```
## 六、实战项目:搭建个人博客系统
让我们用Docker Compose来部署一个真实的WordPress博客系统:
```yaml
# docker-compose.yml
version: '3.8'
services:
# MySQL数据库服务
db:
image: mysql:8.0
container_name: wordpress_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpresspassword
volumes:
- db_data:/var/lib/mysql
networks:
- wordpress_network
# WordPress应用服务
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress_app
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpresspassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- wordpress_network
# 定义网络和卷
networks:
wordpress_network:
driver: bridge
volumes:
db_data:
wp_data:
```
**部署步骤:**
```bash
# 1. 创建项目目录
mkdir my-wordpress && cd my-wordpress
# 2. 创建docker-compose.yml文件(复制上面的内容)
nano docker-compose.yml
# 3. 启动服务
docker-compose up -d
# 4. 查看运行状态
docker-compose ps
# 5. 在浏览器访问:http://localhost:8080
```
## 七、常见问题与解决方案
### Q1: Docker命令需要sudo权限怎么办?
**解决方案:**
```bash
# 将当前用户添加到docker组
sudo usermod -aG docker $USER
# 重新登录或运行以下命令使更改生效
newgrp docker
```
### Q2: 如何清理Docker占用的磁盘空间?
```bash
# 删除所有停止的容器
docker container prune
# 删除所有未被使用的镜像
docker image prune -a
# 删除所有未使用的网络、卷等
docker system prune -a --volumes
# 查看磁盘使用情况
docker system df
```
### Q3: 镜像下载速度慢怎么办?
**配置国内镜像加速器:**
1. 创建或修改 `/etc/docker/daemon.json`
```json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
```
2. 重启Docker服务
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
### Q4: 容器端口被占用怎么办?
```bash
# 查看哪个进程占用了端口
sudo lsof -i :80
# 或者修改容器映射的端口
docker run -d -p 8080:80 nginx
```
## 八、Docker最佳实践总结
1. **一个容器只运行一个进程**:保持容器职责单一
2. **使用官方镜像**:更安全、更稳定
3. **指定明确的镜像版本**:避免使用`latest`标签
4. **合理使用`.dockerignore`**:减少镜像体积
5. **不要将数据存储在容器内**:使用数据卷或绑定挂载
6. **限制容器资源使用**:避免单个容器占用全部资源
```bash
docker run -d --memory="512m" --cpus="1.0" nginx
```
## 下一步学习建议
通过这篇教程,你已经掌握了Docker的基础知识。接下来可以:
1. 学习如何编写Dockerfile来构建自己的镜像
2. 深入了解Docker网络和数据卷
3. 探索Docker Compose进行多容器编排
4. 学习Docker在CI/CD中的应用
---
**本篇重点回顾:**
- ✅ 理解了Docker的核心概念:镜像、容器、仓库
- ✅ 学会了在不同系统上安装Docker
- ✅ 掌握了基本的Docker命令操作
- ✅ 成功运行了第一个容器和完整的应用栈
- ✅ 了解了常见问题的解决方法
Docker只是云原生世界的起点。在接下来的博客中,我们将深入探讨Docker镜像构建、网络配置,并进入Kubernetes的神奇世界。有任何问题欢迎在评论区留言讨论!
**思考题:** 你当前的项目中,哪些部分最适合用Docker容器化?为什么?
---
**相关资源:**
- [Docker官方文档](https://docs.docker.com/)
- [Docker Hub](https://hub.docker.com/)
- [Play with Docker](https://labs.play-with-docker.com/) - 免费的在线Docker实验环境
**下一篇预告:** 《Docker镜像深度解析:构建、优化与安全》 - 我们将学习如何创建高效、安全的Docker镜像,并搭建私有镜像仓库。
更多推荐

所有评论(0)