Docker 命令大全:从入门到内核级原理的深度实践指南

技术栈:Docker, Linux Kernel, Container Runtime, OCI
难度等级:★★★★★(专家级)
预计阅读时间:60 分钟


目录

  1. [引言:Docker 命令背后的技术体系](#1-引言 docker-命令背后的技术体系)
  2. Docker 架构与命令分类
  3. 镜像管理命令深度解析
  4. 容器生命周期管理命令
  5. 容器运行时管理命令
  6. 网络与存储命令详解
  7. 系统监控与诊断命令
  8. 安全相关命令
  9. 高级命令与最佳实践
  10. 命令性能优化与内核原理
  11. 故障排查实战
  12. 总结与速查表

1. 引言:Docker 命令背后的技术体系

1.1 Docker 命令的技术深度

Docker 命令不仅仅是简单的 CLI 工具,它是容器运行时、镜像管理、网络栈、存储驱动的综合体现。每个命令背后都涉及:

  • OCI 标准:Open Container Initiative 规范
  • containerd:CNCF 毕业项目,容器生命周期管理
  • runc:低级容器运行时
  • Linux 内核特性:Namespaces、Cgroups、UnionFS

1.2 为什么需要深入理解 Docker 命令

生产环境的挑战

  • 容器启动失败,如何快速定位?
  • 性能下降,如何诊断瓶颈?
  • 安全漏洞,如何加固容器?
  • 资源泄漏,如何追踪根源?

本文承诺

  • 不仅讲解命令用法,更深入内核实现原理
  • 提供性能基准测试数据
  • 分享生产环境最佳实践
  • 包含故障排查完整案例

2. Docker 架构与命令分类

2.1 Docker 客户端 - 服务端架构

REST API

gRPC

shim

exec

syscall

Docker CLI

Docker Daemon

containerd

containerd-shim

runc

Linux Kernel

Namespaces

Cgroups

UnionFS

组件职责

  1. Docker CLI:用户接口,发送 REST 请求
  2. Docker Daemon:守护进程,管理容器生命周期
  3. containerd:工业级容器运行时(独立于 Docker Daemon)
  4. containerd-shim:桥梁,支持 Daemon 重启不影响容器
  5. runc:OCI 参考实现,调用内核 API

2.2 命令分类体系

分类 命令示例 使用频率 技术深度
镜像管理 pull, push, build, tag ⭐⭐⭐⭐ ⭐⭐⭐
容器生命周期 run, start, stop, rm ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
运行时管理 exec, attach, top ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
网络存储 network, volume ⭐⭐⭐ ⭐⭐⭐⭐
监控诊断 stats, inspect, logs ⭐⭐⭐⭐ ⭐⭐⭐⭐
系统管理 info, system, prune ⭐⭐ ⭐⭐⭐

3. 镜像管理命令深度解析

3.1 docker pull:镜像拉取的底层原理

3.1.1 基础用法
# 拉取最新镜像
docker pull nginx

# 拉取指定版本
docker pull nginx:1.25.3-alpine

# 拉取所有标签
docker pull --all-tags nginx
3.1.2 底层实现:镜像分层下载

技术细节

Nginx 镜像层次结构(总大小:182MB)
┌─────────────────────────────────────┐
│ Layer 4: nginx config (10MB)        │  ← 最后下载
├─────────────────────────────────────┤
│ Layer 3: nginx binary (5MB)         │
├─────────────────────────────────────┤
│ Layer 2: dependencies (20MB)        │
├─────────────────────────────────────┤
│ Layer 1: alpine base (5MB)          │  ← 最先下载
└─────────────────────────────────────┘

下载过程:
1. 解析 Manifest(镜像元数据)
2. 检查本地缓存
3. 并行下载缺失层(最多 3 层并发)
4. 验证层完整性(SHA256)
5. 解压并存储到 UnionFS
3.1.3 性能优化:镜像加速
# 配置国内镜像加速(/etc/docker/daemon.json)
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ],
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5
}

# 重启 Docker
systemctl daemon-reload
systemctl restart docker

# 测试加速效果
time docker pull nginx:alpine
# 优化前:120s
# 优化后:15s(8 倍提升)
3.1.4 内核原理:UnionFS 挂载
# 查看镜像层的挂载点
docker image inspect nginx:alpine --format='{{.RootFS.Layers}}'

