Docker 完全指南:从入门到大师

一、Docker 基础概念与架构

1.1 什么是 Docker

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中,然后在任何支持 Docker 的环境中运行。Docker 从根本上解决了"在我的机器上能跑,生产环境却不行"的经典运维难题。

1.2 Docker 核心架构

Docker 采用经典的客户端-服务器(Client-Server)架构:

┌─────────────────┐     REST API      ┌─────────────────┐
│   Docker CLI    │ ─────────────────▶│  Docker Daemon  │
│   (客户端)       │                   │   (dockerd)     │
└─────────────────┘                   └────────┬────────┘
                                               │
                                               │ gRPC
                                               ▼
┌─────────────────┐     OCI Runtime    ┌─────────────────┐
│   Containerd    │ ◀─────────────────│     runc        │
│   (容器运行时)   │                   │   (OCI运行时)    │
└────────┬────────┘                   └────────┬────────┘
         │                                     │
         │                                     ▼
         │                            ┌─────────────────┐
         └───────────────────────────▶│    Container    │
                                      └─────────────────┘

核心组件说明:

组件作用
Docker CLI用户命令行交互工具
Docker Daemon (dockerd)后台守护进程,管理镜像、容器、网络和存储
Containerd工业级容器运行时,管理容器生命周期
runcOCI 标准容器运行时实现,实际创建和运行容器

1.3 核心概念辨析

镜像(Image)vs 容器(Container)

镜像是一个只读模板,包含了运行应用所需的文件系统、代码、依赖和配置。容器是镜像的运行实例——可以启动、停止、删除,每个容器都是相互隔离的。

容器 vs 虚拟机

对比维度容器虚拟机
启动速度秒级/毫秒级分钟级
资源占用MB 级别GB 级别
隔离级别进程级隔离硬件级隔离
操作系统共享宿主机内核每个 VM 有独立 OS

1.4 2026 年最新版本与生态动态

截至 2026 年 4 月,Docker Desktop 最新版本为 4.68.0,主要更新包括:

  • Gordon 持久化本地内存:可在会话之间记住用户偏好和上下文
  • SLSA v1 溯源支持:增强供应链安全,支持镜像构建出处验证
  • 全面稳定性提升:修复 ECI 死锁、卷备份竞态条件、容器启动网络可靠性等问题
  • Docker 29 存储驱动变更:传统 overlay2 存储驱动已移除,完全过渡到 containerd 镜像存储,继续使用 overlayfs 作为底层技术

Docker Enterprise 3.0 也已发布,深度集成 Kubernetes,提供 Docker Kubernetes Service(DKS)托管选项。

二、安装与环境配置

2.1 Linux 安装(以 Ubuntu 为例)

卸载旧版本:

sudo apt-get remove docker docker-engine docker.io containerd runc

使用官方脚本安装(快速方式):

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

手动安装(推荐用于生产环境):

# 1. 更新包索引并安装依赖
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

# 2. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 3. 添加 Docker 稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

配置非 root 用户权限:

# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 刷新组权限(或重新登录)
newgrp docker

Docker 守护进程以 root 用户运行,/var/run/docker.sock 默认仅允许 root 和 docker 组成员访问。

配置镜像加速器(国内用户):

编辑 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://noohub.ru"
  ]
}

重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

设置开机自启:

sudo systemctl enable docker
sudo systemctl enable containerd

2.2 macOS 安装

  1. 访问 Docker Desktop for Mac 下载 .dmg 文件
  2. 打开 .dmg 文件,将 Docker 拖入 Applications 文件夹
  3. 启动 Docker Desktop,根据提示完成安装
  4. 验证安装:docker --version

2.3 Windows 安装

  1. 下载 Docker Desktop for Windows
  2. 确保启用 WSL 2(Windows Subsystem for Linux 2)——推荐选择,而非 Hyper-V
  3. 运行安装程序,按照向导完成安装
  4. 重启系统后启动 Docker Desktop

2.4 安装验证

docker version        # 查看客户端和服务端版本
docker info           # 查看 Docker 系统信息
docker run hello-world # 运行测试容器

三、核心命令完全指南

3.1 镜像操作

