Docker 基础教程(2026 修订版)

2020 年 Docker 入门教程的全面修订:安装方式、Compose v2、BuildKit 构建、国内镜像加速现状与常用命令速查

本文是 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-plugindocker-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 年起大批公益镜像站关停,目前可用的方案:

  1. 阿里云个人加速器(推荐):登录 阿里云容器镜像服务,在"镜像加速器"页面获取你的专属地址
  2. 云厂商内网加速:阿里云 ECS、腾讯云 CVM 内网自带加速域名,无需配置
  3. 其他存活镜像站:可用性随时变化,建议配置多个做兜底

配置方式——编辑 /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*.jsonnpm 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 年全面修订版。