目录
Docker 教程:从入门到掌握容器、镜像与 Compose
Docker 是一个将应用程序及其所需的一切(运行环境、库、配置)打包在一起的工具。打包好的内容称为镜像(image),运行起来就是容器(container)。同一个镜像在你的笔记本电脑、同事的电脑或云服务器上运行,结果都一样。
- 开发者
- Docker, Inc.
- 首次发布
- 2013 年
- 开发语言
- Go
- 许可
- Docker Engine 是开源软件(Apache License 2.0);Docker Desktop 是商业软件,个人和小型企业可免费使用
- 官方网站
- www.docker.com
- 官方文档
- docs.docker.com
这份 Docker 教程从最基本的概念开始,逐步带你学会编写 Dockerfile、使用 Docker Compose 管理多个服务,最后将网站部署到云主机。
官方资源
| 资源 | 网址 | 用途 |
|---|---|---|
| 官方网站 | www.docker.com | 产品介绍、下载 Docker Desktop、价格方案 |
| 官方文档 | docs.docker.com | 完整的命令和配置参考 |
| 安装说明 | Get Docker | 各操作系统的官方安装步骤 |
| Docker Hub | hub.docker.com | 搜索和下载镜像、推送自己的镜像 |
| Docker Engine 源代码 | github.com/moby/moby | Docker Engine 的开源项目(Moby) |
| Docker CLI 源代码 | github.com/docker/cli | docker 命令的源代码 |
| Docker Compose 源代码 | github.com/docker/compose | docker compose 的源代码和版本发布信息 |
| 版本信息 | Engine、Desktop | 各版本的新功能和变更 |
Docker 和鲸鱼标志是 Docker, Inc. 的商标。本教程是非官方学习资源,与 Docker, Inc. 无关。
本教程使用的版本
教程中的每条命令都在 2026 年 10 月实际运行过,黑色背景的终端区块都是真实的运行结果(仅删除了与教程无关的内容,例如下载进度)。你的输出中,容器 ID、时间、文件大小等数值会与教程不同,这是正常的。
| 软件 | 本教程实测版本 | 最低要求与说明 |
|---|---|---|
| Docker Engine | 29.9.0 | 建议使用 25 或更高版本。更旧的版本大多仍可运行这些命令,但部分输出格式不同 |
| Docker Compose | v5.6.0 | 使用 docker compose(插件版)。v2.20 或更高版本即可运行本教程的 compose.yaml;旧版 docker-compose(v1)已停止维护 |
| Docker Buildx | v0.38.0 | 从 Docker Engine 23 开始默认使用 BuildKit 构建,RUN --mount 等语法需要 BuildKit |
| Docker Desktop(Windows、macOS) | 4.95 | 内置 Docker Engine 和 Compose,系统要求见下文 |
Compose 的版本号从 v2 直接跳到 v5(为避免与旧版 Compose 文件格式“version 2 / 3”混淆,跳过了 v3、v4),命令用法与 v2 相同。
系统要求
| 系统 | 要求 |
|---|---|
| Windows | 64 位版本的 Windows 10 22H2(内部版本 19045)或 Windows 11 23H2(内部版本 22631)及更高版本;需要 WSL 2.1.5 或更高版本,并在 BIOS 中启用虚拟化;至少 8 GB 内存 |
| macOS | 最新的三个 macOS 主要版本;Apple Silicon 或 Intel;至少 4 GB 内存 |
| Linux | 本教程使用 Ubuntu(24.04 / 26.04),x86_64 或 arm64;其他主流发行版也可以安装 Docker Engine |
示例使用的镜像版本
| 镜像 | 版本 | 用途 |
|---|---|---|
nginx | 1.30(stable) | Web 服务器、反向代理 |
node | 24(LTS) | Node.js 示例 |
python | 3.14 | Python 示例 |
postgres | 18 | PostgreSQL 数据库 |
mysql | 8.4(LTS) | MySQL、WordPress |
redis | 8 | Redis 缓存 |
wordpress | 7 | WordPress 实战 |
alpine / ubuntu | 3.23 / 26.04 | 练习用的基础镜像 |
caddy | 2 | 自动 HTTPS 反向代理、部署 |
golang + distroless/static-debian13 | 1.27 | 多阶段构建、多平台镜像 |
registry | 3 | 本地 Registry(推送练习) |
phpmyadmin / adminer | latest | 数据库管理界面 |
示例中尽量使用固定版本(例如 postgres:18),照着操作就能得到与教程相同的结果。
你将学到什么
- Docker、镜像和容器之间的关系
- 在 Windows、macOS、Linux 上安装 Docker
- 使用
docker run运行容器,并管理容器的生命周期 - 编写 Dockerfile,将自己的程序打包成镜像
- 使用 Volume 保存数据,通过网络让容器互相连接
- 使用 Docker Compose 一次启动多个服务
- 使用 Docker 运行 Python、Node.js、Nginx、MySQL、PostgreSQL、Redis、WordPress
- 清理空间、进行安全配置、使用 Rootless 和 Podman、创建多平台镜像
- 使用 GitHub Actions 自动构建并部署到云主机
- 了解 Docker 的底层原理(namespace、cgroup、overlayfs)
- 遇到错误时,从常见错误信息大全查找原因;常用命令的完整参数见“命令参考”
适合哪些人
- 第一次接触 Docker 的开发者
- 经常遇到“在我的电脑上可以运行”问题的团队
- 想把项目部署到云端,但不想手动配置服务器的人
只要会在终端(命令行)输入命令,就可以开始。不需要预先了解 Linux 或服务器管理。
如何阅读这份教程
- 白色背景的代码区块是要输入的命令或文件内容,点击右上角的“复制”即可复制。
- 黑色背景、标有 Terminal 的区块是运行结果。以
$开头的那一行是输入的命令,下面是输出;点击“复制”只会复制命令。 - 带有 Linux / macOS、Windows PowerShell、Windows CMD 选项卡的命令,选择你使用的系统,整页都会切换为相应的写法。
- 每章开头会列出预计时间、前置章节和学习重点;章末包含重点回顾、附有答案的动手练习和常见问题。
- 截图中的网页画面都是真实运行后截取的;Docker Desktop 和 Docker Hub 的部分界面截图来自 Docker 官方文档(Apache License 2.0),图注中会注明。
快速体验
安装 Docker 后,在终端中输入:
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
看到 Hello from Docker! 就说明一切正常。接下来从什么是 Docker开始吧。
常见问题
这份教程适合完全没用过 Docker 的人吗?
适合。从安装和第一个容器开始,每一步都附有实际运行结果,照着操作就能得到相同的结果。
教程中的命令在 Windows 上可以用吗?
可以。需要使用不同写法的地方(例如路径 $(pwd))都提供 Linux/macOS、PowerShell、CMD 三个选项卡,也可以在 WSL 中直接使用 Linux 写法。
示例代码可以下载吗?
每章开头的“示例代码”链接都会打开该章的完整项目。
基础入门
- Docker 是什么
用通俗易懂的方式介绍 Docker 是什么、它解决的问题,以及镜像、容器、Registry 三个核心概念、Docker 的架构和容器与虚拟机的区别。
- 安装 Docker
一步步在 Windows(WSL 2)、macOS 和 Linux(Ubuntu 26.04 / 24.04)上安装 Docker,检查虚拟化和 WSL 设置,并用 docker version 与 hello-world 验证安装。
- Docker Desktop 界面导览
Docker Desktop 图形界面逐页介绍:侧边栏、Containers 列表和操作按钮、容器详情页的 Logs/Inspect/Exec/Files/Stats 选项卡、Compose 项目、Images、搜索和下载镜像、底部状态栏,以及每项操作对应的 docker 命令,方便你在图形界面与终端之间切换。
- 第一个容器
用 nginx 运行第一个 Docker 容器:通过 docker run 下载镜像并启动容器,用浏览器打开网页,用 docker ps 查看容器、用 logs 查看日志、用 exec 进入容器,并通过 stop / start / rm 管理容器;还会演示如何在 Docker Desktop 中用图形界面完成相同操作。
- 镜像(Image)
了解 Docker 镜像的命名规则(registry、repository、tag、digest),通过实际输出学习 docker pull、images、tag、rmi、history、inspect、save / load,比较 slim、alpine 版本的大小,并了解 Docker 29 新的 docker images 输出格式与镜像分层。
- 容器生命周期
通过实际输出了解 Docker 容器的状态(created、running、paused、exited)、容器为何启动后立即退出、stop 与 kill 的区别、docker stop 为何要等 10 秒、退出代码的含义,以及 --restart 重启策略的实际行为。
- docker run 参数
docker run 常用参数一次整理:-d、-it、-p、-v、-e、--name、--rm、--network、--restart、--memory、--cpus、--user、--entrypoint、--read-only,每个参数都附上实际运行的命令与输出。
- 查看日志与调试
容器出问题时该怎么排查?通过实际输出学习用 docker logs 查看日志、用 docker exec 进入容器、用 docker inspect 查看配置、用 docker cp 复制文件,以及使用 docker stats、top、diff 查看状态,并排查容器启动即退出、端口占用、exec format error 等常见问题。
镜像与 Dockerfile
- Dockerfile 入门
通过一个 Node.js 示例学习编写 Dockerfile,并从实际的 docker build 输出理解 FROM、WORKDIR、COPY、RUN、CMD 各步骤的作用、构建缓存(CACHED)的运行方式,以及 .dockerignore 如何将构建内容从 30 MB 降至不到 1 KB。
- docker init 自动生成
用 docker init 回答几个问题,就能自动生成 Dockerfile、compose.yaml、.dockerignore 和 README.Docker.md。实测 Node.js 项目的完整交互过程,逐行解读生成的文件,用 docker build --check 找出模板中的两个警告,以及模板中 PostgreSQL 示例在 postgres:18 上会出错的地方。
- Dockerfile 指令大全
Dockerfile 常用指令的说明与实际运行结果:FROM、RUN、COPY、ADD、WORKDIR、ENV、ARG、EXPOSE、USER、VOLUME、HEALTHCHECK、CMD、ENTRYPOINT,并用小实验比较 CMD 与 ENTRYPOINT、COPY 与 ADD、ARG 与 ENV,以及 PID 1 与 docker stop 要等 10 秒的关系。
- 构建缓存与优化
通过实际 docker build 输出了解构建缓存的工作方式和失效规则,学习优化指令顺序、清理临时文件、使用 .dockerignore、精简基础镜像、挂载缓存及清理构建缓存。
- 多阶段构建
使用多阶段构建分离编译环境和运行环境:实测同一个 Go 程序,单阶段镜像为 1.43 GB,多阶段(distroless)仅 20.2 MB。附 Node.js 前端、后端、Java 多阶段 Dockerfile 示例,以及使用 --target 仅构建指定阶段的方法。
- 推送到 Docker Hub
学会使用 docker login、docker tag、docker push,将镜像上传到 Docker Hub、GitHub Container Registry(ghcr.io),并通过 registry:3 自建私有 Registry,实际演示推送与下载,附未登录时推送失败的真实错误信息和版本标签命名建议。
数据与网络
- Volume 与数据持久化
容器删除后数据就不见了?通过实际操作学习 Docker Volume 与 Bind Mount:删除容器后数据仍然保留、匿名 Volume 的来源、-v 与 --mount 遇到不存在路径时的差异,以及 Volume 的备份与恢复。
- 网络与容器互连
通过实际输出了解 Docker 网络:默认 bridge 为什么不能用名称连接、自定义网络的内置 DNS、应用连接数据库、多网络与网络别名、仅监听 127.0.0.1 时无法访问的原因,以及容器如何连接主机。
- 环境变量与 .env
用实际输出学习 -e、--env-file、Dockerfile 的 ENV,以及 Docker Compose 的 environment、env_file 和 .env 变量替换;实测引号处理差异、${VAR:?} 错误信息,以及如何用 secrets 安全传递密码。
Docker Compose
- Docker Compose 入门
Docker Compose 入门:用一个 compose.yaml 同时启动网站、PostgreSQL 与 Adminer,附 docker compose up、ps、logs、stop、down 的实际输出,以及 Adminer 登录(记得选择 PostgreSQL)、执行 SQL、down 与 down -v 对数据的影响等完整截图。
- compose.yaml 语法
Docker Compose 配置文件 compose.yaml 的完整语法:services、image、build、ports、volumes、environment、env_file、depends_on 与 healthcheck、restart、networks、profiles、compose.override.yaml 合并,以及使用 docker compose config 检查最终配置。
- Docker Compose 命令
Docker Compose 常用命令及实际输出:up、down、ps、ls、images、top、logs、exec、run、pull、config、port,并实测修改 compose.yaml 后 restart 不会应用新设置,必须使用 up -d 重建,涵盖日常开发与部署场景。
- 实战:搭建 WordPress
一步步用 Docker Compose 搭建 WordPress 7 + MySQL 8.4,包含实际运行输出和安装界面截图:健康检查、数据持久化、上传大小限制、phpMyAdmin、备份与恢复,以及更新镜像的方法。
实战示例
- Python 应用
把 Python 网站打包成 Docker 镜像,附实际构建与运行输出:Flask + gunicorn、开发模式热重新加载、FastAPI + uvicorn、Django 的 collectstatic 与 STATIC_ROOT 错误、用 uv 搭配 uv.lock 构建,以及镜像大小比较。
- Node.js 应用
Node.js 项目的 Dockerfile 写法与实测:npm ci、只装生产环境包、以 node 用户运行、docker stop 为什么要等 10 秒(PID 1 与 SIGTERM 实测)、TypeScript 多阶段构建、Next.js standalone 从 968MB 降到 295MB,以及开发时热重新加载与 compose watch。
- Nginx 与反向代理
使用 Docker 和 Nginx 搭建静态网站,配置 SPA、缓存和 gzip,检查语法并使用模板和环境变量,还可代理到后端容器。涵盖 proxy_pass 斜杠、文件挂载、502 和 Caddy 自动 HTTPS。
- MySQL
用 Docker 启动 MySQL 8.4 并附实际输出:环境变量、初始化 SQL、中文 utf8mb4、从容器内/主机/其他容器连接、localhost 与 127.0.0.1 的差别、Compose 健康检查的陷阱、mysqldump 备份还原,以及「改了密码变量却没生效」的原因。
- PostgreSQL
使用 Docker 启动 PostgreSQL 18,了解新版数据目录、Compose 配置、pg_isready 健康检查陷阱、psql 常用命令、备份还原,以及从 16 升级到 18。
- Redis
使用 Docker 启动 Redis 8,学习 redis-cli 基本操作、配置密码、RDB 与 AOF 持久化、内存淘汰策略,以及通过 Compose 搭配 Flask 和配置健康检查。
运维与进阶
- 清理磁盘空间
Docker 占用太多磁盘空间?用 docker system df 找出占用来源,再安全清理容器、镜像、Volume 和构建缓存。了解 Docker 29 的行为变化与日志上限设置。
- 安全最佳实践
Docker 容器安全入门与实测:以非 root 用户运行、固定镜像版本、了解 ARG/ENV/COPY 中的机密如何留在镜像层中、使用 BuildKit secret、限制端口与权限、扫描漏洞并修复。
- Rootless 与 Podman
为什么 Docker 相当于拥有 root 权限?实测 Rootless 模式如何将容器内的 root 映射为主机普通用户、无法读取主机的 /etc/shadow,并介绍无需常驻进程的 Podman:命令几乎与 Docker 相同、可直接构建 Dockerfile、默认采用 rootless,以及两者的差异和选择方法。
- 多平台镜像
了解 CPU 架构与多平台镜像,使用 docker buildx 和 Go 交叉编译一次构建 linux/amd64 与 linux/arm64,检查 manifest,并了解何时需要 QEMU。
- GitHub Actions 自动构建
推送代码或创建版本 tag 后,自动构建多平台 Docker 镜像并推送到 GitHub Container Registry(ghcr.io),再通过 SSH 自动部署到服务器。包含完整 workflow 文件、逐段说明、metadata-action 生成 tag 的规则、构建缓存、Docker Hub 的配置方式,以及使用 actionlint 验证 workflow。
- 部署到云服务器
从零开始将 Docker 应用部署到 Linux 云服务器,涵盖构建并推送镜像到 Registry、服务器使用 Compose 拉取并运行 Caddy(HTTPS)+ Node.js + PostgreSQL 18、版本更新与回滚、自动备份脚本,以及上线前检查清单。
- 底层原理
容器到底是什么?从 Docker 主机实际观察:容器只是一个由 namespace 隔离、由 cgroup 限制资源、以 overlayfs 作为文件系统的 Linux 进程。实测容器内外的 PID、用 lsns 查看 namespace、从 cgroup 读出 --memory 与 --cpus 的设置值、在 upperdir 找到容器写入的文件,以及 capabilities 与 seccomp。
- 常见错误消息大全
把 Docker 的错误消息粘贴来找答案:Cannot connect to the Docker daemon、permission denied docker.sock、port is already allocated、container name is already in use、exec format error、no such file or directory(CRLF)、executable file not found in $PATH、volume is in use、dependency failed to start、No space left on device、PowerShell 的 '<' operator is reserved 等 25 种错误,每个都附 Docker 29 实测输出、原因与解法。
- Docker 命令速查表
最常用的 Docker 命令一页整理:容器、镜像、构建、Volume、网络、Docker Compose、清理与系统信息,每条命令附简短说明,适合收藏以便随时查阅。
命令参考
- docker build
Docker build 完整参数说明(-t、-f、--build-arg、--target、--no-cache、--pull、--platform、--progress、--secret、--check、-q 等),附 Docker 29 实际运行示例:命名镜像、传入构建参数、指定 Dockerfile、仅构建到某个阶段、显示完整构建输出。
- docker exec
完整介绍 docker exec 参数(-it、-u、-w、-e、-d、--env-file、--privileged),并通过 Docker 29 示例讲解进入容器 Shell、指定用户和工作目录、传递环境变量、后台运行,以及容器停止时的报错。
- docker ps
docker ps 参数完整说明(-a、-q、-f/--filter、--format、-s、-n、-l、--no-trunc),附 Docker 29 实际运行示例:列出所有容器、仅显示 ID、按状态/名称/标签筛选、自定义输出字段、显示容器大小,以及一次删除所有已停止的容器。
- docker logs
docker logs 完整参数说明(-f、-n/--tail、-t、--since、--until、--details),附 Docker 29 实际运行示例:查看最后几行、添加时间、查看最近几秒、只看 stdout 或 stderr、搭配 grep 搜索,以及持续跟踪新日志。
- docker cp
docker cp 参数与用法:从容器复制文件或文件夹到主机、从主机复制到容器、复制整个文件夹的规则、文件不存在时的错误,以及用 docker cp 在 Windows 上备份和还原数据库。附 Docker 29 实际运行示例。
- docker inspect
了解 docker inspect 参数和 -f/--format 模板写法,附 Docker 29 实际运行示例:查询容器状态、IP 地址、环境变量、重启策略、镜像的 CMD 与 ENTRYPOINT、架构和大小、Volume 的实际路径、网络子网,以及 Docker 29 移除 .NetworkSettings.IPAddress 的变更。
- docker volume
全面介绍 docker volume 的 create、ls、inspect、rm、prune 子命令,并提供 Docker 29 实测示例:创建 Volume 并写入数据、查找悬空匿名 Volume、添加标签并按标签筛选,以及 prune 与 prune -a 的区别。
- docker network
完整说明 docker network 的 create、ls、inspect、connect、disconnect、rm、prune 子命令及其参数,并附 Docker 29 实际运行示例:自定义网络的名称解析、--network-alias 别名、指定子网、一个容器加入多个网络,以及删除使用中网络时的错误。
- docker compose up
完整介绍 docker compose up 的参数(-d、--build、--wait、--force-recreate、--no-deps、--scale、--remove-orphans、--abort-on-container-exit、--exit-code-from、--pull、-V、--watch 等),并提供 Docker Compose v5 实际运行示例。
- docker compose down
了解 docker compose down 的参数(-v/--volumes、--rmi local|all、--remove-orphans、-t/--timeout),并通过示例了解默认保留 Volume、down -v 删除数据,以及 down、stop、rm 的区别。
更新于 2026年10月14日