Ubuntu 下 Docker 常用配置

一、Ubuntu 官方标准安装

1. 卸载旧版本

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

2. 安装依赖

sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release

3. 添加 Docker 官方 GPG & 软件源

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

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 Engine

sudo apt update

# 安装最新版
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 固定版本(生产环境建议锁版本)
# sudo apt install -y docker-ce=5:27.0.3-1* ubuntu jammy

# 锁定版本防止意外升级
sudo apt-mark hold docker-ce docker-ce-cli containerd.io

5. 免 sudo 操作

sudo usermod -aG docker $USER
newgrp docker  # 临时生效,重新登录永久生效

6. 开机自启 & 状态

sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
docker --version

二、Docker 守护进程 daemon.json 配置

文件路径/etc/docker/daemon.json(默认不存在,需手动创建)

所有配置修改后必须执行

sudo systemctl daemon-reload
sudo systemctl restart docker

2.1 基础常用配置(个人/测试机)

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200m",
    "max-file": "3"
  },
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ],
  "default-runtime": "runc"
}

2.2 生产环境完整配置

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com"
  ],
  "insecure-registries": [
    "192.168.1.100:5000",
    "harbor.example.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5",
    "compress": "true"
  },
  "storage-driver": "overlay2",
  "data-root": "/data/docker",
  "default-address-pools": [
    {
      "base": "172.20.0.0/16",
      "size": 24
    }
  ],
  "live-restore": true,
  "no-new-privileges": true,
  "default-runtime": "runc",
  "runtimes": {
    "runc": {
      "path": "/usr/bin/runc"
    }
  },
  "ip-forward": true,
  "dns": ["223.5.5.5", "223.6.6.6"],
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 10,
  "oom-score-adjust": -500,
  "debug": false,
  "experimental": false
}

2.3 配置验证

# 验证 JSON 格式是否正确
sudo cat /etc/docker/daemon.json | python3 -m json.tool

# 验证 Docker 配置是否生效
docker info | grep -E "Root Dir|Logging Driver|Registry|Address Pools"

三、修改 Docker 默认存储目录

默认路径/var/lib/docker目标路径/data/docker

完整迁移步骤

# 1. 停止 Docker
sudo systemctl stop docker
sudo systemctl stop docker.socket

# 2. 创建新目录
sudo mkdir -p /data/docker

# 3. 迁移数据(rsync 保留权限)
sudo rsync -av /var/lib/docker/ /data/docker/

# 4. 备份旧目录(可选)
sudo mv /var/lib/docker /var/lib/docker.bak

# 5. 配置 daemon.json 添加 data-root
# "data-root": "/data/docker"

# 6. 启动验证
sudo systemctl daemon-reload
sudo systemctl start docker
docker info | grep "Docker Root Dir"

四、Systemd 服务优化

文件路径/lib/systemd/system/docker.service

生产环境 systemd 配置

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# 文件句柄/进程限制(高并发优化)
LimitNOFILE=65535
LimitNPROC=65535
LimitCORE=infinity

# OOM 优先级,避免 Docker 被优先杀死
OOMScoreAdjust=-500

ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0

# 故障自动重启
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

修改后生效

sudo systemctl daemon-reload
sudo systemctl restart docker

五、防火墙与 Docker 共存

5.1 使用 UFW 防火墙

# 查看 UFW 状态
sudo ufw status

# 允许 Docker 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp

# 如果 Docker 修改了 iptables,需重启 UFW
sudo ufw disable && sudo ufw enable

5.2 使用 firewalld

# 在 daemon.json 中禁用 Docker 修改 iptables
{
  "iptables": false
}

# 添加防火墙规则
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

5.3 Docker 与 UFW 冲突解决

如果 Docker 容器无法访问外部网络,可能是 UFW 默认策略问题:

# 检查 UFW 转发策略
sudo ufw status verbose

# 允许转发
sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
sudo ufw reload

六、容器运行时标准参数

6.1 生产环境 docker run 模板

docker run -d \
  --name app-demo \
  --restart always \
  --memory 2g \
  --memory-swap 2g \
  --cpus 1.5 \
  --ulimit nofile=65535:65535 \
  --ulimit nproc=65535:65535 \
  --no-new-privileges \
  --security-opt=no-new-privileges \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  -p 8080:80 \
  -v /data/volume:/container/path \
  -e TZ=Asia/Shanghai \
  --log-driver json-file \
  --log-opt max-size=50m \
  --log-opt max-file=3 \
  nginx:alpine

6.2 安全选项详解

参数 说明
--security-opt=no-new-privileges 禁止提权
--cap-drop ALL 删除所有特权能力
--cap-add NET_BIND_SERVICE 只添加绑定低端口的能力
--read-only 容器根文件系统只读
--tmpfs /tmp 临时目录挂载为 tmpfs

七、磁盘清理自动化

7.1 手动清理