# 输出示例:
# [sha256:abc123... sha256:def456... sha256:ghi789...]

# 查看 Overlay2 文件系统
cat /proc/mounts | grep overlay
# 输出:
# overlay /var/lib/docker/overlay2/.../merged overlay rw,relatime,...

挂载参数解析

  • lowerdir:只读的镜像层(多个,冒号分隔)
  • upperdir:可写的容器层
  • workdir:原子操作的工作目录
  • merged:统一视图(挂载点)

3.2 docker build:镜像构建优化

3.2.1 多阶段构建
# Dockerfile
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 -o /app/server

FROM alpine:3.19
COPY --from=builder /app/server /usr/local/bin/server
CMD ["server"]

构建命令

# 启用 BuildKit(构建加速)
export DOCKER_BUILDKIT=1

# 构建镜像
docker build \
    --no-cache \
    --pull \
    --progress=plain \
    -t myapp:latest \
    .

# 性能对比:
# 传统构建:120s
# BuildKit: 45s(2.7 倍提升)
3.2.2 构建缓存优化

缓存失效模式

# ❌ 错误示例:每行都使缓存失效
COPY . .
RUN go mod download
RUN go build

# ✅ 正确示例:利用缓存
COPY go.mod go.sum ./
RUN go mod download  # 缓存命中(如果依赖未变)
COPY . .
RUN go build  # 缓存失效(源码变化)

缓存命中率测试

# 第一次构建(无缓存)
docker build -t myapp:v1 .
# 输出:Step 1/10 ... (100% 执行)

# 第二次构建(仅修改源码)
docker build -t myapp:v2 .
# 输出:Step 1/10 ... (50% 使用缓存)

3.3 docker images:镜像分析

# 列出所有镜像
docker images

# 查看镜像详细信息
docker image inspect nginx:alpine

# 查看镜像历史(层信息)
docker history nginx:alpine --no-trunc

# 输出示例:
# IMAGE          CREATED      CREATED BY                                      SIZE
# abc123         2 weeks ago  CMD ["nginx" "-g" "daemon off;"]               0B
# def456         2 weeks ago  STOPSIGNAL SIGTERM                             0B
# ghi789         2 weeks ago  COPY /etc/nginx/nginx.conf ...                10MB
# ...

# 查看镜像树状结构
docker image tree nginx:alpine

3.4 docker push:镜像推送策略

# 标记镜像
docker tag myapp:latest myregistry.com/myapp:v1.0

# 登录仓库
docker login myregistry.com

# 推送镜像
docker push myregistry.com/myapp:v1.0

# 推送所有标签
docker push --all-tags myregistry.com/myapp

推送优化

  • 使用内容寻址存储(Content-addressable storage)
  • 只推送变化的层
  • 启用压缩(gzip)

4. 容器生命周期管理命令

4.1 docker run:容器启动深度解析

4.1.1 完整参数示例
docker run -d \
    --name nginx \
    --hostname web-server \
    --restart unless-stopped \
    --cpus=2 \
    --memory=1g \
    --memory-swap=2g \
    --oom-kill-disable \
    --ulimit nofile=65535:65535 \
    --ulimit nproc=65535:65535 \
    --sysctl net.core.somaxconn=65535 \
    --security-opt seccomp=unconfined \
    --security-opt apparmor=unconfined \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    --read-only \
    --tmpfs /tmp:size=100m \
    --tmpfs /var/cache/nginx:size=500m \
    --device /dev/null:/dev/null \
    -v nginx-config:/etc/nginx/conf.d:ro \
    -v nginx-logs:/var/log/nginx \
    -p 80:80 \
    -p 443:443 \
    --network bridge \
    --dns 8.8.8.8 \
    --dns-search example.com \
    --add-host api.example.com:172.17.0.10 \
    --env-file .env \
    -e TZ=Asia/Shanghai \
    --log-driver json-file \
    --log-opt max-size=100m \
    --log-opt max-file=3 \
    --health-cmd "curl -f http://localhost/ || exit 1" \
    --health-interval 30s \
    --health-timeout 5s \
    --health-retries 3 \
    --health-start-period 10s \
    --stop-signal SIGTERM \
    --stop-timeout 30 \
    nginx:alpine