命令作用示例
docker images列出本地镜像docker images
docker pull从仓库拉取镜像docker pull nginx:alpine
docker build从 Dockerfile 构建镜像docker build -t myapp:v1 .
docker tag给镜像打标签docker tag myapp:v1 myrepo/myapp:latest
docker push推送镜像到仓库docker push myrepo/myapp:latest
docker rmi删除镜像docker rmi <image_id>
docker save导出镜像为 tar 文件docker save -o myapp.tar myapp:v1
docker load从 tar 文件导入镜像docker load -i myapp.tar
docker history查看镜像构建历史docker history nginx:alpine
docker inspect查看镜像详细信息docker inspect nginx:alpine

3.2 容器操作

命令作用示例
docker run创建并启动容器docker run -d --name web -p 80:80 nginx
docker ps列出运行中的容器docker psdocker ps -a(全部)
docker stop停止运行中的容器docker stop web
docker start启动已停止的容器docker start web
docker restart重启容器docker restart web
docker rm删除容器docker rm webdocker rm -f web
docker exec在运行容器中执行命令docker exec -it web /bin/bash
docker logs查看容器日志docker logs -f web
docker cp容器与宿主机间复制文件docker cp file.txt web:/app/
docker stats实时查看容器资源使用docker stats
docker top查看容器内进程docker top web
docker inspect查看容器详细信息docker inspect web
docker diff查看容器文件系统变化docker diff web

3.3 常用 run 参数详解

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明示例
-d, --detach后台运行-d
--name指定容器名称--name myapp
-p, --publish端口映射(宿主机:容器)-p 8080:80
-v, --volume挂载数据卷-v /data:/app/data
--network指定网络--network mynet
-e, --env设置环境变量-e MYSQL_ROOT_PASSWORD=secret
--restart重启策略--restart always
--memory内存限制--memory 512m
--cpusCPU 限制--cpus 1.0
--rm容器退出后自动删除--rm
--read-only只读根文件系统--read-only
--health-cmd健康检查命令--health-cmd="curl -f http://localhost/health"

3.4 网络管理

命令作用示例
docker network ls列出所有网络docker network ls
docker network create创建自定义网络docker network create mynet
docker network connect连接容器到网络docker network connect mynet web
docker network disconnect断开容器与网络连接docker network disconnect mynet web
docker network inspect查看网络详情docker network inspect mynet
docker network rm删除网络docker network rm mynet
docker network prune清理未使用的网络docker network prune

3.5 卷(Volume)管理

命令作用示例
docker volume ls列出所有卷docker volume ls
docker volume create创建数据卷docker volume create mydata
docker volume inspect查看卷详情docker volume inspect mydata
docker volume rm删除卷docker volume rm mydata
docker volume prune清理未使用的卷docker volume prune

3.6 系统清理命令

命令作用说明
docker system df查看磁盘使用情况显示镜像、容器、卷占用空间
docker system prune清理未使用资源删除停止的容器、未使用的网络、悬空镜像
docker container prune删除停止的容器-f 强制删除
docker image prune删除悬空镜像-a 删除所有未使用镜像
docker volume prune删除未使用卷注意数据丢失风险

四、Dockerfile 完全指南

4.1 Dockerfile 指令详解

指令说明最佳实践
FROM指定基础镜像优先使用官方镜像,固定版本标签
WORKDIR设置工作目录使用绝对路径,后续指令相对路径生效
COPY复制文件到镜像优于 ADD,除非需要自动解压
ADD高级复制(支持 URL、自动解压)仅用于 tar 自动解压场景
RUN执行命令合并多条命令减少层数
ENV设置环境变量运行时可用 -e 覆盖
ARG构建参数仅在构建时可用,不会保存在镜像中
EXPOSE声明监听端口仅作文档用途,实际需用 -p 映射
CMD容器启动默认命令可被 docker run 参数覆盖
ENTRYPOINT容器入口点不易被覆盖,CMD 作为默认参数
VOLUME声明匿名卷生产环境推荐命名卷而非匿名卷
USER切换用户生产环境必须使用非 root 用户
HEALTHCHECK健康检查确保服务可用性
SHELL指定 Shell用于 RUN 指令
LABEL添加元数据便于镜像管理和版本追踪
ONBUILD延迟执行指令仅在子镜像构建时触发

4.2 多阶段构建(Multi-stage Build)

