1. Docker 命令全景概览

作为过去五年容器化浪潮中的核心工具,Docker 命令行工具链已经发展出超过 60 个主命令和 200+ 子命令组合。但根据我在金融、电商等多个行业的容器化实施经验,实际生产环境中高频使用的核心指令集中在 30 个左右。这些命令构成了容器生命周期的完整闭环:

  • 环境管理 :docker system、docker info
  • 镜像操作 :docker build、docker pull/push
  • 容器控制 :docker run、docker exec
  • 网络配置 :docker network create
  • 存储管理 :docker volume ls
  • 集群编排 :docker stack deploy

生产环境特别提示:所有涉及删除的操作(rm/rmi/prune)建议结合 --filter 参数使用,我在某次误删生产镜像后养成了这个习惯

2. 开发环境必备指令精解

2.1 镜像构建的艺术

docker build -t myapp:1.0 --build-arg ENV=prod . 这个看似简单的命令包含多个关键点:

  1. 标签策略:建议采用语义化版本(如 1.0.2)而非 latest
  2. 构建参数:通过 --build-arg 传递编译时变量
  3. 上下文管理:末尾的 . 决定了 COPY 指令的基准路径

我曾遇到过一个典型问题:当 Dockerfile 和代码不在同一目录时,需要明确指定上下文路径:

docker build -f ./docker/Dockerfile -t myapp ../src

2.2 容器调试三板斧

  1. 交互式诊断

    docker run -it --rm alpine sh
    

    关键参数:

    • -i 保持 STDIN 打开
    • -t 分配伪终端
    • --rm 退出自动清理
  2. 日志追踪

    docker logs -f --tail 100 container_id
    

    生产环境常用组合:

    • -f 实时跟踪
    • --since 指定时间范围
    • --until 截止时间
  3. 性能分析

    docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
    

3. 生产环境高阶实践

3.1 资源限制黄金法则

内存限制的坑我踩过不止一次:

docker run -m 512m --memory-swap=1g redis

必须同时设置:

  • -m 物理内存上限
  • --memory-swap 交换分区大小
  • --oom-kill-disable 慎用(可能导致宿主机不稳定)

CPU 限制的三种方式:

# 方式1:份额限制
docker run --cpu-shares=1024

# 方式2:核数限制
docker run --cpus=1.5 

# 方式3:绑定核心
docker run --cpuset-cpus="0-2"

3.2 网络拓扑实战

创建自定义网络时推荐指定子网:

docker network create \
  --driver=bridge \
  --subnet=172.28.0.0/16 \
  --gateway=172.28.5.1 \
  my-net

跨容器通信的三种模式对比:

模式 连通性 性能 适用场景
默认bridge 需要--link 中等 简单测试环境
自定义网络 自动互通 生产微服务架构
host模式 直接暴露 最佳 高性能需求场景

4. 运维监控深度攻略

4.1 事件审计技巧

通过事件监控实现自动化响应:

docker events \
  --filter 'type=container' \
  --filter 'event=die' \
  --format 'Container {{.ID}} exited with status {{.Actor.Attributes.exitCode}}'

4.2 资源回收策略

推荐每日执行的空间回收脚本:

#!/bin/bash
# 清理已停止容器
docker container prune --filter "until=24h" -f

# 清理悬空镜像
docker image prune -a --filter "until=48h" -f

# 清理构建缓存
docker builder prune --filter "until=1h" -f

5. 安全加固关键步骤

5.1 最小权限实践

容器用户隔离的正确姿势:

# Dockerfile中
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser

# 运行时验证
docker run --user 1000:1000 myapp

5.2 敏感信息管理

使用 secrets 的最佳实践:

# 创建secret
echo "db_password" | docker secret create db_pass -

# 服务中使用
docker service create \
  --name mysql \
  --secret source=db_pass,target=mysql_root_password \
  mysql:5.7

6. 性能调优实战记录

6.1 存储驱动选型

根据我的压测数据(NVMe SSD环境):