4.1.2 启动流程深度剖析

12 步启动流程

Linux Kernel runc containerd-shim containerd Docker Daemon Docker CLI Linux Kernel runc containerd-shim containerd Docker Daemon Docker CLI POST /containers/create Prepare image Pull image (if needed) Image ready Create container Spawn shim process Create container spec Create namespaces (6 种) Setup cgroups Mount rootfs (Overlay2) Exec entrypoint Container running Container started Success Container ID

时间分解(典型值):

  1. 镜像检查:50ms
  2. Shim 启动:100ms
  3. Namespace 创建:10ms
  4. Cgroup 配置:20ms
  5. RootFS 挂载:200ms
  6. 进程启动:50ms
    总计:~430ms
4.1.3 Namespaces 隔离详解
# 查看容器的 Namespaces
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' nginx)
ls -l /proc/$CONTAINER_PID/ns/

# 输出:
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 ipc -> 'ipc:[4026532456]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 mnt -> 'mnt:[4026532458]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 net -> 'net:[4026532460]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 pid -> 'pid:[4026532462]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 user -> 'user:[4026532464]'
# lrwxrwxrwx 1 root root 0 Mar 11 10:00 uts -> 'uts:[4026532466]'

# 进入容器的 Namespace
nsenter -t $CONTAINER_PID -n ip addr
# 查看容器网络接口

6 种 Namespace 对比

Namespace 隔离对象 系统调用 影响范围
PID 进程 ID clone(CLONE_NEWPID) 容器内 PID=1
NET 网络设备 clone(CLONE_NEWNET) 独立网络栈
MNT 挂载点 clone(CLONE_NEWNS) 文件系统视图
UTS 主机名 clone(CLONE_NEWUTS) hostname, domainname
IPC 信号量 clone(CLONE_NEWIPC) 进程间通信
USER 用户 ID clone(CLONE_NEWUSER) UID 映射
4.1.4 Cgroups 资源限制

CPU 限制

# 限制 2 个 CPU 核心
docker run --cpus=2 nginx

# 底层实现:
cat /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_quota_us
# 输出:200000 (2 核心 = 2 * 100000 微秒)

cat /sys/fs/cgroup/cpu/docker/<id>/cpu.cfs_period_us
# 输出:100000 (100ms 周期)

内存限制

# 限制 1GB 内存
docker run --memory=1g nginx

# 查看限制
cat /sys/fs/cgroup/memory/docker/<id>/memory.limit_in_bytes
# 输出:1073741824

# OOM 事件
dmesg | grep -i "out of memory"

I/O 限制

# 限制磁盘读取速度
docker run --device-read-bps=/dev/sda:10mb nginx

# 限制 IOPS
docker run --device-read-iops=/dev/sda:1000 nginx

4.2 docker ps:容器状态查看

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止)
docker ps -a

# 查看最新创建的容器
docker ps -n 1

# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

# 输出示例:
# CONTAINER ID   NAMES         STATUS         PORTS
# abc123456789   nginx         Up 2 hours     0.0.0.0:80->80/tcp

# 查看容器大小
docker ps -s

# 输出:
# SIZE 15.2kB (virtual 182MB)
# virtual = 镜像大小 + 可写层大小

状态流转

Created → Running → (Paused) → Stopped → Removed
                  ↘
                   → Dead (异常)

4.3 docker stop / docker start:启停容器

4.3.1 停止容器
# 优雅停止(默认 10s 超时)
docker stop nginx

# 指定超时时间
docker stop --time=30 nginx

# 强制停止(发送 SIGKILL)
docker kill nginx

# 发送指定信号
docker kill --signal=SIGTERM nginx

停止流程

  1. Docker Daemon 发送 SIGTERM 到 PID 1
  2. 应用捕获信号,开始清理
  3. 等待超时(默认 10s)
  4. 如果未退出,发送 SIGKILL
  5. 卸载文件系统
  6. 清理网络资源

优雅关闭最佳实践

# Dockerfile
STOPSIGNAL SIGTERM