多阶段构建是镜像瘦身的核武器。以 Go 应用为例,传统单阶段构建会将 Go 源码、构建工具链、调试符号全部打包进最终镜像,导致镜像臃肿(可达 1.2GB)。多阶段构建可将最终镜像压缩至 10MB 以内,同时消除编译工具带来的攻击面。

示例:Go 应用多阶段构建

# ============ 阶段 1: 编译 ============
FROM golang:1.22-alpine AS builder

WORKDIR /app
# 先复制依赖文件,利用层缓存
COPY go.mod go.sum ./
RUN go mod download

# 复制源码并编译
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp .

# ============ 阶段 2: 运行 ============
FROM alpine:3.19

# 安装 CA 证书(HTTPS 请求必需)
RUN apk --no-cache add ca-certificates tzdata

# 创建非 root 用户
RUN adduser -D -u 1000 appuser

WORKDIR /app
COPY --from=builder /app/myapp /app/myapp

# 切换到非 root 用户
USER appuser

EXPOSE 8080
ENTRYPOINT ["/app/myapp"]

4.3 Java 应用多阶段构建示例

# ============ 构建阶段 ============
FROM maven:3.9-eclipse-temurin-17-alpine AS builder
WORKDIR /build

# 先复制 pom.xml,利用层缓存
COPY pom.xml .
RUN mvn dependency:go-offline

# 复制源码并构建
COPY src ./src
RUN mvn package -DskipTests

# ============ 运行阶段 ============
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app

RUN addgroup -S appgroup && adduser -S appuser -G appgroup

