Docker 实战教程:从基础到生产
一份面向"会用但没成体系"的开发者的 Docker 系统化教程。十章循序渐进,从心智模型讲到生产实践;每章一个主题、配有可运行的示例代码,配套示例全部经过本机实测。
学习路线图
第一阶段 · 基础(第 1–5 章)── 建立正确心智模型
1 重新认识 Docker → 2 镜像管理 → 3 容器生命周期
→ 4 数据卷 → 5 网络
第二阶段 · 构建与编排(第 6–8 章)── 把应用打包并一键编排
6 Dockerfile → 7 多阶段构建与镜像瘦身 → 8 Docker Compose
第三阶段 · 生产与进阶(第 9–10 章)── 让容器在真实环境站稳
9 运维调试 → 10 生产化与安全建议按顺序阅读:前 5 章是后 5 章的地基;若时间有限,可先读 1、3、6、8 四章搭起主干,再回头补齐。
章节导航
| 章节 | 标题 | 解决的主要问题 |
|---|---|---|
| 第 1 章 | 重新认识 Docker | Docker 到底是什么?和虚拟机/进程有什么区别? |
| 第 2 章 | 镜像管理 | 镜像是怎么来的、怎么管理的?为什么能到处复用? |
| 第 3 章 | 容器生命周期 | 容器怎么运行、怎么访问、怎么停止清理? |
| 第 4 章 | 数据卷 | 容器删了数据就没了,怎么持久化、怎么共享? |
| 第 5 章 | 网络 | 多个容器怎么互相通信、怎么对外暴露端口? |
| 第 6 章 | Dockerfile | 怎么把自己的应用打包成镜像? |
| 第 7 章 | 多阶段构建与镜像瘦身 | 镜像太大、构建环境太脏怎么办? |
| 第 8 章 | Docker Compose | 多服务应用怎么一条命令启动、一键编排? |
| 第 9 章 | 运维调试 | 容器出问题怎么查?怎么限制资源? |
| 第 10 章 | 生产化与安全 | 镜像怎么加固、怎么安全地上线? |
环境准备
本教程命令基于 Docker Engine(本机验证版本 29.x,命令与主流版本兼容)。开始前请确认:
docker version # 查看客户端与服务端版本
docker info # 查看引擎信息(镜像、存储驱动、网络等)
docker run --rm hello-world # 验证拉取与运行是否正常三个命令都正常输出即环境就绪。
镜像加速(国内网络拉取慢时配置):在 Docker Desktop → Settings → Docker Engine 中追加 registry-mirrors 配置,例如:
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}配置后重启 Docker 生效。教程中所有镜像均以 nginx、mysql、redis、python、node、golang、alpine 等官方镜像为例。
如何使用本教程
- 读一章,跑一章:每章的关键示例都是完整可复现的命令序列(拉取 → 运行 → 验证 → 清理)。
- 动手做练习:每章末尾的练习不需要额外环境,在本地 Docker 上即可完成。
- 配套示例:
examples/NN-名称/目录保存了对应章节的完整可运行代码(Dockerfile、compose 文件、应用代码),每个目录的README.md说明了执行步骤。
目录结构
moqian-learn-docker/
├── README.md # 本文件:路线图 + 导航 + 环境准备
├── chapters/ # 章节正文(markdown)
│ ├── 01-docker-overview.md
│ ├── ...(第 2–9 章)
│ ├── 10-production-and-security.md
│ ├── _template.md # 章节模板(写作用,非读者章节)
│ └── _writing-guide.md # 写作约定(写作用,非读者章节)
└── examples/ # 配套可运行示例
├── 03-container-lifecycle/
├── 04-data-volumes/
├── 05-networking/
├── 06-dockerfile/
├── 07-multi-stage-builds/
├── 08-docker-compose/
├── 09-ops-and-debugging/
└── 10-production-and-security/常见问题(FAQ)
1. 提示 "Cannot connect to the Docker daemon" 怎么办? daemon 没在运行。先 docker version 看 Server 部分是否正常输出;Windows/macOS 检查 Docker Desktop 是否已启动,Linux 执行 sudo systemctl start docker(或 sudo service docker start)。
2. 端口映射报 "port is already allocated"?-p 的宿主机端口已被占用(可能是另一个容器或本机程序)。换一个端口,或先找出占用者:docker ps 看容器、netstat -ano | findstr <端口>(Windows)/ ss -ltnp | grep <端口>(Linux)看进程。
3. 容器启动后立刻退出? 分两类:前台任务跑完正常退出(如 docker run alpine echo hi);应用启动失败秒退。排查顺序:docker logs <容器> 看应用报错 → docker inspect <容器> 看 ExitCode/OOMKilled(137 = 内存超限被杀)→ 把 -d 去掉前台重跑看原始输出。详见第 9 章。
4. 删除镜像报 "image is being used by container"? 还有容器引用该镜像(包括已停止的)。docker ps -a 找到后先 docker rm 容器,再 docker rmi 镜像。详见第 2 章。
5. 镜像拉取很慢或超时? 国内网络访问 Docker Hub 不稳定。配置镜像加速(见上文"环境准备"),或改用内网私有仓库;docker pull 中断后重试会续传已下载的层。
6. Linux 下 docker 命令都要 sudo? 把当前用户加入 docker 组后重新登录:sudo usermod -aG docker $USER。注意:加入 docker 组等价于授予 root 权限(docker 可挂载宿主机任意目录),仅限可信用户。
7. docker compose down -v 把数据库数据删了?-v 会连同具名卷一起删除,数据不可恢复。生产环境永远先确认数据已备份再执行;日常只需 docker compose down(保留卷)。详见第 8 章。
8. docker logs 看不到应用日志?docker logs 只捕获容器主进程的 stdout/stderr。应用若把日志写进文件(而非标准输出),docker logs 自然看不到——让应用把日志打到标准输出(12-factor),或改用日志驱动/日志代理采集。详见第 9 章。
9. 教程中的命令在 Windows 上跑不通? 本教程命令均可在 Windows PowerShell、macOS、Linux 的 Docker 上运行;PowerShell 中注意:路径挂载用 ${PWD}:/容器路径(写 $PWD:/... 会被解析成驱动器限定变量而报错)、命令管道用 Select-String(对应 Linux 的 grep)。示例目录同时提供 run.ps1(Windows)与 run.sh(Linux/macOS)。