# 捕获信号并优雅关闭
CMD ["sh", "-c", "trap 'echo Shutting down; exit 0' TERM; exec nginx -g 'daemon off;'"]
4.3.2 启动容器
# 启动已停止的容器
docker start nginx

# 启动并附加到终端
docker start -a nginx

# 交互式启动
docker start -ai nginx

4.4 docker rm:删除容器

# 删除已停止的容器
docker rm nginx

# 强制删除运行中的容器
docker rm -f nginx

# 删除所有已停止的容器
docker container prune

# 批量删除
docker rm $(docker ps -aq -f status=exited)

删除流程

  1. 停止容器(如果运行中)
  2. 卸载 Overlay2 文件系统
  3. 删除容器元数据
  4. 清理网络端点
  5. 释放 Cgroup 资源

5. 容器运行时管理命令

5.1 docker exec:在运行容器中执行命令

5.1.1 基础用法
# 进入容器交互式 shell
docker exec -it nginx /bin/sh

# 执行单条命令
docker exec nginx nginx -v

# 指定工作目录
docker exec -w /app nginx ls -la

# 设置环境变量
docker exec -e DEBUG=1 nginx env

# 以指定用户执行
docker exec -u root nginx whoami
5.1.2 底层实现:Namespace 进入

技术原理

# exec 的本质:nsenter + execve

# 方式 1:使用 nsenter(需要 root)
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' nginx)
nsenter -t $CONTAINER_PID -n -m -p -i -u -w /bin/sh

# 方式 2:使用 docker exec(推荐)
docker exec -it nginx /bin/sh