# 清理停止的容器、悬空镜像、未使用的网络
docker system prune -f

# 清理所有未使用镜像(谨慎)
docker image prune -a -f

# 清理所有未使用数据卷(谨慎)
docker volume prune -f

# 查看磁盘占用
docker system df

7.2 定时清理脚本

#!/bin/bash
# /usr/local/bin/docker-cleanup.sh

echo "$(date): Starting Docker cleanup..."

# 清理日志(保留最近3天)
find /var/lib/docker/containers -name "*-json.log" -mtime +3 -exec truncate -s 0 {} \;

# 清理 Docker 资源
docker system prune -f
docker volume prune -f

echo "$(date): Docker cleanup completed."

7.3 Crontab 定时任务

# 每天凌晨2点执行清理
sudo crontab -e
0 2 * * * /usr/local/bin/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1

八、监控与告警

8.1 使用 docker stats 监控

# 实时查看所有容器资源使用
docker stats --no-stream

# 格式化输出
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

8.2 使用 Prometheus Node Exporter + cAdvisor

# docker-compose.monitor.yml
version: '3.8'
services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)'
    restart: unless-stopped

8.3 磁盘告警脚本

#!/bin/bash
# /usr/local/bin/docker-disk-alert.sh

USAGE=$(df -h /data | awk 'NR==2 {print $5}' | sed 's/%//')
THRESHOLD=80

if [ $USAGE -gt $THRESHOLD ]; then
    echo "WARNING: Docker data disk usage is ${USAGE}%, exceeding ${THRESHOLD}%"
    # 可配置发送告警到钉钉/企业微信/邮件
fi

九、Docker 安全加固清单

序号 安全措施 说明
1 非 root 运行容器 Dockerfile 中使用 USER 指令
2 禁用 --privileged 极度权限,仅特殊容器使用
3 no-new-privileges: true 禁止容器提权
4 --cap-drop ALL 删除所有特权能力,按需添加
5 镜像漏洞扫描 使用 Trivy/Clair 扫描镜像
6 私有仓库 HTTPS + 认证 Harbor 开启认证
7 日志轮转 防止日志占满磁盘
8 独立数据盘 不和系统盘混用
9 定期清理 清理无用镜像/容器
10 启用 live-restore 重启 Docker 不杀容器

十、日常运维命令汇总

10.1 信息查看

docker info                    # 全局配置
docker version                 # 版本
docker logs 容器名              # 查看日志
docker stats                   # 容器资源监控
docker system df               # 磁盘占用
docker system events           # 实时事件

10.2 清理命令

docker system prune -f         # 清理停止容器、悬空镜像
docker image prune -a -f       # 清理所有未使用镜像
docker volume prune -f         # 清理未使用数据卷
docker container prune -f      # 清理停止容器
docker network prune -f        # 清理未使用网络

10.3 配置验证

# 验证 daemon.json
docker info | grep -E "Root Dir|Logging Driver|Registry"

# 验证容器运行时
docker info | grep "Runtime"

# 验证存储驱动
docker info | grep "Storage Driver"

十一、故障排查速查表

问题 原因 解决方案
容器日志爆满 未配置日志轮转 配置 log-opts,重启容器生效
磁盘占用高 data-root 在系统盘 迁移到独立数据盘,定期 prune
私有仓库拉取失败 未配置 insecure-registries 添加 HTTP 仓库地址到该列表
容器 IP 和内网冲突 默认网段冲突 配置 default-address-pools
Docker 重启容器全挂 未开启 live-restore 设置 live-restore: true
容器被 OOM 杀死 内存限制不足 调整 --memory 和 OOMScoreAdjust
端口映射失败 端口被占用 netstat -tlnp \| grep 端口 查找占用
容器内 DNS 解析失败 DNS 配置错误 配置 dns 字段或使用宿主机 DNS
UFW 阻止容器外网访问 UFW 转发策略 DROP 修改 DEFAULT_FORWARD_POLICY 为 ACCEPT

十二、配置文件速查

配置文件 路径 作用
daemon.json /etc/docker/daemon.json Docker 守护进程主配置
docker.service /lib/systemd/system/docker.service Systemd 服务配置
环境变量 /etc/default/docker 旧版 Docker 环境配置
数据目录 /data/docker 生产环境数据存储目录
日志目录 /var/log/docker Docker 自身日志

十三、一句话总结

Ubuntu Docker 生产配置三板斧
1. daemon.json:配置镜像加速 + 日志轮转(100m×5份)+ 数据目录迁移(/data/docker)+ live-restore
2. systemd:限制文件句柄(65535)+ OOM 优先级(-500)+ 故障自动重启
3. 容器运行:内存/CPU 限制 + 安全降权(禁止提权)+ 重启策略(always)

生产环境遵守:独立数据盘、日志轮转、安全降权、定期清理、监控告警五大原则。