1. Docker配置的核心原则与前置准备

在Linux环境下配置Docker时,首先要明确三个基本原则:隔离性、可重复性和安全性。我见过太多人直接 apt-get install docker-ce 就开始用,结果后期遇到各种权限冲突和资源泄漏问题。正确的做法应该像建造房子一样先打好地基。

1.1 系统环境检查清单

在安装Docker Engine前,建议逐项检查以下系统配置:

  • 内核版本: uname -r 显示版本应≥3.10(推荐4.x以上)
  • 存储驱动: ls -l /sys/class/misc/device-mapper 确认device-mapper存在
  • 用户组: getent group docker 检查docker组是否存在
  • 防火墙规则: iptables -L -n -v 查看现有规则避免冲突

重要提示:Ubuntu 18.04等使用snap默认安装的docker存在权限限制,建议彻底卸载后通过官方仓库安装

1.2 存储驱动选型策略

Docker支持overlay2、devicemapper、btrfs等多种存储驱动,实测对比:

  • overlay2:通用性最佳,适合SSD存储(EXT4/XFS文件系统)
  • devicemapper:需要额外配置thin pool,适合企业级存储阵列
  • btrfs:支持快照但稳定性要求高

配置示例(/etc/docker/daemon.json):

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

2. 生产环境关键配置详解

2.1 资源限制与调优

默认情况下Docker会无限制使用主机资源,必须通过cgroups进行约束:

内存限制(防止OOM):

docker run -it --memory="1g" --memory-swap="2g" alpine

CPU配额(基于CFS调度器):

docker run -it --cpus="1.5" --cpu-shares=512 nginx

经验值:数据库类容器建议设置内存硬限制,计算密集型容器需绑定CPU核心

2.2 网络模型选择

Docker网络模式对比表:

模式 隔离性 性能 适用场景
bridge 中 中 多容器通信
host 无 高 高性能单容器部署
overlay 高 低 Swarm集群跨主机通信
macvlan 高 高 需要真实MAC地址的场景

自定义网络实践:

docker network create \
  --driver=macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my_macvlan

3. 安全加固方案

3.1 最小权限原则实施

危险操作清单及替代方案:

  • 禁止使用 --privileged :改用 --cap-add 细粒度授权
  • 避免 -v /:/host :明确挂载具体目录
  • 不使用 --net=host :通过端口映射暴露服务

3.2 镜像安全扫描

集成Trivy进行漏洞检测:

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image nginx:latest

关键检查项:

  • CVE漏洞等级≥High的必须修复
  • 敏感信息泄露(如私钥、密码)
  • 不必要的setuid/setgid文件

4. 性能监控与排错

4.1 实时监控方案

使用cAdvisor+Prometheus构建监控体系:

# docker-compose.yml示例
services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
    devices:
      - /dev/kmsg:/dev/kmsg

关键监控指标:

  • 容器内存使用率(不含cache)
  • 块设备IOPS
  • 网络丢包率

4.2 常见问题排查指南

问题现象:容器频繁重启 排查步骤:

  1. docker inspect --format='{{.State.Error}}' <容器ID>
  2. journalctl -u docker.service -n 50
  3. 检查OOM状态: dmesg | grep -i oom

问题现象:网络延迟高 优化方案:

  • 禁用iptables的MASQUERADE规则
  • 调整net.core.somaxconn参数
  • 使用 --network-alias 替代传统DNS解析

5. 持续集成实践

5.1 分层构建优化

Dockerfile最佳实践示例:

# 第一阶段:构建环境
FROM golang:1.18 as builder
WORKDIR /app
COPY go.mod ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /server

# 第二阶段:运行环境
FROM alpine:latest
COPY --from=builder /server /server
USER nobody
CMD ["/server"]

构建缓存技巧:

  • 变动频繁的指令放后面
  • 使用 --cache-from 复用构建缓存
  • 多阶段构建减少最终镜像体积

5.2 集群部署方案

Swarm模式核心命令:

# 初始化Swarm集群
docker swarm init --advertise-addr 192.168.1.100

# 部署服务
docker service create \
  --name web \
  --publish 80:80 \
  --replicas 3 \
  nginx:alpine

滚动更新策略:

docker service update \
  --image nginx:1.21 \
  --update-parallelism 2 \
  --update-delay 10s \
  web

通过这些年处理过的生产环境案例,我强烈建议将Docker的配置纳入版本控制系统。每次变更时使用 docker diff 对比容器状态变化,配合 docker checkpoint 保存运行状态。对于关键业务容器,可以考虑使用 --restart=unless-stopped 策略而非默认的on-failure,这能避免主机重启后服务未自动恢复的情况。

更多推荐