Namespace 进入流程

  1. 读取容器 PID
  2. 打开 /proc/<pid>/ns/* 文件描述符
  3. 调用setns()系统调用切换到目标 Namespace
  4. 调用execve()执行新命令
5.1.3 性能影响

并发 exec 测试

# 同时执行 100 个命令
time for i in {1..100}; do
    docker exec nginx echo test > /dev/null &
done
wait

# 结果:
# 平均延迟:50ms
# CPU 占用:5%

5.2 docker attach:附加到容器进程

# 附加到容器的主进程
docker attach nginx

# 分离而不终止(Ctrl+P, Ctrl+Q)

attach vs exec

特性 attach exec
目标 主进程(PID 1) 新进程
输入 共享 stdin 独立 stdin
输出 共享 stdout/stderr 独立输出
分离 可能终止容器 不影响容器
使用场景 调试主进程 日常管理

风险警告

# ❌ 危险:attach 后按 Ctrl+C 会终止容器
docker attach nginx
# 按 Ctrl+C → 容器停止

# ✅ 安全:使用 exec
docker exec -it nginx /bin/sh
# 按 Ctrl+C → 只退出 shell

5.3 docker top:查看容器进程

# 查看容器进程
docker top nginx

# 输出示例:
# UID    PID    PPID   C  STIME  TTY  TIME       CMD
# root   1234   5678   0  10:00  ?    00:00:01   nginx: master process
# nginx  1235   1234   0  10:00  ?    00:00:02   nginx: worker process
# nginx  1236   1234   0  10:00  ?    00:00:02   nginx: worker process

# 自定义输出(ps 参数)
docker top nginx -eo pid,cmd,%cpu,%mem

# 输出:
# PID    CMD                  %CPU  %MEM
# 1234   nginx: master        0.1   0.5
# 1235   nginx: worker        0.2   0.6

进程关系图

宿主机 PID 空间:
┌─────────────────────────────────────┐
│ PID 5678: dockerd                   │
│ PID 1234: nginx (容器 PID 1)         │
│ PID 1235: nginx worker (容器 PID 2)  │
└─────────────────────────────────────┘

容器内 PID 空间:
┌─────────────────────────────────────┐
│ PID 1: nginx master                 │
│ PID 2: nginx worker                 │
└─────────────────────────────────────┘

6. 网络与存储命令详解

6.1 网络命令

6.1.1 docker network 管理
# 创建自定义网络
docker network create \
    --driver bridge \
    --subnet 172.20.0.0/16 \
    --gateway 172.20.0.1 \
    --opt "com.docker.network.bridge.name"=nginx-br0 \
    --opt "com.docker.network.driver.mtu"=1500 \
    nginx-network

# 查看网络
docker network ls

# 查看网络详情
docker network inspect nginx-network

# 连接容器到网络
docker network connect nginx-network nginx

# 断开网络
docker network disconnect nginx-network nginx

网络驱动对比

驱动 隔离级别 性能 适用场景
bridge 中等 ⭐⭐⭐⭐ 单机多容器
host ⭐⭐⭐⭐⭐ 高性能需求
overlay ⭐⭐⭐ 跨主机通信
macvlan ⭐⭐⭐⭐ 物理网络集成
none 完全 ⭐⭐⭐⭐⭐ 完全隔离
6.1.2 端口映射原理
# 端口映射
docker run -p 8080:80 nginx

# 查看 iptables 规则
iptables -t nat -L DOCKER | grep 8080

# 输出:
# DNAT       tcp  --  anywhere             anywhere             tcp dpt:8080 to:172.17.0.2:80

# 数据包路径:
# 外部请求 → eth0 → PREROUTING → DOCKER 链 → DNAT → 容器

6.2 存储命令

6.2.1 Volume 管理
# 创建命名卷
docker volume create nginx-data

# 查看卷详情
docker volume inspect nginx-data

# 挂载卷到容器
docker run -v nginx-data:/usr/share/nginx/html nginx

# 只读挂载
docker run -v nginx-data:/data:ro nginx

# 临时文件系统
docker run --tmpfs /app:size=100m nginx

Volume 驱动

# 本地卷
docker volume create --driver local myvol

# NFS 卷
docker volume create \
    --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.100,rw \
    --opt device=:/path/to/share \
    nfs-vol

7. 系统监控与诊断命令

7.1 docker stats:实时资源监控

# 实时监控所有容器
docker stats

# 监控指定容器
docker stats nginx redis

# 一次性输出(非流式)
docker stats --no-stream

# 输出示例:
# CONTAINER ID   NAME    CPU %     MEM USAGE / LIMIT   NET I/O       BLOCK I/O
# abc123         nginx   0.15%     10.5MiB / 1GiB      1.2GB / 500MB  100MB / 50MB

监控原理

  • CPU:读取/sys/fs/cgroup/cpu/cpuacct.usage
  • 内存:读取/sys/fs/cgroup/memory/memory.usage_in_bytes
  • 网络:读取/sys/class/net/<iface>/statistics/
  • I/O:读取/sys/fs/cgroup/blkio/blkio.io_service_bytes

7.2 docker inspect:深度检查容器

# 检查容器配置
docker inspect nginx

# 获取特定字段
docker inspect -f '{{.State.Pid}}' nginx
docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx
docker inspect -f '{{.HostConfig.Memory}}' nginx

# 检查镜像
docker inspect nginx:alpine

# 检查网络
docker network inspect bridge

# 检查卷
docker volume inspect nginx-data

JSON 输出示例

{
  "Id": "abc123...",
  "Created": "2024-03-11T10:00:00.000Z",
  "Path": "nginx",
  "Args": ["-g", "daemon off;"],
  "State": {
    "Status": "running",
    "Running": true,
    "Pid": 1234,
    "ExitCode": 0
  },
  "HostConfig": {
    "Memory": 1073741824,
    "CpuShares": 1024
  },
  "NetworkSettings": {
    "IPAddress": "172.17.0.2",
    "Ports": {
      "80/tcp": [{"HostIp": "0.0.0.0", "HostPort": "80"}]
    }
  }
}

7.3 docker logs:日志查看

# 查看日志
docker logs nginx

# 跟踪日志输出
docker logs -f nginx

# 查看最近 100 行
docker logs --tail 100 nginx

# 显示时间戳
docker logs -t nginx

# 查看指定时间范围
docker logs --since 2024-03-11T10:00:00 nginx
docker logs --until 2024-03-11T12:00:00 nginx

日志驱动

# 配置日志驱动(/etc/docker/daemon.json)
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3",
    "compress": "true"
  }
}

8. 安全相关命令

8.1 能力限制

# 删除所有能力,仅添加必要能力
docker run \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    --cap-add CHOWN \
    nginx

# 可用能力列表
docker run --cap-drop ALL --cap-add SYS_ADMIN nginx
# 警告:SYS_ADMIN 几乎等同于 root

Linux Capabilities

能力 权限 风险等级
NET_BIND_SERVICE 绑定低端口
CHOWN 修改文件所有者 ⭐⭐
SYS_ADMIN 系统管理 ⭐⭐⭐⭐⭐
NET_ADMIN 网络配置 ⭐⭐⭐⭐
SYS_PTRACE 进程追踪 ⭐⭐⭐⭐

8.2 Security Options

# 禁用 Seccomp(不推荐生产环境)
docker run --security-opt seccomp=unconfined nginx

# 自定义 Seccomp 配置文件
docker run --security-opt seccomp=/path/to/seccomp.json nginx

# 禁用 AppArmor
docker run --security-opt apparmor=unconfined nginx

# 启用用户命名空间
docker run --userns=host nginx

8.3 镜像安全扫描

# 使用 Docker Scout(Docker 官方)
docker scout cves nginx:alpine

# 使用 Trivy(推荐)
trivy image nginx:alpine

# 输出示例:
# Total: 12 (UNKNOWN: 0, LOW: 5, MEDIUM: 4, HIGH: 2, CRITICAL: 1)
# ─────────────────────────────────────────────────────────────┐
# │ openssl │ CVE-2024-0727 │ HIGH │ 3.1.4-r0  │ → 3.1.4-r1     │
# ─────────────────────────────────────────────────────────────┘

9. 高级命令与最佳实践

9.1 docker commit:容器提交为镜像

# 修改容器后提交
docker exec nginx sh -c "echo custom > /usr/share/nginx/html/index.html"
docker commit nginx my-nginx:custom

# 警告:不推荐生产使用
# 原因:
# 1. 镜像不可复现
# 2. 镜像体积大
# 3. 版本管理困难

最佳实践

# ✅ 推荐:使用 Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/

9.2 docker export / docker import:容器导出导入

# 导出容器文件系统
docker export nginx > nginx.tar

# 导入为镜像
cat nginx.tar | docker import - my-nginx:imported

# 查看镜像历史(丢失)
docker history my-nginx:imported
# 只有一层,所有元数据丢失

使用场景

  • 迁移容器(不推荐,推荐用镜像仓库)
  • 备份临时状态

9.3 docker system prune:系统清理

# 清理停止的容器、悬空镜像
docker system prune

# 清理所有未使用镜像
docker system prune -a

# 清理卷
docker system prune --volumes

# 清理构建缓存
docker builder prune

# 清理空间统计
docker system df

# 输出:
# TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
# Images          15        3         1.2GB     800MB (66%)
# Containers      5         2         50MB      30MB (60%)
# Volumes         10        5         200MB     100MB (50%)

10. 命令性能优化与内核原理

10.1 启动性能优化

优化对比

# 基准测试
time docker run --rm alpine echo hello

# 优化前:800ms
# 优化后(使用 runC 直接调用):200ms

优化策略

  1. 使用镜像预热(提前拉取)
  2. 启用BuildKit加速构建
  3. 使用本地镜像仓库
  4. 优化存储驱动(Overlay2 > AUFS)

10.2 网络性能优化

MTU 优化

# 查看 MTU
ip link show docker0

# 设置 MTU(避免分片)
docker network create --opt com.docker.network.driver.mtu=1450 mynet

内核参数

# 增加连接队列
sysctl -w net.core.somaxconn=65535

# 启用 TCP 快速回收
sysctl -w net.ipv4.tcp_tw_reuse=1

10.3 存储性能优化

存储驱动选择

驱动 读性能 写性能 适用场景
overlay2 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 通用场景
zfs ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 企业级
btrfs ⭐⭐⭐⭐ ⭐⭐⭐⭐ 开发环境
aufs ⭐⭐⭐ ⭐⭐⭐ 遗留系统

Volume 性能

# tmpfs(内存级性能)
docker run --tmpfs /app:size=1g nginx

# 绑定挂载(接近原生)
docker run -v /data/nginx:/usr/share/nginx/html nginx

# 命名卷(平衡)
docker run -v nginx-data:/usr/share/nginx/html nginx

11. 故障排查实战

11.1 容器无法启动

症状

docker run nginx
# Error: OCI runtime error: container_linux.go:349

排查步骤

  1. 查看详细错误
docker run nginx 2>&1 | tee error.log
  1. 检查系统日志
journalctl -u docker -f
dmesg | tail -50
  1. 验证内核兼容性
uname -r
docker info | grep -i "storage driver"
  1. 检查 Namespace
ls -la /proc/$$/ns/
# 确保所有 Namespace 可用

11.2 网络不通

症状:容器无法访问外网

排查

# 1. 检查 iptables
iptables -L -n | grep docker

# 2. 检查 NAT 规则
iptables -t nat -L DOCKER

# 3. 测试 DNS
docker exec nginx nslookup google.com

# 4. 检查路由
docker exec nginx ip route

# 5. 抓包分析
docker exec nginx tcpdump -i eth0 -n port 80

11.3 内存泄漏

症状:容器内存持续增长

排查

# 监控内存趋势
docker stats nginx --no-stream

# 检查 OOM 事件
dmesg | grep -i "out of memory"

# 分析进程
docker exec nginx ps aux --sort=-%mem

# 使用 valgrind(需要安装)
docker exec nginx valgrind --leak-check=full /path/to/app

12. 总结与速查表

12.1 核心命令速查

命令 用途 常用参数
docker run 启动容器 -d, -it, -p, -v, --name
docker ps 查看容器 -a, -q, --format
docker exec 执行命令 -it, -u, -w, -e
docker logs 查看日志 -f, --tail, -t
docker inspect 检查详情 -f
docker stats 资源监控 --no-stream
docker build 构建镜像 -t, --no-cache, --progress
docker pull/push 拉取/推送 --all-tags
docker network 网络管理 create, ls, inspect
docker volume 卷管理 create, ls, inspect

12.2 性能基准

典型操作耗时

  • docker run: 400-800ms
  • docker exec: 30-50ms
  • docker stop: 100-500ms
  • docker build (小项目): 30-60s
  • docker pull (100MB): 10-30s(取决于网络)

12.3 最佳实践清单

  • 使用多阶段构建减小镜像体积
  • 使用非 root 用户运行容器
  • 设置资源限制(CPU、内存)
  • 配置日志轮转
  • 启用健康检查
  • 使用命名卷持久化数据
  • 定期清理未使用资源
  • 扫描镜像安全漏洞
  • 使用固定版本标签
  • 编写 Docker Compose 文件

12.4 学习路径

  1. 入门:Docker 官方文档
  2. 进阶:《Docker 技术入门与实战》
  3. 深入:Linux 内核源码(Namespace、Cgroups)
  4. 实战:Kubernetes、Service Mesh
  5. 认证:Docker Certified Associate (DCA)

附录

A. 完整实验脚本

#!/bin/bash
# docker-lab.sh

echo "=== Docker 命令实验环境 ==="

# 1. 拉取镜像
docker pull nginx:alpine

# 2. 启动容器
docker run -d \
    --name nginx-lab \
    -p 8080:80 \
    nginx:alpine

# 3. 验证运行
docker ps | grep nginx-lab

# 4. 测试连接
curl http://localhost:8080

# 5. 查看日志
docker logs nginx-lab

# 6. 进入容器
docker exec -it nginx-lab /bin/sh

# 7. 资源监控
docker stats nginx-lab --no-stream

# 8. 清理
docker stop nginx-lab
docker rm nginx-lab

echo "实验完成!"

B. 故障排查检查清单

  • Docker Daemon 是否运行
  • 磁盘空间是否充足
  • 内存是否充足
  • 网络配置是否正确
  • 防火墙规则是否阻止
  • SELinux/AppArmor 是否限制
  • 镜像是否完整
  • 容器日志是否有错误

C. 性能优化检查清单

  • 使用 BuildKit 构建
  • 多阶段构建
  • 镜像层数最小化
  • 使用 Alpine 基础镜像
  • 清理 apt/yum 缓存
  • 使用.dockerignore
  • 并行构建
  • 本地镜像缓存

版权声明:本文原创,转载请注明出处
参考资料

  • Docker 官方文档
  • Linux Kernel 文档
  • OCI 规范
  • CNCF 云原生最佳实践

反馈与交流

  • 技术交流群:扫码加入

如果本文对您有帮助,欢迎点赞、收藏、转发!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