外观
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-pluginUbuntu 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 versiontext
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.22Client 和 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-opts | cgroup 驱动用 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-restore | daemon 重启时容器不停 | 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' -A1text
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-worldtext
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 pstext
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdocker 组等于 root
docker 组成员可以挂载宿主机根目录并读写:
bash
docker run --rm -v /:/host alpine cat /host/etc/shadow所以生产机上不要随便把人加进 docker 组。多租户场景用 rootless Docker 或 Podman。
五、目录规划与磁盘
bash
df -h /data
docker system dftext
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 prunedocker 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 versiontext
Server Version: 27.3.1
Storage Driver: overlay2
Cgroup Driver: systemd
Docker Root Dir: /data/docker七、踩过的坑
| 现象 | 根因 | 处置 |
|---|---|---|
Cannot connect to the Docker daemon | daemon 没起,或当前用户不在 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 |