一份实用的 Docker 上手培训文档,重点不是把全部命令列出来,而是让学员快速理解容器、镜像、数据卷和网络之间的关系,并能完成一次从源码到运行容器的交付。下面按照培训的实际顺序拆成四个模块,每个模块都包含目标、操作命令和练习任务,可以直接作为内部培训讲义使用。

一、培训目标与环境准备
在培训开始前,讲师需要先确认学员的基础。Docker 上手培训通常面向后端开发、运维和测试人员,不要求预先掌握 Linux 内核知识,但需要会使用命令行。培训目标可以设定为:理解容器与虚拟机的差异,能独立完成镜像拉取、容器启停、日志查看、数据卷挂载,并能编写简单的 Dockerfile 和 Compose 文件。这样设定目标后,后续练习才不会变成单纯背命令。
环境准备是培训顺利进行的前提。讲师应提前准备一台 Linux 虚拟机或让学员安装 Docker Desktop,并统一版本。建议在培训前一天让学员执行 docker run hello-world,确认 Docker 引擎可以正常拉取镜像。国内网络环境下,还需要配置镜像加速器,否则大量时间会浪费在镜像下载上。以下命令用于检查 Docker 客户端、服务端和版本信息,适合放在培训文档的开篇作为环境自检。
docker version docker info docker run hello-world
这里有必要强调一个常见误区:容器不是轻量级虚拟机。虚拟机通过 Hypervisor 虚拟完整硬件,每个实例都有独立操作系统内核,启动较慢、资源占用高;容器共享宿主机内核,只隔离进程、文件系统和网络,所以启动时间通常在秒级以内。学员只有理解这一点,才能明白为什么容器不能随意更换内核版本,也不会把容器当成长期保存状态的服务器。
| 对比项 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 硬件级 | 进程级 |
| 启动速度 | 分钟级 | 秒级 |
| 资源占用 | 较高 | 较低 |
| 内核 | 独立 | 共享宿主机 |
培训文档中可以设计一个五分钟小练习:让学员分别启动三个不同镜像的容器,观察启动时间,再对比同配置虚拟机启动耗时。这个练习能直观建立容器轻量化的印象,也为后续讲数据卷和镜像层打好基础。
二、镜像与容器的核心操作
这一模块的目标是让学员掌握日常使用频率最高的命令。镜像操作从拉取和查看开始:docker pull nginx:alpine 用于拉取指定标签的镜像,docker images 列出本地镜像,docker rmi 镜像ID 删除不再使用的镜像。需要提醒学员,镜像名后面的标签如果不写,默认会使用 latest,但生产环境建议明确指定版本标签,避免 latest 指向不可预期的更新。
容器操作则围绕运行、查看、停止和删除展开。最基本的运行命令是 docker run nginx:alpine,但它会占用当前终端。要让容器在后台运行,需要加 -d 参数;要映射宿主机端口,使用 -p 8080:80。以下命令启动一个后台 Nginx 容器,并把宿主机的 8080 端口映射到容器的 80 端口。
docker run -d --name web1 -p 8080:80 nginx:alpine docker ps docker logs -f web1
查看运行状态用 docker ps,加上 -a 可以列出已停止的容器。日志排查用 docker logs,跟踪输出加 -f。停止容器使用 docker stop web1,删除容器使用 docker rm web1。需要特别说明,容器删除后其内部文件系统变更会丢失,因此如果有需要保留的数据,必须使用数据卷或绑定挂载,不能把数据直接写在容器可写层。
数据卷操作可以单独作为一个小节。例如运行一个带数据卷的 MySQL 容器,命令如下:
docker run -d --name mysql1 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v mysql_data:/var/lib/mysql \ mysql:8.0
这条命令中 -e 用于设置环境变量,-v mysql_data:/var/lib/mysql 会创建一个命名卷并挂载到 MySQL 数据目录。即使容器被删除,卷仍然保留,重新运行容器时只要指定同一个卷名,数据就可以恢复。培训时可以演示删除容器后数据仍在,这比单纯解释数据卷概念更有说服力。
三、用 Dockerfile 构建应用镜像
镜像除了从仓库拉取,更常见的来源是通过 Dockerfile 构建。Dockerfile 是一组指令,告诉 Docker 如何基于基础镜像打包应用。培训文档可以从一个简单的 Node.js 应用开始,先让学员准备一个 server.js 文件,内容只要能在 3000 端口返回响应即可。然后编写 Dockerfile:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install --registry=https://registry.npmmirror.com COPY . . EXPOSE 3000 CMD ["node", "server.js"]
逐条解释这些指令很有必要。FROM 指定基础镜像;WORKDIR 设置工作目录,后续命令都在该目录执行;COPY package*.json ./ 先把依赖清单复制进去,这样只要依赖不变,后续构建就能复用缓存;RUN npm install 安装依赖;COPY . . 把应用代码复制进镜像;EXPOSE 仅声明容器监听端口,真正映射端口还需要在 docker run 时使用 -p;CMD 定义容器启动时默认执行的命令。
构建镜像使用 docker build -t my-app:1.0 .,其中 -t 指定镜像名和标签,最后的点表示构建上下文为当前目录。构建完成后可以运行 docker run -d -p 3000:3000 my-app:1.0 来验证。构建优化是这一模块的重点,因为镜像层缓存会显著影响构建速度。如果先 COPY . . 再 RUN npm install,那么任意代码改动都会导致依赖安装层失效,需要重新下载全部依赖。把依赖复制和安装放在前面,代码复制放在后面,可以让依赖层缓存命中,构建时间从分钟级降到秒级。
另一个值得写入培训文档的细节是 .dockerignore 文件。默认情况下,构建上下文会把当前目录所有文件发送给 Docker 守护进程,如果包含 node_modules、.git、日志文件,构建会变慢,还可能把本地依赖覆盖镜像内安装的依赖。可以创建 .dockerignore 文件:
node_modules .git *.log
这个文件与 .gitignore 类似,但作用于 Docker 构建上下文。讲师可以设计一个对比练习:同一个项目分别在有和没有 .dockerignore 的情况下构建,观察构建时间差异,学员对上下文的作用会理解得更深。
四、Compose 编排与培训考核
单个容器很难支撑完整应用,通常还需要数据库、缓存、消息队列等服务。Compose 是 Docker 官方提供的多容器编排工具,通过一个 YAML 文件描述服务、网络和数据卷。培训文档可以把前一个 Node 应用扩展为依赖 Redis 的结构,编写 docker-compose.yml:
services:
app:
build: .
ports:
- "3000:3000"
environment:
REDIS_URL: redis://redis:6379
depends_on:
- redis
redis:
image: redis:7-alpine
这个文件定义了两个服务:app 使用当前目录的 Dockerfile 构建并暴露 3000 端口,redis 直接使用官方镜像。环境变量 REDIS_URL 指向服务名 redis,在 Compose 网络中服务名可以直接作为主机名访问。depends_on 只表示启动顺序,不等于应用就绪检查,这一点需要在培训中说明。对于数据库连接,通常还要配合健康检查和重试机制。
启动整套服务使用 docker compose up -d,查看状态使用 docker compose ps,停止并删除服务使用 docker compose down。如果有多个环境,可以用 -f 指定不同 Compose 文件,或使用 docker compose -f docker-compose.yml -f docker-compose.override.yml up -d。培训文档至少要让学员体验一次修改代码、重新构建镜像、滚动更新服务的流程,这样才贴近真实开发场景。
最后一个环节是培训考核。建议设计一个综合任务:把现有示例应用容器化,使用 Dockerfile 构建镜像,通过 Compose 连接数据库,并把数据写入命名卷。验收标准可以包括:容器后台运行正常、端口可以被宿主机访问、数据库数据在容器删除重建后仍然存在、镜像构建过程能够命中缓存。讲师可以根据学员完成情况评价培训效果,并汇总常见错误,例如端口冲突、镜像标签混乱、数据卷未挂载导致数据丢失等。把这些错误记录到培训文档的 FAQ 部分,后续再开展培训时可以不断迭代。