目录

Docker 教程:从入门到掌握容器、镜像与 Compose

Docker 是一个将应用程序及其所需的一切(运行环境、库、配置)打包在一起的工具。打包好的内容称为镜像(image),运行起来就是容器(container)。同一个镜像在你的笔记本电脑、同事的电脑或云服务器上运行,结果都一样。

Docker 鲸鱼标志
Docker
开发者
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 Hubhub.docker.com搜索和下载镜像、推送自己的镜像
Docker Engine 源代码github.com/moby/mobyDocker Engine 的开源项目(Moby)
Docker CLI 源代码github.com/docker/clidocker 命令的源代码
Docker Compose 源代码github.com/docker/composedocker compose 的源代码和版本发布信息
版本信息Engine、Desktop各版本的新功能和变更

Docker 和鲸鱼标志是 Docker, Inc. 的商标。本教程是非官方学习资源,与 Docker, Inc. 无关。

本教程使用的版本

教程中的每条命令都在 2026 年 10 月实际运行过,黑色背景的终端区块都是真实的运行结果(仅删除了与教程无关的内容,例如下载进度)。你的输出中,容器 ID、时间、文件大小等数值会与教程不同,这是正常的。

软件本教程实测版本最低要求与说明
Docker Engine29.9.0建议使用 25 或更高版本。更旧的版本大多仍可运行这些命令,但部分输出格式不同
Docker Composev5.6.0使用 docker compose(插件版)。v2.20 或更高版本即可运行本教程的 compose.yaml;旧版 docker-compose(v1)已停止维护
Docker Buildxv0.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 相同。

系统要求

系统要求
Windows64 位版本的 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

示例使用的镜像版本

镜像版本用途
nginx1.30(stable)Web 服务器、反向代理
node24(LTS)Node.js 示例
python3.14Python 示例
postgres18PostgreSQL 数据库
mysql8.4(LTS)MySQL、WordPress
redis8Redis 缓存
wordpress7WordPress 实战
alpine / ubuntu3.23 / 26.04练习用的基础镜像
caddy2自动 HTTPS 反向代理、部署
golang + distroless/static-debian131.27多阶段构建、多平台镜像
registry3本地 Registry(推送练习)
phpmyadmin / adminerlatest数据库管理界面

