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)生产环境遵守:独立数据盘、日志轮转、安全降权、定期清理、监控告警五大原则。