Skip to content

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 章重新认识 DockerDocker 到底是什么?和虚拟机/进程有什么区别?
第 2 章镜像管理镜像是怎么来的、怎么管理的?为什么能到处复用?
第 3 章容器生命周期容器怎么运行、怎么访问、怎么停止清理?
第 4 章数据卷容器删了数据就没了,怎么持久化、怎么共享?
第 5 章网络多个容器怎么互相通信、怎么对外暴露端口?
第 6 章Dockerfile怎么把自己的应用打包成镜像?
第 7 章多阶段构建与镜像瘦身镜像太大、构建环境太脏怎么办?
第 8 章Docker Compose多服务应用怎么一条命令启动、一键编排?
第 9 章运维调试容器出问题怎么查?怎么限制资源?
第 10 章生产化与安全镜像怎么加固、怎么安全地上线?

环境准备 ​

本教程命令基于 Docker Engine(本机验证版本 29.x,命令与主流版本兼容)。开始前请确认:

bash
docker version          # 查看客户端与服务端版本
docker info             # 查看引擎信息(镜像、存储驱动、网络等)
docker run --rm hello-world   # 验证拉取与运行是否正常

三个命令都正常输出即环境就绪。

镜像加速(国内网络拉取慢时配置):在 Docker Desktop → Settings → Docker Engine 中追加 registry-mirrors 配置,例如:

json
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}

配置后重启 Docker 生效。教程中所有镜像均以 nginx、mysql、redis、python、node、golang、alpine 等官方镜像为例。

如何使用本教程 ​

  1. 读一章,跑一章:每章的关键示例都是完整可复现的命令序列(拉取 → 运行 → 验证 → 清理)。
  2. 动手做练习:每章末尾的练习不需要额外环境,在本地 Docker 上即可完成。
  3. 配套示例: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)。

📖本文阅读--次|📊全站访问--次|👥访客--人