1、准备目标目录
# 创建目标目录
sudo mkdir -p /home/var/lib
# 确保目录权限与原docker目录一致
sudo chmod 711 /home/var/lib
sudo chown root:root /home/var/lib
2、停止docker相关服务
# 停止docker服务
sudo systemctl stop docker
# 检查是否有docker.socket在运行,若有则停止(通用做法,无需等提示)
if sudo systemctl is-active --quiet docker.socket; then
sudo systemctl stop docker.socket
fi
# 确认docker完全停止
sudo systemctl status docker | grep "inactive (dead)"
3、修改docker配置文件
# 先备份原配置文件(重要)
sudo cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
# 编辑配置文件,修改ExecStart行(使用sed替换更高效,避免手动编辑出错)
sudo sed -i '/^ExecStart=/ s/$/ --data-root=\/home\/var\/lib\/docker/' /lib/systemd/system/docker.service
# 验证修改是否生效(查看ExecStart行)
grep "ExecStart" /lib/systemd/system/docker.service
4、同步数据到新目录(使用 rsync)
# 同步原docker目录到目标位置(注意路径:/var/lib/docker 同步到 /home/var/lib/ 下)
sudo rsync -avzP /var/lib/docker /home/var/lib/
# 验证同步结果(检查新目录文件数是否与原目录一致)
echo "原目录文件数:$(sudo find /var/lib/docker -type f | wc -l)"
echo "新目录文件数:$(sudo find /home/var/lib/docker -type f | wc -l)"
5、重命名原目录(备份)
sudo mv /var/lib/docker /var/lib/docker.old
6、重启docker并检查挂载问题
# 重新加载systemd配置(修改service文件后必须执行)
sudo systemctl daemon-reload
# 启动docker服务
sudo systemctl start docker
# 启动docker.socket(若之前停止过)
sudo systemctl start docker.socket
# 查看磁盘挂载情况,检查是否有/var/lib/docker.old的挂载
df -h | grep "docker.old"
7、处理 overlay 挂载残留(关键步骤)
如果 df -h 显示 /var/lib/docker.old 仍被 overlay 挂载,执行以下操作卸载:
# 1. 先停止所有运行中的容器
sudo docker stop $(sudo docker ps -aq)
# 2. 卸载所有关联到docker.old的挂载卷(-l 表示懒卸载,强制解除挂载)
sudo cat /proc/mounts | grep "/var/lib/docker.old" | awk '{print $2}' | while read line; do
sudo umount -l $line
done
# 3. 验证挂载是否已卸载
df -h | grep "docker.old" || echo "已无docker.old挂载"
# 4. 重新启动docker
sudo systemctl restart docker
8、最终验证
# 检查docker状态
sudo systemctl status docker
# 检查docker数据目录配置(显示应为/home/var/lib/docker)
sudo docker info | grep "Docker Root Dir"
# 运行一个测试容器,验证数据写入新目录
sudo docker run --rm alpine echo "迁移成功!"
9、修改docker的data-root的简易流程
service docker stop
mkdir -p /data/var/lib/docker
rsync -avzP /var/lib/docker/ /data/var/lib/docker/
vim /etc/docker/daemon.json
{
"data-root": "/data/var/lib/docker"
}
service docker start
Categories:
docker与kubernetes