Docker 入门实战教程:从零开始掌握容器化技术
引言:为什么需要 Docker?
在软件开发的世界里,我们经常遇到这样的困扰:"在我的电脑上明明可以运行,为什么到服务器上就报错了?"这个问题一直困扰着无数开发者。不同的操作系统、不同的依赖库版本、不同的环境配置......这些差异导致了开发和部署环境的不一致。
而 Docker 的出现,彻底改变了这一局面。它让应用程序及其依赖环境打包成一个轻量级的"容器",在任何支持 Docker 的平台上都能以相同的方式运行。这就是著名的"一次构建,到处运行"(Build Once, Run Anywhere)。
一、Docker 是什么?
1.1 容器技术的革命
Docker 是一个开源的容器化平台,它可以将应用程序及其依赖环境打包成一个独立的容器。与传统虚拟机相比,Docker 容器更加轻量、快速、高效。
传统虚拟机 vs Docker 容器:
| 特性 | 虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 磁盘占用 | GB 级别 | MB 级别 |
| 性能 | 接近原生 | 接近原生 |
| 隔离性 | 完全隔离 | 进程级隔离 |
| 可移植性 | 较差 | 优秀 |

1.2 Docker 的核心优势
- 快速部署:容器启动只需几秒钟
- 环境一致性:开发、测试、生产环境完全一致
- 资源高效:相比虚拟机节省大量系统资源
- 微服务架构:完美支持微服务部署
- 持续集成/部署:简化 CI/CD 流程
二、Docker 核心概念详解
2.1 镜像(Image)
镜像就像是应用程序的"模板"或"蓝图"。它是一个只读的文件包,包含了运行应用程序所需的所有内容:代码、运行时、系统工具、系统库和设置。
镜像的特点:
- 分层存储:每一层都是只读的
- 可复用:多个容器可以共享同一个镜像
- 版本管理:通过标签(tag)管理不同版本

常见镜像示例:
bash
nginx:latest # 最新版本的 Nginx
python:3.9-slim # Python 3.9 精简版
mysql:8.0 # MySQL 8.0
ubuntu:20.04 # Ubuntu 20.04
2.2 容器(Container)
容器是镜像的运行实例。如果说镜像是"类",那么容器就是"对象"。你可以从一个镜像启动多个容器,每个容器都是相互隔离的。

容器的生命周期:
- Created:容器已创建但未启动
- Running:容器正在运行
- Paused:容器已暂停
- Stopped:容器已停止
- Deleted:容器已删除
2.3 仓库(Registry)
仓库是存放镜像的地方,就像代码仓库存放代码一样。
常见的 Docker 镜像仓库:
- Docker Hub:官方公共仓库(hub.docker.com)
- 阿里云镜像仓库:国内访问速度快
- 私有仓库:企业内部自建
Docker 核心组件架构总览:

三、Docker 安装指南
3.1 Windows 安装
系统要求:
- Windows 10/11 专业版或企业版
- 启用 Hyper-V 和 WSL 2
安装步骤:
- 访问 Docker 官网下载 Docker Desktop for Windows
- 双击安装程序,按照提示完成安装
- 重启计算机
- 启动 Docker Desktop
- 验证安装:
bash
docker --version
docker run hello-world
3.2 Linux 安装(以 Ubuntu 为例)
bash
# 1. 更新包索引
sudo apt-get update
# 2. 安装依赖包
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4. 设置仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 验证安装
sudo docker run hello-world
配置用户组(免 sudo):
bash
sudo usermod -aG docker $USER
newgrp docker
四、Docker 实战演练
4.1 第一个 Docker 容器
让我们从最简单的例子开始,运行一个 Nginx Web 服务器:
bash
# 拉取 Nginx 镜像
docker pull nginx:latest
# 运行 Nginx 容器
docker run -d -p 8080:80 --name my-nginx nginx:latest
# 查看运行状态
docker ps
# 访问测试
# 打开浏览器访问 http://localhost:8080
参数说明:
-d:后台运行-p 8080:80:端口映射,宿主机8080端口映射到容器80端口--name my-nginx:指定容器名称
4.2 部署 MySQL 数据库
bash
# 运行 MySQL 容器
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# 进入 MySQL 容器
docker exec -it mysql-server mysql -uroot -p
# 查看 MySQL 日志
docker logs mysql-server
参数说明:
-e:设置环境变量-v mysql-data:/var/lib/mysql:数据持久化,数据存储在命名卷中
4.4 Docker Compose 多容器应用
docker-compose.yml 示例:
yaml
version: '3.8'
services:
# Web 应用
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
- DATABASE_URL=mysql://root:my-secret-pw@db:3306/mydb
networks:
- app-network
# 数据库
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: mydb
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-network
# Nginx 反向代理
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
启动服务:
bash
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
五、Docker 常用命令大全
5.1 镜像管理命令
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:1.0 .
# 导出镜像
docker save -o myapp.tar myapp:1.0
# 导入镜像
docker load -i myapp.tar
# 标记镜像
docker tag myapp:1.0 myapp:latest
5.2 容器管理命令
bash
# 运行容器
docker run [OPTIONS] IMAGE [COMMAND]
docker run -d -p 80:80 --name web nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 停止容器
docker stop web
# 启动已停止的容器
docker start web
# 重启容器
docker restart web
# 删除容器
docker rm web
# 强制删除运行中的容器
docker rm -f web
# 查看容器详细信息
docker inspect web
# 查看容器日志
docker logs web
docker logs -f web # 实时查看
# 进入容器
docker exec -it web /bin/bash
5.3 数据管理命令
bash
# 创建数据卷
docker volume create my-volume
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-volume
# 删除数据卷
docker volume rm my-volume
# 创建备份
docker run --rm --volumes-from db-container -v $(pwd):/backup \
ubuntu tar cvf /backup/backup.tar /var/lib/mysql
5.4 网络管理命令
bash
# 创建网络
docker network create my-network
# 查看网络
docker network ls
# 连接容器到网络
docker network connect my-network my-container
# 断开网络连接
docker network disconnect my-network my-container
# 删除网络
docker network rm my-network
六、Docker 数据持久化
6.1 数据卷(Volume)
特点:
- 由 Docker 管理
- 存储在 Docker 特定目录
- 跨平台兼容性好
- 适合生产环境
bash
# 创建命名卷
docker volume create my-data
# 使用卷
docker run -d -v my-data:/data nginx
# 查看卷信息
docker volume inspect my-data
# 清理未使用的卷
docker volume prune
6.2 挂载目录(Bind Mount)
特点:
- 直接映射宿主机目录
- 适合开发环境
- 可以直接访问文件

