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 工业级容器运行时,管理容器生命周期
runc OCI 标准容器运行时实现,实际创建和运行容器

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
--cpus CPU 限制 --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 三种挂载方式对比

特性 Volumes Bind Mounts tmpfs
存储位置 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 只能接入一个网络
Network Docker 内部的虚拟子网,使网络内的参与者能够通讯

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):

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

11.2 Kubernetes

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

维度 Docker Compose Kubernetes
部署规模 单机/小集群 大规模集群
学习曲线 简单 陡峭
自动扩缩容 不支持 原生支持
滚动更新 有限支持 完善支持
服务发现 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:推荐资源

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