修改Docker根目录后Docker Engine无法启动的问题求助
在CentOS 7系统中新建分区后,尝试将Docker根目录从/var/lib/docker迁移到/data/docker,操作如下:
- 修改
docker.service文件,更新ExecStart配置:
ExecStart=/usr/bin/dockerd -g /data/docker/ -H fd:// --containerd=/run/containerd/containerd.sock
- 将
/var/lib/docker下的数据复制到/data/docker - 执行
systemctl daemon-reload和systemctl start docker
但Docker服务启动失败,报错信息:
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Process: 16925 ExecStart=/usr/bin/dockerd -g /data/docker/ -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE) Main PID: 16925 (code=exited, status=1/FAILURE)
Jun 29 23:26:37 linux.local systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 29 23:26:37 linux.local systemd[1]: Failed to start Docker Application Container Engine.
Jun 29 23:26:37 linux.local systemd[1]: Unit docker.service entered failed state.
Jun 29 23:26:37 linux.local systemd[1]: docker.service failed. Warning: docker.service changed on disk. Run 'systemctl daemon-reload'to reload units.
环境信息:
- 系统版本:CentOS Linux 7 (Core),内核3.10.0-1160.90.1.el7.x86_64
- Docker版本:Docker Engine - Community 24.0.2,containerd 1.6.21
1. 修复目录权限与SELinux上下文
Docker需要对/data/docker拥有完整读写权限,且SELinux上下文需匹配:
- 调整目录权限:
chown -R root:root /data/docker chmod -R 700 /data/docker
- 修复SELinux上下文(CentOS 7默认开启SELinux,这是高频问题点):
restorecon -Rv /data/docker
可临时关闭SELinux验证是否为此问题:
setenforce 0
关闭后若能启动,说明是SELinux限制,上述restorecon命令可永久修复。
2. 替换过时的-g参数
Docker 17.06版本后官方推荐使用--data-root替代-g(-g为旧版别名,部分新版本存在兼容性问题),修改docker.service的ExecStart为:
ExecStart=/usr/bin/dockerd --data-root /data/docker -H fd:// --containerd=/run/containerd/containerd.sock
修改后重新重载并启动:
systemctl daemon-reload systemctl start docker
3. 查看Docker详细启动日志
通过journalctl获取实时启动日志,定位具体失败原因:
journalctl -u docker.service -f
日志会明确提示错误类型,比如权限拒绝、文件损坏、挂载只读等,可针对性处理。
4. 确认数据复制完整性
确保原目录所有文件(含隐藏文件、权限属性)完整复制到新目录,推荐用rsync:
rsync -av /var/lib/docker/ /data/docker/
避免使用cp命令可能遗漏的特殊文件或权限配置。
5. 验证systemd配置合法性
检查修改后的docker.service是否存在语法错误:
systemd-analyze verify docker.service
若有配置错误会直接提示,修正后再执行重载启动操作。
6. 检查分区挂载状态
确认/data所在分区挂载正常,非只读状态:
df -h mount | grep /data
若为只读挂载,重新挂载为读写模式:
mount -o remount,rw /data
同时检查/etc/fstab中的挂载配置,确保开机自动挂载为读写模式。
内容的提问来源于stack exchange,提问作者TITANIXX