驱动类型 写性能 镜像体积 稳定性
overlay2 98MB/s 最优 ★★★★★
aufs 85MB/s 较大 ★★★☆☆
devicemapper 72MB/s 最小 ★★☆☆☆

推荐配置:

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

6.2 日志管理方案

生产环境日志配置示例:

docker run \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

对于高吞吐场景,我推荐:

--log-driver=local --log-opt max-size=50m --log-opt compress=true

7. 疑难问题排查手册

7.1 容器启动失败分析

标准排查流程:

  1. 检查基础镜像:
    docker history --no-trunc image_name
    
  2. 分析启动日志:
    docker inspect --format='{{.LogPath}}' container_id
    
  3. 复现运行环境:
    docker run --rm -it --entrypoint=sh image_name
    

7.2 网络连通性诊断

经典排查工具链:

# 检查容器网络配置
docker exec -it container_id ip addr

# 测试DNS解析
docker run --rm busybox nslookup google.com

# 跨容器连通性测试
docker run --rm --network=my-net alpine ping target_container

8. 常用命令速查表

8.1 镜像管理

命令 作用描述
docker image ls --format json JSON格式输出镜像列表
docker image save -o backup.tar myapp:1.0 镜像导出
docker image load -i backup.tar 镜像导入

8.2 容器操作

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

# 按条件删除容器
docker rm -f $(docker ps -aq --filter "status=exited")

9. 进阶技巧合集

9.1 构建缓存优化

Dockerfile 最佳排序策略:

# 1. 基础环境
FROM alpine:3.14
RUN apk add --no-cache build-base

# 2. 依赖安装
COPY package.json .
RUN npm install

# 3. 源码变更
COPY . .

9.2 多阶段构建实战

典型Go应用构建:

# 构建阶段
FROM golang:1.18 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:3.14
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

10. 版本升级注意事项

从 Docker 20.10 升级到 23.0 的经验教训:

  1. 废弃命令迁移:

    # 旧版
    docker ps --format "{{.Image}}"
    
    # 新版
    docker ps --format "{{.Names}}"
    
  2. 新功能适配:

    # 检查容器健康状态
    docker inspect --format='{{.State.Health.Status}}' container_id
    
  3. 兼容性测试建议:

    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock docker:23.0 docker version
    

11. 企业级应用场景

11.1 CI/CD 流水线集成

典型 Jenkins 配置片段:

stage('Build') {
    steps {
        script {
            docker.build("myapp:${env.BUILD_NUMBER}")
        }
    }
}

stage('Test') {
    steps {
        sh 'docker run --rm myapp npm test'
    }
}

11.2 混合云部署方案

跨云镜像同步策略:

# AWS ECR 登录
aws ecr get-login-password | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com

# 镜像标签转换
docker tag myapp:1.0 123456789.dkr.ecr.us-east-1.amazonaws.com/myapp:1.0

# 推送镜像
docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myapp:1.0

12. 性能基准测试数据

基于 cAdvisor 的监控指标分析:

场景 内存开销 CPU利用率 网络延迟
空容器 2MB 0.1% 0.2ms
Nginx静态服务 25MB 3.2% 1.5ms
MySQL数据库 350MB 18.7% 3.8ms

采集命令:

docker run -d \
  --name=cadvisor \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --publish=8080:8080 \
  google/cadvisor

13. 容器安全扫描

使用 Trivy 进行漏洞检测:

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image myapp:1.0

典型修复流程:

  1. 识别高危CVE
  2. 查找受影响层
  3. 更新基础镜像
  4. 重新构建测试

14. 备份恢复策略

完整备份方案:

# 备份元数据
docker inspect $(docker ps -aq) > containers.json

# 备份卷数据
docker run --rm -v db_data:/volume -v $(pwd):/backup alpine \
  tar czf /backup/db_data_$(date +%Y%m%d).tar.gz -C /volume ./

15. 终端使用技巧

15.1 自动补全配置

