Docker 是现代 DevOps 流程的核心组件,提供轻量级的操作系统级虚拟化。本文档详细阐述 Docker 在主流 Linux 发行版上的生产级部署方法,包括架构解析、安装配置、性能调优、安全加固和故障排查等关键环节。
适用版本与环境说明:
- Docker Engine: 27.5.x(本文示例版本)
- Docker Compose: 2.x 及以上版本
- Containerd: 1.7.x 及以上版本
- 操作系统: Ubuntu 20.04+/Debian 11+/CentOS 7.9+/Rocky Linux 8+
- 内核版本: 建议 4.18+ 以支持 overlay2 存储驱动和完整网络特性
- 更新日期: 2024-12-19(建议每月检查 Docker 安全公告)
本文配置示例基于 Docker 27.5.1 LTS 版本。不同版本配置参数可能略有差异,请参考 Docker 官方文档 查看具体版本说明。
Docker 架构概述
Docker 架构概述
核心组件
- Docker Daemon (dockerd):守护进程,负责构建、运行和分发容器
- Docker Client (docker):CLI 客户端,与 Daemon 通信
- containerd:行业标准的容器运行时,管理容器生命周期
- runc:OCI 运行时规范实现,负责创建和运行容器
- Docker Registry:镜像仓库服务(如 Docker Hub、Harbor)
存储驱动选择
| 存储驱动 |
适用场景 |
性能 |
稳定性 |
| overlay2 |
推荐首选(内核 4.0+) |
优秀 |
生产就绪 |
| devicemapper |
RHEL/CentOS 旧版本 |
中等 |
稳定 |
| btrfs |
需要快照功能 |
优秀 |
较新 |
| zfs |
企业级存储管理 |
优秀 |
生产就绪 |
Ubuntu/Debian 系统安装
1. 更新系统并安装依赖
sudo apt update && sudo apt upgrade -y sudo apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release \ apt-transport-https \ software-properties-common
|
2. 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
3. 配置 Docker 软件源
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
4. 安装 Docker Engine(生产环境推荐版本)
sudo apt update sudo apt install -y \ docker-ce=5:27.5.1-1~ubuntu.* \ docker-ce-cli=5:27.5.1-1~ubuntu.* \ containerd.io=1.7.27-1 \ docker-buildx-plugin \ docker-compose-plugin
|
5. 启动并启用服务
sudo systemctl daemon-reload sudo systemctl enable --now docker sudo systemctl status docker
|
6. 验证安装
docker version docker info docker run --rm hello-world
|
CentOS/RHEL/Rocky Linux 系统安装
1. 更新系统
sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
2. 配置 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
3. 安装 Docker(指定版本)
yum list docker-ce --showduplicates | sort -r sudo yum install -y \ docker-ce-27.5.1 \ docker-ce-cli-27.5.1 \ containerd.io-1.7.27 \ docker-buildx-plugin \ docker-compose-plugin
|
4. 启动服务
sudo systemctl enable --now docker docker version
|
生产环境关键配置
daemon.json 配置详解
创建或编辑 /etc/docker/daemon.json:
{ "storage-driver": "overlay2", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "5" }, "live-restore": true, "max-concurrent-downloads": 10, "max-concurrent-uploads": 5, "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 } }, "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ], "insecure-registries": ["harbor.local.com"], "exec-opts": ["native.cgroupdriver=systemd"], "bip": "172.17.0.1/16", "fixed-cidr": "172.17.0.0/16", "mtu": 1500 }
|
配置说明:
| 配置项 |
说明 |
推荐值 |
原理 |
storage-driver |
存储驱动 |
overlay2(首选) |
overlay2 是现代 Linux 内核推荐的存储驱动,性能优异,支持多层镜像 |
log-driver |
日志驱动 |
json-file / journald |
json-file 便于调试,journald 节省磁盘但查询困难 |
log-opts.max-size |
单个日志文件最大值 |
100m |
避免单个容器日志占用过多磁盘 |
log-opts.max-file |
日志文件保留数量 |
5 |
保留最近 5 个日志文件,自动轮转 |
live-restore |
守护进程重启时保持容器运行 |
true |
Docker Daemon 重启不影响运行中的容器(生产必需) |
registry-mirrors |
镜像加速地址 |
根据地区选择 |
减少镜像拉取时间,国内推荐阿里云、USTC 镜像 |
exec-opts |
Cgroup 驱动 |
systemd(K8s 必需) |
Kubernetes 要求 systemd cgroup 驱动,避免 cgroupfs 冲突 |
bip |
Docker 网桥 IP |
172.17.0.1/16 |
默认网桥 IP,可自定义避免与宿主机网络冲突 |
max-concurrent-downloads |
最大并发下载数 |
10 |
加速镜像拉取,但会增加网络带宽占用 |
max-concurrent-uploads |
最大并发上传数 |
5 |
限制镜像上传并发,避免带宽饱和 |
关键参数深度解析:
1. storage-driver: overlay2
- 原理:overlay2 使用 Linux 内核的 OverlayFS,将多个目录层叠加为单一视图
- 优势:
- 镜像层共享,节省磁盘空间
- 写时复制(CoW)机制,容器写入性能高
- 支持内核 4.0+,生产就绪
- 验证方法:
docker info | grep "Storage Driver"
cat /proc/filesystems | grep overlay
|
2. live-restore: true
- 原理:容器运行时与 Docker Daemon 进程解耦
- 作用:Daemon 重启或升级时,容器继续运行,不丢失业务
- 适用场景:生产环境必需,避免 Docker 升级导致服务中断
- 验证方法:
3. exec-opts: native.cgroupdriver=systemd
- 原理:systemd 是现代 Linux 的初始化系统,统一管理 cgroup
- Kubernetes 要求:K8s 使用 systemd 管理 cgroup,Docker 必须匹配
- 冲突后果:如果使用 cgroupfs,可能导致 K8s 资源限制失效
- 验证方法:
docker info | grep "Cgroup Driver"
|
4. registry-mirrors(镜像加速)
- 国内推荐镜像源:
- 阿里云:
https://<your-id>.mirror.aliyuncs.com(需登录获取专属地址)
- USTC:
https://docker.mirrors.ustc.edu.cn
- 腾讯云:
https://mirror.ccs.tencentyun.com
- 验证方法:
time docker pull nginx:alpine
|
应用配置
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl status docker
docker info | grep -E "Storage Driver|Cgroup Driver|Logging Driver"
|
安全加固配置
1. 用户权限管理
sudo groupadd docker 2>/dev/null || true sudo usermod -aG docker $USER newgrp docker
|
2. 配置防火墙规则(UFW)
sudo ufw allow 2375/tcp sudo ufw allow 2376/tcp sudo ufw reload
|
3. 启用 TLS 加密通信(生产必需)
生成 TLS 证书:
sudo mkdir -p /etc/docker/tls
openssl genrsa -out /etc/docker/tls/ca-key.pem 4096
openssl req -new -x509 -days 365 -key /etc/docker/tls/ca-key.pem \ -sha256 -out /etc/docker/tls/ca.pem \ -subj "/C=CN/ST=Shanghai/L=Shanghai/O=DevOps/CN=Docker CA"
openssl genrsa -out /etc/docker/tls/server-key.pem 4096
openssl req -new -key /etc/docker/tls/server-key.pem \ -out /etc/docker/tls/server.csr \ -subj "/CN=$(hostname)"
openssl x509 -req -days 365 -sha256 \ -in /etc/docker/tls/server.csr \ -CA /etc/docker/tls/ca.pem \ -CAkey /etc/docker/tls/ca-key.pem \ -CAcreateserial \ -out /etc/docker/tls/server-cert.pem
sudo chmod 600 /etc/docker/tls/*.pem sudo chown root:root /etc/docker/tls/*.pem
|
4. systemd 服务加固
编辑 /etc/systemd/system/docker.service.d/override.conf:
[Service] ExecStart= ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/tls/ca.pem \ --tlscert=/etc/docker/tls/server-cert.pem \ --tlskey=/etc/docker/tls/server-key.pem \ -H fd:// -H tcp://0.0.0.0:2376 LimitNOFILE=65535 LimitNPROC=65535 TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s
|
应用配置:
sudo systemctl daemon-reload sudo systemctl restart docker
|
性能调优
1. 内核参数优化
编辑 /etc/sysctl.conf 或创建 /etc/sysctl.d/99-docker.conf:
net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 net.ipv4.conf.all.forwarding = 1
vm.swappiness = 10 vm.max_map_count = 262144
fs.file-max = 655350 fs.nr_open = 655350
net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 8192 net.core.netdev_max_backlog = 5000
|
应用配置:
2. 磁盘清理策略
设置定时清理任务:
cat << 'EOF' | sudo tee /etc/cron.daily/docker-cleanup
docker system prune -af --volumes --filter "until=168h" docker image prune -af --filter "dangling=true" docker container prune -f --filter "until=72h" EOF sudo chmod +x /etc/cron.daily/docker-cleanup
|
3. 监控配置
部署 cAdvisor + Prometheus:
docker run -d \ --name=cadvisor \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --restart=unless-stopped \ gcr.io/cadvisor/cadvisor:latest
|
故障排查指南
常见问题与解决方案
1. Docker 服务无法启动
sudo systemctl status docker -l
sudo journalctl -u docker.service -f
dockerd --validate
docker info | grep "Storage Driver"
sudo systemctl stop docker sudo rm -rf /var/lib/docker/* sudo systemctl start docker
|
2. 容器网络问题
docker network ls docker network inspect bridge
sudo systemctl stop docker sudo ip link delete docker0 sudo systemctl start docker
sudo iptables -t nat -L -n -v sudo iptables -t filter -L -n -v
|
3. 存储空间不足
docker system df -v
docker system prune -a --volumes
docker image prune -a
docker container prune
|
4. 权限问题
ls -la /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
sudo usermod -aG docker $USER newgrp docker
|
5. 镜像拉取失败
ping hub.docker.com
export HTTP_PROXY=http://proxy-server:port export HTTPS_PROXY=http://proxy-server:port
sudo mkdir -p /etc/systemd/system/docker.service.d cat <<EOF | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://proxy-server:port" Environment="HTTPS_PROXY=http://proxy-server:port" Environment="NO_PROXY=localhost,127.0.0.1" EOF sudo systemctl daemon-reload sudo systemctl restart docker
|
生产环境最佳实践
1. 容器资源限制
docker run -d --cpus="1.5" nginx:alpine
docker run -d --memory="512m" --memory-swap="1g" nginx:alpine
docker run -d \ --cpus="1.5" \ --memory="1g" \ --memory-swap="2g" \ --cpu-shares=512 \ --restart=unless-stopped \ nginx:alpine
|
2. 日志管理
docker run -d --log-driver=journald nginx:alpine
docker run -d \ --log-driver=json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ nginx:alpine
docker logs --tail=100 -f container_name
|
3. 健康检查配置
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1
|
services: app: image: nginx:alpine healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 3s retries: 3 start_period: 10s
|
4. 镜像管理最佳实践
FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production
FROM node:18-alpine WORKDIR /app COPY --from=builder /app/node_modules ./node_modules COPY . . EXPOSE 3000 CMD ["node", "server.js"]
docker scout cves nginx:alpine
docker history nginx:alpine
|
5. 容器编排建议
version: '3.8'
services: app: image: nginx:alpine restart: unless-stopped environment: - TZ=Asia/Shanghai ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./html:/usr/share/nginx/html:ro deploy: resources: limits: cpus: '1.0' memory: 512M reservations: cpus: '0.5' memory: 256M healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - frontend
networks: frontend: driver: bridge
|
版本管理策略
查看 Docker 版本信息
docker version
docker info
yum list docker-ce --showduplicates | sort -r
apt-cache madison docker-ce
|
版本升级流程
docker export -o container_backup.tar container_name docker save -o image_backup.tar image_name
sudo systemctl stop docker sudo systemctl stop docker.socket
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker docker version docker ps -a
|
参考资源
官方文档
- Docker 官方文档
- Docker Engine 配置参考
- Docker daemon.json 配置
- Docker 存储驱动详解
- Docker 网络配置
- Docker 安全最佳实践
- Docker Compose 官方文档
- containerd 官方文档
- containerd 配置指南
安全与加固
- CIS Docker Benchmark
- Docker 安全公告
- OWASP Docker 安全指南
- Docker Bench for Security
- Docker TLS 配置
性能优化
- Docker 性能调优指南
- Docker 存储驱动性能对比
- overlay2 性能分析
- Docker 日志配置
故障排查
- Docker 故障排查指南
- Docker Daemon 日志
- Docker 网络故障排查
- containerd 故障排查
社区与工具
- Docker GitHub 仓库
- Docker Hub
- Docker Desktop
- Docker Scout(镜像扫描)
- Docker 社区论坛
- Docker Slack
国内镜像源
- 阿里云镜像加速器(需登录获取专属地址)
- USTC 镜像站
- 腾讯云镜像加速
- 网易镜像加速
进阶阅读
- 《Docker 深入浅出》
- Dockerfile 最佳实践
- 多阶段构建指南
- 容器运行时安全