COPY --from=builder /build/target/*.jar app.jar
RUN chown -R appuser:appgroup /app

USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

传统方式镜像约 1.2GB(包含完整 JDK + Maven + 源码),采用多阶段构建后仅约 180MB(仅 JRE + 编译产物)。

4.4 Node.js 应用层缓存优化

FROM node:18-alpine

WORKDIR /app

# 优化层缓存顺序:把不常变动的放前面
COPY package.json package-lock.json ./
RUN npm ci --only=production   # 这一层会被缓存

# 复制应用源码(变动频繁)
COPY . .

USER node
EXPOSE 3000
CMD ["node", "server.js"]

4.5 Dockerfile 最佳实践总结

  1. 使用 .dockerignore 文件:排除 .gitnode_modules、日志文件等,避免泄露源码或临时文件
  2. 固定基础镜像版本:避免使用 latest 标签,使用具体版本号如 nginx:1.25.3-alpine
  3. 合并 RUN 指令减少层数
    RUN apt-get update && apt-get install -y \
        package1 package2 package3 \
        && rm -rf /var/lib/apt/lists/*
    
  4. 生产环境必须使用非 root 用户:在 Dockerfile 中创建并切换到非 root 用户
  5. 启用 BuildKitexport DOCKER_BUILDKIT=1 可获得并行构建和更好的缓存能力
  6. 使用外部缓存加速 CI/CD
    docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$TAG .
    

五、容器数据持久化

Docker 容器默认是无状态的,容器删除后内部数据会丢失。Docker 提供了三种数据持久化机制:数据卷(Volumes)、绑定挂载(Bind Mounts)和临时挂载(tmpfs)。

5.1 三种挂载方式对比

特性VolumesBind Mountstmpfs
存储位置Docker 管理的目录(/var/lib/docker/volumes/宿主机任意路径内存
生命周期独立于容器依赖宿主机文件系统容器停止即消失
推荐场景生产环境持久化开发环境代码同步临时文件、敏感信息
跨平台兼容✅ 完全兼容⚠️ 路径语义可能冲突✅ 兼容
Docker CLI 管理docker volume

5.2 数据卷(Volumes)使用

创建和使用数据卷:

# 创建卷
docker volume create myapp_data

# 查看卷详情
docker volume inspect myapp_data

# 使用卷运行容器
docker run -d \
  --name postgres \
  -v myapp_data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:16-alpine

# 查看卷内容(宿主机)
ls /var/lib/docker/volumes/myapp_data/_data

5.3 绑定挂载(Bind Mounts)使用

# 将宿主机当前目录挂载到容器的 /app
docker run -d \
  --name dev-app \
  -v $(pwd):/app \
  -w /app \
  node:18-alpine \
  npm run dev

5.4 tmpfs 挂载

# 敏感临时文件存储在内存中
docker run -d \
  --name secure-app \
  --tmpfs /tmp:rw,noexec,nosuid,size=128m \
  myapp:latest

5.5 数据备份与恢复

备份数据卷:

# 使用临时容器打包卷内容
docker run --rm \
  -v myapp_data:/data \
  -v $(pwd):/backup \
  alpine \
  tar czf /backup/myapp_data_$(date +%Y%m%d).tar.gz -C /data .

恢复数据卷:

docker run --rm \
  -v myapp_data:/data \
  -v $(pwd):/backup \
  alpine \
  tar xzf /backup/myapp_data_backup.tar.gz -C /data

六、Docker 网络深度解析

6.1 CNM 网络模型

Docker 网络架构采用 CNM(Container Network Model) 设计规范,由三个基础组件构成:

组件说明
Sandbox容器的虚拟网络栈,包含端口、套接字、IP 路由表、防火墙、DNS 配置等
Endpoint虚拟网络接口,类似于网络适配器,一个 Endpoint 只能接入一个网络
NetworkDocker 内部的虚拟子网,使网络内的参与者能够通讯

Libnetwork 是 CNM 的标准实现,由 Go 语言编写,实现了 CNM 中全部三个组件,并提供了本地服务发现、基于 Ingress 的容器负载均衡以及网络控制层功能。

6.2 五种网络模式

模式说明使用场景
bridge默认模式,容器通过 veth pair 连接到 docker0 网桥单机多容器通信
host容器与宿主机共享网络命名空间高性能网络场景
none容器无网络接口安全隔离、自定义网络配置
overlay跨主机容器通信Swarm 集群、多主机部署
macvlan/ipvlan容器直接使用物理网络接口需要固定 IP 或 VLAN 隔离

6.3 自定义网络与服务发现

Docker Engine 在用户定义网络中内置嵌入式 DNS 服务器(运行在 127.0.0.11:53),实现轻量级服务寻址:

# 创建自定义网络
docker network create --driver bridge mynet

# 在同一网络中运行容器
docker run -d --name app1 --network mynet --network-alias web nginx
docker run -d --name app2 --network mynet --network-alias web nginx

# app1 可通过容器名访问 app2
docker exec app1 ping app2

# 通过别名实现基础负载轮询
docker exec app1 curl http://web

DNS 轮询负载均衡:当多个容器使用相同服务名,DNS 查询返回所有 IP 列表,顺序随机(DNS round-robin)。Swarm 模式下更支持内置 IPVS 内核模块实现四层负载均衡。

6.4 端口映射详解

# 基本端口映射
docker run -p 8080:80 nginx          # 宿主机 8080 → 容器 80

# 指定 IP 地址
docker run -p 127.0.0.1:8080:80 nginx

# 随机端口映射
docker run -P nginx                   # 将所有 EXPOSE 端口映射到随机端口

# UDP 端口映射
docker run -p 53:53/udp coredns

七、Docker Compose 编排实战

7.1 Compose v2 概述

Docker Compose 在 2026 年已发生显著变化:version 字段已被移除,Compose v2 直接忽略该字段。现代 Compose 文件以 services 开头,结构更简洁。Compose 不再仅仅是本地开发工具,通过健康检查、资源限制、重启策略等配置,可在单服务器或小集群上可靠运行生产负载。

7.2 安装 Docker Compose

# 下载最新版本
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker compose version

7.3 基础 Compose 配置

# docker-compose.yml
name: myapp-stack

services:
  web:
    build: ./frontend
    ports:
      - "3000:3000"
    depends_on:
      api:
        condition: service_healthy
    environment:
      - NODE_ENV=production
      - API_URL=http://api:4000
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 10s
      timeout: 5s
      retries: 3

  api:
    build: ./backend
    ports:
      - "4000:4000"
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://redis:6379
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 1G
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
      interval: 15s
      timeout: 5s
      retries: 3

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 10s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      retries: 5

volumes:
  postgres_data:
  redis_data:

7.4 生产环境配置最佳实践

使用覆盖文件分离开发和生产配置:

# docker-compose.override.yml (开发环境,自动加载)
services:
  web:
    build:
      context: ./frontend
      target: development
    volumes:
      - ./frontend:/app          # 代码热更新
      - /app/node_modules
    command: npm run dev

---
# docker-compose.prod.yml (生产环境)
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    restart: always
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 256M

  web:
    restart: always
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

  api:
    restart: always
    deploy:
      replicas: 2                # 多副本部署

启动命令:

# 开发环境(自动加载 override)
docker compose up

# 生产环境(指定配置文件)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

7.5 Compose 常用命令

命令作用
docker compose up -d后台启动服务
docker compose down停止并删除容器
docker compose down -v同时删除卷
docker compose restart重启服务
docker compose logs -f实时查看日志
docker compose ps查看服务状态
docker compose exec <service> bash进入容器执行命令
docker compose build --no-cache重新构建镜像
docker compose config验证配置文件语法
docker compose top查看容器进程

7.6 2026 年 Compose 新特性

  • Profiles:单文件管理多环境配置
  • Watch 模式:开发环境代码同步,无需重新构建镜像(需要 v2.22.0+)
  • GPU 支持:机器学习工作负载的 GPU 透传(需要 v2.30.0+)
  • service_healthy 依赖条件:确保服务真正就绪后才启动依赖服务(需要 v2.20.0+)
  • Bake 集成:连接本地 Compose 工作流与生产镜像构建

八、容器安全加固

8.1 镜像安全(Build Time)

检查项安全建议实施方式
使用可信基础镜像优先官方镜像,避免 latest 标签FROM nginx:1.25.3-alpine
扫描镜像漏洞构建后自动扫描trivy image myapp:1.0
多阶段构建编译与运行分离,移除构建工具链镜像 < 100MB(简单应用)
禁用 root 用户创建非 root 用户USER 1000USER appuser
敏感信息不硬编码通过 secrets 或 env 文件注入检查 Dockerfile 是否含 PASSWORD=
使用 .dockerignore排除源码、日志、密钥等避免泄露临时文件
启用内容信任(DCT)只拉取签名镜像export DOCKER_CONTENT_TRUST=1

8.2 运行时安全(Run Time)

# 生产级安全容器启动命令
docker run -d \
  --name secure-app \
  --cap-drop=ALL \                    # 丢弃所有 Linux Capabilities
  --cap-add=NET_BIND_SERVICE \        # 仅添加必需能力
  --read-only \                        # 只读根文件系统
  --memory=512m \                      # 内存限制
  --cpus=1.0 \                         # CPU 限制
  --pids-limit=100 \                   # 限制进程数
  --security-opt=no-new-privileges \   # 禁止权限提升
  -v app_data:/data:rw \               # 可写数据目录单独挂载
  myapp:secure

关键安全配置说明:

配置项说明命令示例
限制 Capabilities默认丢弃所有能力,按需添加--cap-drop=ALL --cap-add=NET_BIND_SERVICE
禁用特权模式绝对禁止 --privileged不使用该参数
限制资源使用防止 DoS 攻击--memory=512m --cpus=1 --pids-limit=100
只读根文件系统容器内文件系统不可写(除挂载卷)--read-only

8.3 主机安全

  • 定期更新 Docker 版本以修复已知漏洞
  • 限制 /var/run/docker.sock 访问权限(仅 root 和 docker 组)
  • 启用 Docker 守护进程日志审计:dockerd --log-level=info
  • 使用 AppArmor 或 SELinux 进行强制访问控制
  • 配置守护进程安全选项:
    {
      "icc": false,           // 禁用容器间通信
      "userns-remap": "default", // 用户命名空间重映射
      "live-restore": true
    }
    

8.4 镜像安全扫描

# 使用 Trivy 扫描镜像漏洞
trivy image myapp:latest

# 在 CI 流程中集成扫描
trivy image --exit-code 1 --severity CRITICAL myapp:latest

企业级安全实践应包括 CI 集成 Trivy/Snyk、分级阻断、SBOM 生成,以及镜像签名、Harbor 代理缓存、准入控制等供应链安全措施。

九、生产环境最佳实践

9.1 健康检查

健康检查是生产环境最重要的配置之一。没有健康检查,Compose 无法判断服务是否真正就绪,depends_on 条件不会等待就绪状态,失败的服务也不会被重启。

# Dockerfile 中定义
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1
# Compose 中定义
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

9.2 资源限制

deploy:
  resources:
    limits:
      cpus: "1.0"        # 最多使用 1 核 CPU
      memory: 512M       # 最多使用 512MB 内存
    reservations:
      cpus: "0.25"       # 预留 0.25 核
      memory: 256M       # 预留 256MB 内存

9.3 重启策略

策略说明适用场景
no不自动重启(默认)一次性任务
always总是重启关键生产服务
on-failure仅非零退出码时重启可能偶发崩溃的服务
unless-stopped除非手动停止,否则重启长期运行服务

9.4 日志管理

services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

9.5 容器监控

  • 使用 docker stats 实时查看资源使用
  • 集成 Prometheus + Grafana 进行可视化监控
  • 使用 cAdvisor 收集容器指标
  • 监控关键指标:CPU 使用率、内存使用、网络 I/O、磁盘 I/O、容器重启次数、健康检查失败次数

十、底层技术原理

10.1 命名空间(Namespaces)

Docker 使用 Linux Namespaces 实现容器隔离:

Namespace作用
PID进程 ID 隔离
NET网络接口隔离
IPC进程间通信隔离
MNT挂载点隔离
UTS主机名和域名隔离
USER用户和组 ID 隔离

10.2 控制组(Cgroups)

Cgroups 用于限制、记录和隔离进程组使用的物理资源:

  • CPU:限制容器 CPU 使用份额
  • Memory:限制内存使用并触发 OOM
  • Blkio:限制块设备 I/O
  • Devices:控制设备访问权限
  • Pids:限制进程数量

10.3 联合文件系统(UnionFS)

Docker 镜像采用分层结构,每一层只存储与上一层的差异。支持的存储驱动:

驱动说明
overlay2当前推荐,性能最佳
aufs早期使用,现已淘汰
devicemapper适用于特定场景

从 Docker 29 开始,传统 overlay2 存储驱动已被移除,完全过渡到 containerd 镜像存储,继续使用 overlayfs 作为底层技术。

10.4 容器运行时

  • runc:OCI 标准实现,直接创建容器
  • containerd:管理容器生命周期的守护进程
  • cri-o:Kubernetes 专用的轻量级运行时

十一、替代方案与生态对比

11.1 Podman

Podman 是 Red Hat 开发的容器管理工具,无守护进程架构(daemonless):

特性DockerPodman
守护进程dockerd 后台运行无需守护进程
Rootless需要配置原生支持
兼容性OCI 标准100% Docker CLI 兼容
Pod 概念不支持原生支持 Kubernetes Pod

11.2 Kubernetes

Kubernetes 是生产级容器编排平台,适合大规模集群管理:

维度Docker ComposeKubernetes
部署规模单机/小集群大规模集群
学习曲线简单陡峭
自动扩缩容不支持原生支持
滚动更新有限支持完善支持
服务发现DNS 轮询完整服务网格

11.3 何时选择何种工具

  • Docker Compose:开发环境、小团队生产部署、单服务器应用
  • Docker Swarm:中小型集群、需要简单的编排能力
  • Kubernetes:大规模生产集群、需要高级编排能力

十二、未来趋势与发展

12.1 技术演进方向

  1. Wasm(WebAssembly)容器化:更轻量、更安全的运行时替代方案
  2. eBPF 深度集成:无侵入式可观测性和安全监控
  3. AI 辅助容器管理:Gordon 等 AI 助手的持续增强
  4. 供应链安全强化:SLSA 框架、SBOM、镜像签名成为标配
  5. Serverless 容器:如 AWS Fargate、Google Cloud Run

12.2 Docker 生态展望

Docker 已深度集成 Kubernetes,提供 Docker Kubernetes Service(DKS)托管选项,实现更一致的"开发到生产"体验。Docker Desktop 2026 年持续更新,SLSA v1 溯源支持增强了供应链安全,Gordon AI 助手增加了持久化本地内存能力。

附录 A:速查表

常用命令组合

# 批量停止所有容器
docker stop $(docker ps -aq)

# 批量删除所有容器
docker rm $(docker ps -aq)

# 批量删除所有镜像
docker rmi $(docker images -q)

# 清理所有未使用资源
docker system prune -a --volumes

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>

# 进入容器
docker exec -it <container> /bin/bash

故障排查命令

docker logs --tail 100 -f <container>   # 查看实时日志
docker inspect <container> | jq .       # 详细容器信息
docker stats --no-stream                # 资源使用快照
docker events                           # 实时事件监控
docker top <container>                  # 容器内进程

附录 B:推荐资源

更多推荐