# bash用户
sudo curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker

# zsh用户
mkdir -p ~/.zsh/completion
curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/zsh/_docker > ~/.zsh/completion/_docker
echo 'fpath=(~/.zsh/completion $fpath)' >> ~/.zshrc

15.2 交互式帮助系统

# 查看命令文档
docker help run

# 查看子命令选项
docker run --help

16. Windows 特别适配

16.1 路径转换问题

处理 Windows 风格路径:

# Dockerfile 特殊处理
RUN mkdir "C:\\app" && \
    copy "C:\\source\\*" "C:\\app\\"

16.2 性能优化方案

WSL2 后端配置:

{
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  }
}

17. 容器内部诊断

17.1 进程树分析

docker exec -it container_id sh -c "ps aux"

17.2 文件系统检查

docker diff container_id
docker export container_id > container_fs.tar

18. 镜像瘦身指南

18.1 多阶段构建优化

原始镜像 1.2GB → 优化后 85MB 的实践:

FROM node:16 as build
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

18.2 层合并技巧

RUN apt-get update && \
    apt-get install -y build-essential && \
    rm -rf /var/lib/apt/lists/*

19. 设备映射实战

GPU 加速配置:

docker run --gpus all nvidia/cuda:11.0-base nvidia-smi

USB 设备接入:

docker run --device=/dev/ttyUSB0 myapp

20. 环境变量管理

20.1 安全注入方式

# 通过文件注入
docker run --env-file .env myapp

# 动态生成
docker run -e "TIMESTAMP=$(date +%s)" myapp

20.2 继承机制

# Dockerfile
ENV APP_ENV=production

# 运行时覆盖
docker run -e APP_ENV=development myapp

21. 容器时区配置

全球部署方案:

FROM alpine
RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai

验证命令:

docker run --rm -e TZ=America/New_York alpine date

22. 健康检查策略

22.1 自定义检查

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/health || exit 1

22.2 外部监控集成

docker inspect --format='{{json .State.Health}}' container_id

23. 容器资源监控

23.1 实时数据采集

docker stats --all --format "table {{.Container}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

23.2 历史数据分析

docker run -d --name=telegraf \
  -v /var/run/docker.sock:/var/run/docker.sock \
  telegraf --config /etc/telegraf/telegraf.conf

24. 容器日志分析

24.1 ELK 集成方案

docker run -d --name logstash \
  -v ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
  logstash:7.14.0

24.2 实时日志过滤

docker logs -f container_id | grep -v "DEBUG"

25. 容器安全加固

25.1 只读文件系统

docker run --read-only -v /tmp:/tmp:rw alpine

25.2 能力控制

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

26. 容器网络诊断

26.1 连通性测试

docker run --rm --network container:target_container nicolaka/netshoot ping 8.8.8.8

26.2 流量捕获

docker run --rm --network container:target_container nicolaka/netshoot tcpdump -i eth0 -w capture.pcap

27. 容器存储优化

27.1 卷性能对比

驱动类型 随机读 顺序写 适用场景
local 120K IOPS 500MB/s 高性能需求
NFS 8K IOPS 120MB/s 共享存储
tmpfs 200K IOPS 2GB/s 临时数据

27.2 绑定挂载技巧

docker run -v $(pwd)/config:/etc/app:ro myapp

28. 容器编排基础

28.1 服务扩缩容

docker service scale web=5

28.2 滚动更新

docker service update --image myapp:2.0 --update-parallelism 2 --update-delay 10s web

29. 跨平台构建

29.1 多架构支持

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi-arch .

29.2 构建缓存复用

docker buildx build --cache-from type=registry,ref=myapp:cache --cache-to type=registry,ref=myapp:cache .

30. 容器化设计模式

30.1 Sidecar 模式

docker run -d --name app myapp
docker run -d --name log-agent --volumes-from app fluentd

30.2 Ambassador 模式

docker run -d --name proxy nginx
docker run -d --name app --link proxy myapp

更多推荐