Skip to content

Docker 安装与 daemon 配置 ​

装 Docker 只有两步,但 daemon.json 里的六项不配,后面会反复遇到"日志撑爆磁盘""镜像拉不下来""容器重启后时间不对"。

场景 ​

新机器上线前的标准动作:装引擎 → 改数据目录 → 配镜像加速 → 配日志轮转 → 配 cgroup 驱动 → 验证。

一、安装 ​

Rocky / Alma / CentOS Stream ​

bash
dnf install -y dnf-utils
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Ubuntu 22.04 / 24.04 ​

bash
apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" \
  > /etc/apt/sources.list.d/docker.list

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

解释:

  • docker-compose-plugin 提供 docker compose(v2,子命令形式)。不要装老的 docker-compose(v1,独立二进制,已停止维护)。
  • docker-buildx-plugin 是多平台构建和高级缓存的前提。
  • CentOS 7 的 yum 版本太老,建议换 Rocky 8/9 或 Ubuntu。
bash
systemctl enable --now docker
docker version
docker compose version
text
Client: Docker Engine - Community
 Version:           27.3.1
 API version:       1.47
 ...
Server: Docker Engine - Community
 Engine:
  Version:          27.3.1
  ...
 containerd:
  Version:          1.7.22

Client 和 Server 都要有输出。只有 Client 说明 daemon 没起来:

bash
systemctl status docker --no-pager
journalctl -u docker -n 30 --no-pager

二、daemon.json ​

bash
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "data-root": "/data/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" },
  "registry-mirrors": ["https://<你的专属地址>.mirror.aliyuncs.com"],
  "insecure-registries": ["registry.internal:5000"],
  "live-restore": true,
  "default-ulimits": {
    "nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 }
  },
  "default-address-pools": [
    { "base": "10.201.0.0/16", "size": 24 }
  ]
}
EOF

逐项说明:

配置作用不配的后果
data-root镜像/容器/卷的存放目录默认 /var/lib/docker 在系统盘,几十个镜像就撑满 /
exec-optscgroup 驱动用 systemd和 kubelet 混用时驱动不一致,Pod 起不来
log-opts日志轮转json-file 默认无限增长,几个月能到几十 GB
registry-mirrors镜像加速国内直连 Docker Hub 经常超时
insecure-registries允许 HTTP 私有仓库内网 registry 推送报 http: server gave HTTP response to HTTPS client
live-restoredaemon 重启时容器不停systemctl restart docker 会把所有业务容器杀掉
default-ulimits文件句柄上限高并发服务报 Too many open files
default-address-pools自定义 bridge 网段默认 172.17.0.0/16 和公司 VPN 冲突,容器访问不了内网

改 data-root 前先想清楚

data-root 一改,原有镜像和容器全部"消失"(它们还在旧目录,但 Docker 不认)。正确做法:

bash
systemctl stop docker
rsync -a /var/lib/docker/ /data/docker/
# 改 daemon.json
systemctl start docker
docker images    # 确认都在

直接改而不迁移,等于所有容器重新拉一遍。

bash
systemctl daemon-reload
systemctl restart docker
docker info | grep -E 'Docker Root Dir|Storage Driver|Cgroup Driver|Registry Mirrors' -A1
text
 Storage Driver: overlay2
 Cgroup Driver: systemd
 Docker Root Dir: /data/docker
 Registry Mirrors:
  https://xxxx.mirror.aliyuncs.com/

三、镜像加速怎么找 ​

2024 年之后多数公共镜像站已停止服务,能用的基本是云厂商给每个账号分配的专属地址:

厂商位置
阿里云容器镜像服务控制台 → 镜像工具 → 镜像加速器
腾讯云容器镜像服务 → 镜像加速
华为云SWR → 镜像加速器

拿到形如 https://xxxx.mirror.aliyuncs.com 的地址后填进 registry-mirrors。

验证:

bash
docker pull hello-world
docker run --rm hello-world
text
Hello from Docker!
This message shows that your installation appears to be working correctly.

如果 pull 卡住超过 30 秒,先查 DNS:

bash
cat /etc/resolv.conf
curl -I https://registry-1.docker.io/v2/

四、非 root 使用 ​

bash
groupadd -f docker
usermod -aG docker youruser
newgrp docker        # 或者退出重新登录
docker ps
text
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

docker 组等于 root

docker 组成员可以挂载宿主机根目录并读写:

bash
docker run --rm -v /:/host alpine cat /host/etc/shadow

所以生产机上不要随便把人加进 docker 组。多租户场景用 rootless Docker 或 Podman。

五、目录规划与磁盘 ​

bash
df -h /data
docker system df
text
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdb        500G   86G  414G  18% /data

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          42        8         18.4GB    12.1GB (65%)
Containers      12        8         1.2GB     0B (0%)
Local Volumes   9         3         4.8GB     2.1GB (43%)
Build Cache     184       0         6.3GB     6.3GB

/data 单独挂盘是必须的。Docker 的写入放大很厉害(构建缓存、悬空镜像、日志),混在系统盘上会拖垮整机。

定期清理(先看清楚再删):

bash
# 悬空镜像(<none>:<none>)
docker image prune

# 停止的容器 + 悬空镜像 + 未使用的网络
docker system prune

# 再加上所有未使用的镜像和构建缓存(危险)
docker system prune -a

# 只清构建缓存
docker builder prune

docker system prune -a --volumes 会删数据卷

--volumes 会删除所有没有容器在使用的卷,里面的数据库文件一起没。这条命令在有任何本地数据的环境里都不该执行。

六、验证清单 ​

bash
docker info | grep -E 'Server Version|Storage Driver|Cgroup Driver|Docker Root Dir'
docker run --rm -d --name t1 nginx:alpine && sleep 1 && curl -s localhost:80 | head -1 || echo "端口冲突,正常"
docker run --rm alpine sh -c 'echo "容器内可用"; nproc; free -m | head -2'
docker compose version
text
 Server Version: 27.3.1
 Storage Driver: overlay2
 Cgroup Driver: systemd
 Docker Root Dir: /data/docker

七、踩过的坑 ​

现象根因处置
Cannot connect to the Docker daemondaemon 没起,或当前用户不在 docker 组systemctl start docker,newgrp docker
装完磁盘迅速变满data-root 在系统盘 + 日志无轮转迁 data-root,配 log-opts
pull 一直超时镜像加速没配 / DNS 有问题查 docker info 的 Registry Mirrors
重启 docker 后业务全断没开 live-restore加上,且只在 daemon 重启时有效
容器时间不对容器共享宿主机时钟,宿主机没同步timedatectl set-ntp true
容器访问不了内网172.17 和公司网段冲突配 default-address-pools
permission denied 读写挂载目录容器内 UID 与宿主机文件属主不一致见 数据与卷
cgroup 驱动不一致告警与 kubelet 不匹配exec-opts: native.cgroupdriver=systemd