本文是 2020 年《Docker 基础教程》的全面修订版。这些年 Docker 生态变化很大:Compose 已成为内置插件、BuildKit 成为默认构建器、国内镜像加速格局几经洗牌。原文章的内容已按 2026 年的现状重写。
1. Docker 简介
Docker 是基于 Go 语言的开源项目,通过对应用的封装、分发、部署、运行等生命周期的管理,实现**“一次封装,到处运行”**。
它解决的是运行环境和配置问题,是方便持续集成的容器虚拟化技术。
补充一点 2020 年文章里没有的背景:如今容器格式和运行时已经由 OCI(Open Container Initiative) 标准化,Docker 镜像本质上是 OCI 镜像,可以被 containerd、Podman、Kubernetes 等任何符合标准的运行时直接使用——这也意味着你学到的镜像知识不会绑定在某一家工具上。
1.1 与传统虚拟技术的差别
传统虚拟机是虚拟出硬件后,在其上运行一个完整的操作系统,再在该系统上运行应用。
容器内的应用直接运行于宿主内核,容器没有自己的内核,也没有硬件虚拟,因此比传统虚拟机更轻便:
| 维度 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 硬件级(hypervisor) | 进程级(namespace + cgroups) |
| 启动速度 | 分钟级 | 秒级甚至毫秒级 |
| 体积 | GB 级 | MB 级 |
| 性能损耗 | 有 | 接近原生 |
每个容器之间互相隔离,各有自己的文件系统,容器之间进程不会相互影响。
1.2 Docker 优势
- 轻量,秒级启动
- 标准的打包、部署、运行方案(OCI 标准)
- 镜像分层存储,支持增量分发
- 易于构建,适合自动化测试和持续集成
- 性能高,内存和 IO 开销低
- 生态成熟:Docker Hub 海量镜像、Compose 一键编排
1.3 Docker 基本组成
镜像(image):只读模板,用来创建容器。一个镜像可以创建很多容器,类似类和对象的关系。
容器(container):镜像的运行实例。可以启动、停止、删除,每个容器相互隔离。
仓库(repository):集中存放镜像的场所。最大的公开仓库是 Docker Hub;国内各大云厂商(阿里云、腾讯云等)也都提供镜像仓库服务。
2. Docker 安装
时代变了:CentOS 7 已于 2024 年停止维护(EOL),其自带 yum 源不可用。现在生产环境推荐 Ubuntu 22.04/24.04 LTS、Debian 12 或 Rocky/Alma Linux。以下以 Ubuntu 为例。
2.1 Ubuntu 安装步骤(官方推荐方式)
安装依赖并添加 Docker 官方 apt 仓库:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker Engine 与 Compose 插件:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
注意最后两个包:
docker-buildx-plugin和docker-compose-plugin——2026 年docker compose(带空格)已是内置子命令,不再需要单独安装docker-compose这个 Python 老工具。
启动并设置开机自启:
sudo systemctl enable --now docker
验证安装:
docker run hello-world
免 sudo 运行 docker(把当前用户加入 docker 组,重新登录生效):
sudo usermod -aG docker $USER
2.2 Windows / macOS
桌面端使用 Docker Desktop:
- Windows 需启用 WSL 2 后端(
wsl --install),体验远好于旧版的 Hyper-V 模式 - macOS 原生支持 Apple Silicon(arm64),拉取 amd64 镜像时加
--platform linux/amd64
2.3 国内镜像加速(2026 年现状)
这块变化最大。2024 年起大批公益镜像站关停,目前可用的方案:
- 阿里云个人加速器(推荐):登录 阿里云容器镜像服务,在"镜像加速器"页面获取你的专属地址
- 云厂商内网加速:阿里云 ECS、腾讯云 CVM 内网自带加速域名,无需配置
- 其他存活镜像站:可用性随时变化,建议配置多个做兜底
配置方式——编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://xxxxxx.mirror.aliyuncs.com",
"https://docker.m.daocloud.io"
]
}
重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证加速器是否生效:
docker info | grep -A 5 "Registry Mirrors"
💡 如果加速器全部失效,终极方案是自建:一台海外 VPS 上用
registry:2镜像搭一个代理缓存,或直接把常用镜像托管到阿里云个人仓库。
3. Docker 常用命令
3.1 帮助与信息
docker version # 版本
docker info # 系统信息(含镜像加速器、存储驱动等)
docker <命令> --help # 任意子命令的帮助
3.2 镜像命令
docker images # 列出本地镜像
docker search tomcat # 搜索镜像
docker pull tomcat:10-jdk21 # 下载镜像(建议显式指定 tag,别用 latest)
docker rmi tomcat:10-jdk21 # 删除镜像
docker image prune -a # 清理所有无用镜像(原 dangling 镜像清理的升级版)
2026 年的最佳实践:生产环境固定镜像 tag 和 digest(如
tomcat@sha256:...),避免latest在重建时悄悄升级导致事故。
3.3 容器命令
新建并启动容器(后台运行 + 端口映射 + 自动重启):
docker run -d --name web -p 8080:80 --restart unless-stopped nginx:1.27
常用 -run 参数对照:
| 参数 | 含义 |
|---|---|
-d | 后台运行 |
-p 宿主端口:容器端口 | 端口映射 |
--name xxx | 指定容器名(代替又长又难敲的容器 ID) |
--restart unless-stopped | 开机/异常自动重启 |
-v /data:/var/lib/mysql | 挂载数据卷 |
-e MYSQL_ROOT_PASSWORD=xxx | 注入环境变量 |
--network xxx | 加入指定网络 |
容器生命周期:
docker ps # 运行中的容器
docker ps -a # 所有容器(含已停止)
docker start web # 启动
docker restart web # 重启
docker stop web # 停止(发 SIGTERM,优雅退出)
docker kill web # 强制停止(SIGKILL)
docker rm web # 删除已停止的容器
docker rm -f web # 强制删除运行中的容器
docker container prune # 批量清理所有停止的容器
查看与调试:
docker logs -f --tail 100 web # 跟踪查看最后 100 行日志
docker top web # 容器内进程
docker inspect web # 容器完整配置(JSON)
docker stats # 实时资源占用(容器版 top)
进入容器(推荐 exec 而不是老教程里的 attach):
docker exec -it web /bin/bash # 在运行中的容器里开一个新终端
原 2020 年教程推荐的
docker attach会共享容器主进程的 stdin,exit会直接把容器停掉;docker exec是新开进程,退出不影响容器,日常调试一律用 exec。
3.4 Docker Compose(v2,必会)
2026 年 Compose 已是 Docker 内置插件,用空格调用,配置文件也统一为 compose.yaml:
docker compose up -d # 根据 compose.yaml 创建并启动全部服务
docker compose ps # 查看服务状态
docker compose logs -f # 跟踪日志
docker compose down # 停止并删除容器(-v 连数据卷一起删)
一个典型的 compose.yaml:
services:
web:
image: nginx:1.27
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
4. Docker 镜像与构建
镜像是一种轻量级、可执行的软件包,打包了代码、运行时、库、环境变量和配置文件。底层基于**联合文件系统(UnionFS)**的分层结构——多个容器可以共享同一份只读层,只有写入时才复制(写时复制)。
4.1 从 commit 到 Dockerfile
2020 年的教程教的是 docker commit 把容器固化成镜像,这个命令还在,但只适合临时保存现场,正规做法是写 Dockerfile:
# 多阶段构建:builder 阶段编译,runtime 阶段只带产物
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:1.27-alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
构建(BuildKit 已是默认构建器,无需额外配置):
docker build -t myapp:1.0 .
多阶段构建能把最终镜像从 1GB+ 压到几十 MB——编译工具链全部留在 builder 阶段,不进最终镜像。
4.2 构建最佳实践
.dockerignore必写:排除node_modules、.git等,否则构建上下文巨大且可能泄露敏感文件- 利用缓存:先
COPY package*.json再npm ci,最后才COPY . .,代码改动不会触发依赖重装 - 镜像瘦身:优先
alpine/slim基础镜像;合并RUN指令并清理缓存 - 跨平台构建:
docker buildx build --platform linux/amd64,linux/arm64一条命令构建多架构镜像(Apple Silicon 和云服务器架构不同时很有用) - 安全扫描:
docker scout cves myapp:1.0检查镜像漏洞
4.3 数据持久化
容器删了数据就没了,重要数据必须挂卷:
docker run -d -v mydata:/var/lib/mysql mysql:8.4 # 命名卷(推荐,docker 管理)
docker run -d -v /host/path:/data nginx:1.27 # 绑定挂载(开发调试用)
写在最后
六年过去,Docker 的核心概念(镜像、容器、仓库、分层)一点没变,变的是周边:安装更省心、Compose 更强大、构建更智能、国内加速更折腾。入门顺序建议:装好 → 跑通 hello-world → 用 compose 编排一个真实项目 → 写第一个 Dockerfile,一周足够上手。
原文发布于 2020-09-19,本文为 2026 年全面修订版。