bash
# 挂载当前目录
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx
# 只读挂载
docker run -d -v $(pwd)/html:/usr/share/nginx/html:ro nginx
七、Docker 网络模式
7.1 网络模式类型
| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器通信 |
| host | 共享宿主机网络 | 高性能需求 |
| none | 无网络配置 | 离线处理任务 |
| container | 共享其他容器网络 | 容器间协作 |

7.2 网络配置示例
bash
# 创建自定义网络
docker network create --driver bridge my-network
# 运行容器并连接到网络
docker run -d --name web1 --network my-network nginx
docker run -d --name web2 --network my-network nginx
# 容器可以通过容器名互相访问
docker exec web1 ping web2
八、Docker 安全最佳实践
8.1 镜像安全
dockerfile
# 使用特定版本标签,不使用 latest
FROM python:3.9-slim
# 使用非 root 用户
RUN useradd -m myuser
USER myuser
# 最小化安装
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
# 扫描镜像漏洞
# docker scan myapp:1.0
8.2 运行时安全
bash
# 限制容器资源
docker run -d \
--memory="512m" \
--cpus="1.0" \
--read-only \
--security-opt=no-new-privileges \
nginx
# 使用 rootless 模式
# 避免 root 用户运行容器
九、实战项目:个人博客系统
9.1 项目架构
我们将部署一个完整的博客系统,包含:
- WordPress(前端)
- MySQL(数据库)
- Nginx(反向代理)
9.2 docker-compose.yml 配置
yaml
version: '3.8'
services:
# 数据库服务
database:
image: mysql:8.0
container_name: blog-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db-data:/var/lib/mysql
networks:
- blog-network
# WordPress 服务
wordpress:
image: wordpress:latest
container_name: blog-wordpress
restart: always
depends_on:
- database
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-data:/var/www/html
ports:
- "8080:80"
networks:
- blog-network
# phpMyAdmin(可选)
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: blog-phpmyadmin
restart: always
depends_on:
- database
environment:
PMA_HOST: database
PMA_PORT: 3306
ports:
- "8081:80"
networks:
- blog-network
volumes:
db-data:
wp-data:
networks:
blog-network:
driver: bridge
9.3 部署步骤
bash
# 1. 克隆配置文件
mkdir blog && cd blog
# 2. 创建 docker-compose.yml
# (将上面的配置保存为 docker-compose.yml)
# 3. 启动服务
docker-compose up -d
# 4. 查看服务状态
docker-compose ps
# 5. 访问博客
# 打开浏览器访问 http://localhost:8080
# 首次访问会进入 WordPress 安装向导
# 6. 访问 phpMyAdmin
# http://localhost:8081
# 用户名:root
# 密码:rootpassword
十、Docker 故障排查
10.1 常见问题及解决方案
问题 1:容器无法启动
bash
# 查看容器日志
docker logs <container-id>
# 查看容器详情
docker inspect <container-id>
# 尝试交互式运行
docker run -it <image> /bin/bash
问题 2:端口冲突
bash
# 查看端口占用
netstat -tunlp | grep <port>
# 更改端口映射
docker run -p 8081:80 nginx # 使用其他端口
问题 3:磁盘空间不足
bash
# 清理未使用的镜像
docker image prune -a
# 清理未使用的容器
docker container prune
# 清理未使用的卷
docker volume prune
# 一键清理
docker system prune -a --volumes
问题 4:网络连接问题
bash
# 检查网络配置
docker network inspect <network-name>
# 重建网络
docker network rm <network-name>
docker network create <network-name>
10.2 调试技巧
bash
# 查看容器资源使用情况
docker stats
# 查看容器进程
docker top <container-id>
# 实时查看日志
docker logs -f --tail 100 <container-id>
# 导出容器文件系统
docker export <container-id> > container.tar
十一、总结
Docker 作为容器化技术的代表,已经彻底改变了软件开发和部署的方式。通过本文的学习,你已经掌握了:
✅ Docker 的核心概念(镜像、容器、仓库) ✅ Docker 的安装方法 ✅ 常用命令的使用 ✅ Dockerfile 的编写技巧 ✅ 数据持久化和网络配置 ✅ 实战项目部署经验
记住:Docker 的学习曲线不算陡峭,关键在于多动手实践。每一个命令、每一个配置,都需要在实战中才能真正理解和掌握。