示例中尽量使用固定版本(例如 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 写法。

示例代码可以下载吗?

每章开头的“示例代码”链接都会打开该章的完整项目。

基础入门

  1. Docker 是什么

    用通俗易懂的方式介绍 Docker 是什么、它解决的问题,以及镜像、容器、Registry 三个核心概念、Docker 的架构和容器与虚拟机的区别。

  2. 安装 Docker

    一步步在 Windows(WSL 2)、macOS 和 Linux(Ubuntu 26.04 / 24.04)上安装 Docker,检查虚拟化和 WSL 设置,并用 docker version 与 hello-world 验证安装。

  3. Docker Desktop 界面导览

    Docker Desktop 图形界面逐页介绍:侧边栏、Containers 列表和操作按钮、容器详情页的 Logs/Inspect/Exec/Files/Stats 选项卡、Compose 项目、Images、搜索和下载镜像、底部状态栏,以及每项操作对应的 docker 命令,方便你在图形界面与终端之间切换。

  4. 第一个容器

    用 nginx 运行第一个 Docker 容器:通过 docker run 下载镜像并启动容器,用浏览器打开网页,用 docker ps 查看容器、用 logs 查看日志、用 exec 进入容器,并通过 stop / start / rm 管理容器;还会演示如何在 Docker Desktop 中用图形界面完成相同操作。

  5. 镜像(Image)

    了解 Docker 镜像的命名规则(registry、repository、tag、digest),通过实际输出学习 docker pull、images、tag、rmi、history、inspect、save / load,比较 slim、alpine 版本的大小,并了解 Docker 29 新的 docker images 输出格式与镜像分层。

  6. 容器生命周期

    通过实际输出了解 Docker 容器的状态(created、running、paused、exited)、容器为何启动后立即退出、stop 与 kill 的区别、docker stop 为何要等 10 秒、退出代码的含义,以及 --restart 重启策略的实际行为。

  7. docker run 参数

    docker run 常用参数一次整理:-d、-it、-p、-v、-e、--name、--rm、--network、--restart、--memory、--cpus、--user、--entrypoint、--read-only,每个参数都附上实际运行的命令与输出。

  8. 查看日志与调试

    容器出问题时该怎么排查?通过实际输出学习用 docker logs 查看日志、用 docker exec 进入容器、用 docker inspect 查看配置、用 docker cp 复制文件,以及使用 docker stats、top、diff 查看状态,并排查容器启动即退出、端口占用、exec format error 等常见问题。

镜像与 Dockerfile

  1. Dockerfile 入门

    通过一个 Node.js 示例学习编写 Dockerfile,并从实际的 docker build 输出理解 FROM、WORKDIR、COPY、RUN、CMD 各步骤的作用、构建缓存(CACHED)的运行方式,以及 .dockerignore 如何将构建内容从 30 MB 降至不到 1 KB。

  2. docker init 自动生成

    用 docker init 回答几个问题,就能自动生成 Dockerfile、compose.yaml、.dockerignore 和 README.Docker.md。实测 Node.js 项目的完整交互过程,逐行解读生成的文件,用 docker build --check 找出模板中的两个警告,以及模板中 PostgreSQL 示例在 postgres:18 上会出错的地方。

  3. 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 秒的关系。

  4. 构建缓存与优化

    通过实际 docker build 输出了解构建缓存的工作方式和失效规则,学习优化指令顺序、清理临时文件、使用 .dockerignore、精简基础镜像、挂载缓存及清理构建缓存。

  5. 多阶段构建

    使用多阶段构建分离编译环境和运行环境:实测同一个 Go 程序,单阶段镜像为 1.43 GB,多阶段(distroless)仅 20.2 MB。附 Node.js 前端、后端、Java 多阶段 Dockerfile 示例,以及使用 --target 仅构建指定阶段的方法。

  6. 推送到 Docker Hub

    学会使用 docker login、docker tag、docker push,将镜像上传到 Docker Hub、GitHub Container Registry(ghcr.io),并通过 registry:3 自建私有 Registry,实际演示推送与下载,附未登录时推送失败的真实错误信息和版本标签命名建议。

数据与网络

  1. Volume 与数据持久化

    容器删除后数据就不见了?通过实际操作学习 Docker Volume 与 Bind Mount:删除容器后数据仍然保留、匿名 Volume 的来源、-v 与 --mount 遇到不存在路径时的差异,以及 Volume 的备份与恢复。

  2. 网络与容器互连

    通过实际输出了解 Docker 网络:默认 bridge 为什么不能用名称连接、自定义网络的内置 DNS、应用连接数据库、多网络与网络别名、仅监听 127.0.0.1 时无法访问的原因,以及容器如何连接主机。

  3. 环境变量与 .env

    用实际输出学习 -e、--env-file、Dockerfile 的 ENV,以及 Docker Compose 的 environment、env_file 和 .env 变量替换;实测引号处理差异、${VAR:?} 错误信息,以及如何用 secrets 安全传递密码。

Docker Compose

  1. Docker Compose 入门

    Docker Compose 入门:用一个 compose.yaml 同时启动网站、PostgreSQL 与 Adminer,附 docker compose up、ps、logs、stop、down 的实际输出,以及 Adminer 登录(记得选择 PostgreSQL)、执行 SQL、down 与 down -v 对数据的影响等完整截图。

  2. 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 检查最终配置。

  3. Docker Compose 命令

    Docker Compose 常用命令及实际输出:up、down、ps、ls、images、top、logs、exec、run、pull、config、port,并实测修改 compose.yaml 后 restart 不会应用新设置,必须使用 up -d 重建,涵盖日常开发与部署场景。

  4. 实战:搭建 WordPress

    一步步用 Docker Compose 搭建 WordPress 7 + MySQL 8.4,包含实际运行输出和安装界面截图:健康检查、数据持久化、上传大小限制、phpMyAdmin、备份与恢复,以及更新镜像的方法。

实战示例

  1. Python 应用

    把 Python 网站打包成 Docker 镜像,附实际构建与运行输出:Flask + gunicorn、开发模式热重新加载、FastAPI + uvicorn、Django 的 collectstatic 与 STATIC_ROOT 错误、用 uv 搭配 uv.lock 构建,以及镜像大小比较。

  2. Node.js 应用

    Node.js 项目的 Dockerfile 写法与实测:npm ci、只装生产环境包、以 node 用户运行、docker stop 为什么要等 10 秒(PID 1 与 SIGTERM 实测)、TypeScript 多阶段构建、Next.js standalone 从 968MB 降到 295MB,以及开发时热重新加载与 compose watch。

  3. Nginx 与反向代理

    使用 Docker 和 Nginx 搭建静态网站,配置 SPA、缓存和 gzip,检查语法并使用模板和环境变量,还可代理到后端容器。涵盖 proxy_pass 斜杠、文件挂载、502 和 Caddy 自动 HTTPS。

  4. MySQL

    用 Docker 启动 MySQL 8.4 并附实际输出:环境变量、初始化 SQL、中文 utf8mb4、从容器内/主机/其他容器连接、localhost 与 127.0.0.1 的差别、Compose 健康检查的陷阱、mysqldump 备份还原,以及「改了密码变量却没生效」的原因。

  5. PostgreSQL

    使用 Docker 启动 PostgreSQL 18,了解新版数据目录、Compose 配置、pg_isready 健康检查陷阱、psql 常用命令、备份还原,以及从 16 升级到 18。

  6. Redis

    使用 Docker 启动 Redis 8,学习 redis-cli 基本操作、配置密码、RDB 与 AOF 持久化、内存淘汰策略,以及通过 Compose 搭配 Flask 和配置健康检查。

运维与进阶

  1. 清理磁盘空间

    Docker 占用太多磁盘空间?用 docker system df 找出占用来源,再安全清理容器、镜像、Volume 和构建缓存。了解 Docker 29 的行为变化与日志上限设置。

  2. 安全最佳实践

    Docker 容器安全入门与实测:以非 root 用户运行、固定镜像版本、了解 ARG/ENV/COPY 中的机密如何留在镜像层中、使用 BuildKit secret、限制端口与权限、扫描漏洞并修复。

  3. Rootless 与 Podman

    为什么 Docker 相当于拥有 root 权限?实测 Rootless 模式如何将容器内的 root 映射为主机普通用户、无法读取主机的 /etc/shadow,并介绍无需常驻进程的 Podman:命令几乎与 Docker 相同、可直接构建 Dockerfile、默认采用 rootless,以及两者的差异和选择方法。

  4. 多平台镜像

    了解 CPU 架构与多平台镜像,使用 docker buildx 和 Go 交叉编译一次构建 linux/amd64 与 linux/arm64,检查 manifest,并了解何时需要 QEMU。

  5. GitHub Actions 自动构建

    推送代码或创建版本 tag 后,自动构建多平台 Docker 镜像并推送到 GitHub Container Registry(ghcr.io),再通过 SSH 自动部署到服务器。包含完整 workflow 文件、逐段说明、metadata-action 生成 tag 的规则、构建缓存、Docker Hub 的配置方式,以及使用 actionlint 验证 workflow。

  6. 部署到云服务器

    从零开始将 Docker 应用部署到 Linux 云服务器,涵盖构建并推送镜像到 Registry、服务器使用 Compose 拉取并运行 Caddy(HTTPS)+ Node.js + PostgreSQL 18、版本更新与回滚、自动备份脚本,以及上线前检查清单。

  7. 底层原理

    容器到底是什么?从 Docker 主机实际观察:容器只是一个由 namespace 隔离、由 cgroup 限制资源、以 overlayfs 作为文件系统的 Linux 进程。实测容器内外的 PID、用 lsns 查看 namespace、从 cgroup 读出 --memory 与 --cpus 的设置值、在 upperdir 找到容器写入的文件,以及 capabilities 与 seccomp。

  8. 常见错误消息大全

    把 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 实测输出、原因与解法。

  9. Docker 命令速查表

    最常用的 Docker 命令一页整理:容器、镜像、构建、Volume、网络、Docker Compose、清理与系统信息,每条命令附简短说明,适合收藏以便随时查阅。

命令参考

  1. docker build

    Docker build 完整参数说明(-t、-f、--build-arg、--target、--no-cache、--pull、--platform、--progress、--secret、--check、-q 等),附 Docker 29 实际运行示例:命名镜像、传入构建参数、指定 Dockerfile、仅构建到某个阶段、显示完整构建输出。

  2. docker exec

    完整介绍 docker exec 参数(-it、-u、-w、-e、-d、--env-file、--privileged),并通过 Docker 29 示例讲解进入容器 Shell、指定用户和工作目录、传递环境变量、后台运行,以及容器停止时的报错。

  3. docker ps

    docker ps 参数完整说明(-a、-q、-f/--filter、--format、-s、-n、-l、--no-trunc),附 Docker 29 实际运行示例:列出所有容器、仅显示 ID、按状态/名称/标签筛选、自定义输出字段、显示容器大小,以及一次删除所有已停止的容器。

  4. docker logs

    docker logs 完整参数说明(-f、-n/--tail、-t、--since、--until、--details),附 Docker 29 实际运行示例:查看最后几行、添加时间、查看最近几秒、只看 stdout 或 stderr、搭配 grep 搜索,以及持续跟踪新日志。

  5. docker cp

    docker cp 参数与用法:从容器复制文件或文件夹到主机、从主机复制到容器、复制整个文件夹的规则、文件不存在时的错误,以及用 docker cp 在 Windows 上备份和还原数据库。附 Docker 29 实际运行示例。

  6. docker inspect

    了解 docker inspect 参数和 -f/--format 模板写法,附 Docker 29 实际运行示例:查询容器状态、IP 地址、环境变量、重启策略、镜像的 CMD 与 ENTRYPOINT、架构和大小、Volume 的实际路径、网络子网,以及 Docker 29 移除 .NetworkSettings.IPAddress 的变更。

  7. docker volume

    全面介绍 docker volume 的 create、ls、inspect、rm、prune 子命令,并提供 Docker 29 实测示例:创建 Volume 并写入数据、查找悬空匿名 Volume、添加标签并按标签筛选,以及 prune 与 prune -a 的区别。

  8. docker network

    完整说明 docker network 的 create、ls、inspect、connect、disconnect、rm、prune 子命令及其参数,并附 Docker 29 实际运行示例:自定义网络的名称解析、--network-alias 别名、指定子网、一个容器加入多个网络,以及删除使用中网络时的错误。

  9. 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 实际运行示例。

  10. docker compose down

    了解 docker compose down 的参数(-v/--volumes、--rmi local|all、--remove-orphans、-t/--timeout),并通过示例了解默认保留 Volume、down -v 删除数据,以及 down、stop、rm 的区别。

更新于 2026年10月14日