架构、安装与守护进程¶
Docker Engine 采用客户端/服务端架构。docker 命令只是客户端,真正创建网络、镜像、容器和卷的是 dockerd;容器生命周期再由 containerd 和 OCI Runtime 配合完成。
docker CLI / Compose
→ Unix Socket /var/run/docker.sock
→ dockerd
├─ image / network / volume
└─ containerd → OCI runtime → Linux namespaces/cgroups
容器不是轻量虚拟机。它与宿主机共享内核,依靠 Namespace 隔离进程、网络、挂载等视图,依靠 cgroup 控制和统计 CPU、内存、PID、I/O。镜像提供只读文件层,容器在其上增加可写层。
安装原则¶
生产服务器使用 Docker 官方针对发行版的软件仓库和受支持版本,避免长期依赖方便脚本。安装前确认:
- Linux 发行版、内核、CPU 架构和 cgroup v2 支持。
- 防火墙与转发策略,避免 Docker 规则绕过预期边界。
/var/lib/docker或 containerd 数据目录的独立容量、文件系统和备份边界。- 企业镜像仓库、代理、DNS、CA 和时间同步。
- 升级窗口、旧版本兼容和回滚方案。
具体软件包命令随 Ubuntu、Debian、RHEL 等发行版和版本变化,应按官方安装文档执行,不把网上旧命令长期复制使用。
安装后验证¶
docker version
docker info
systemctl status docker containerd
systemctl is-enabled docker containerd
journalctl -u docker --since today
docker run --rm hello-world
docker version 同时显示 Client 和 Server 才表示客户端已连到守护进程。docker info 重点检查存储驱动、cgroup、日志驱动、Registry、Security Options、CPU/内存和警告。
将用户加入 docker 组几乎等同授予宿主机 root 能力,因为用户可挂载主机根目录或控制特权容器。需要非 root 管理时评估 Rootless 模式,而不是把大量普通用户加入该组。
daemon.json¶
Linux 常用配置文件为 /etc/docker/daemon.json:
修改前验证 JSON,并确认配置项没有同时写在 systemd 启动参数中,否则 dockerd 可能因重复参数无法启动。
sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl reload docker
sudo systemctl status docker
不是所有配置都支持 reload,生产变更前应查对应版本文档。重启 dockerd 是否影响容器取决于配置和现场状态,不能把 live-restore 当成升级与高可用方案。
数据目录与磁盘¶
docker info --format '{{.DockerRootDir}}'
docker info | grep -E 'Storage Driver|Docker Root Dir|containerd'
docker system df -v
df -hT
df -ih
镜像层、容器可写层、Volume、构建缓存和日志都会占用宿主机磁盘。生产服务器常把 Docker 数据放在独立的 /data 分区,避免 /var/lib/docker 持续增长撑满根分区。
使用 data-root¶
/etc/docker/daemon.json:
data-root 应指向 Docker 独占的本地目录,不要让两个 daemon 共用同一目录,也不建议直接放在 NFS 等共享文件系统。
已运行主机的迁移步骤¶
迁移会停止本机全部容器,先安排维护窗口并确认数据库/Volume 备份。
# 1. 记录现状和数据占用
docker info
docker ps -a
docker system df -v
sudo du -sh /var/lib/docker
df -hT /data
# 2. 停止 Docker,防止复制期间继续写入
sudo systemctl stop docker docker.socket containerd
# 3. 创建目标目录并保留权限、硬链接和扩展属性复制
sudo mkdir -p /data/docker
sudo rsync -aHAXx --numeric-ids /var/lib/docker/ /data/docker/
# 4. 写入或合并 data-root 后验证 JSON
sudo dockerd --validate --config-file=/etc/docker/daemon.json
# 5. 启动并核对
sudo systemctl start containerd docker
docker info --format '{{.DockerRootDir}}'
docker ps -a
docker image ls
docker volume ls
不要用新的空目录直接启动后再判断“镜像丢了”。如果没有复制旧数据,Docker 会把 /data/docker 当作全新环境。启动后应验证容器、镜像、Volume、端口、日志和业务数据;原 /var/lib/docker 暂时保留作为回退证据,确认备份和业务恢复无误后再安排清理。
如果启动失败,先停止 Docker,恢复原 daemon.json,再启动并确认仍使用 /var/lib/docker。不要在新旧目录间反复运行两个 daemon。
Docker Engine 29+ 的例外¶
Docker 官方说明:Engine 29.0 起,全新安装默认可能使用 containerd image store。此时:
data-root 不会移动 containerd image store 中的镜像和 Snapshot。若现场确实使用该模式,还需要按当前版本文档在 /etc/containerd/config.toml 为 containerd 设置独立目录,例如:
不要看到版本号就同时修改两处。升级而来的经典 overlay2 安装通常仍把数据放在 /var/lib/docker;先用 docker info、目录占用和当前 containerd 配置确认实际存储模式,再制定停机迁移方案。
迁移后的监控¶
/、/data的容量和 inode 使用率。/data/docker与/data/containerd增长速度。- 容器日志是否已限制大小和数量。
- Build Cache、无引用镜像和停止容器的占用。
- Volume/数据库数据的备份与恢复验证。