文章目录
- 介绍
- 注意事项
- 一般docker环境
-
- [步骤 1:检查现有 Docker 数据目录](#步骤 1:检查现有 Docker 数据目录)
- [步骤 2: 检查 Docker 服务状态](#步骤 2: 检查 Docker 服务状态)
- [步骤 3: 创建新的存储目录](#步骤 3: 创建新的存储目录)
- [步骤 4: 修改 Docker 配置](#步骤 4: 修改 Docker 配置)
- [步骤 5:重新加载配置并启动 Docker 服务](#步骤 5:重新加载配置并启动 Docker 服务)
- [步骤 6:验证迁移是否成功](#步骤 6:验证迁移是否成功)
- [Docker swarm环境](#Docker swarm环境)
- [Kubernetes 环境](#Kubernetes 环境)
-
- [步骤 1:检查当前 Docker 和 K8s 状态](#步骤 1:检查当前 Docker 和 K8s 状态)
- [步骤 2:准备迁移环境](#步骤 2:准备迁移环境)
介绍
- Docker 默认将容器和镜像的数据存储在 /var/lib/docker 目录中。
- 如果 /var 所在的磁盘空间不足,可以通过以下步骤迁移 Docker 的默认存储目录到其他磁盘位置
- 在 Docker Swarm 集群中,每个节点可以配置不同的 daemon.json 文件,使用不同的 data-root 路径,这是完全支持的。
注意事项
- 迁移过程中,确保 Docker 服务已完全停止,以避免数据损坏。
- 如果涉及多节点或复杂配置(如 Swarm 或 Kubernetes),在迁移前备份配置并测试新路径的兼容性。
- 如果 Docker 是通过某些特殊方式安装(如自定义编译),上述路径可能有所不同,请根据具体环境调整。
- 备份数据:迁移之前建议对现有 Docker 数据进行备份。
- 磁盘空间:确认目标磁盘有足够的空间来容纳 Docker 数据。
一般docker环境
步骤 1:检查现有 Docker 数据目录
sh
# Docker 默认存储目录是 /var/lib/docker,您可以先确认当前使用的目录:
docker info | grep "Docker Root Dir"
# 输出类似如下,说明当前默认路径:
Docker Root Dir: /var/lib/docker
步骤 2: 检查 Docker 服务状态
sh
# 禁用 docker.socket
sudo systemctl stop docker.socket
sudo systemctl disable docker.socket
# 停止 Docker 服务:
sudo systemctl stop docker
# 确保 Docker 服务已停止:
sudo systemctl status docker
# 输出中应显示 Active: inactive (dead)
步骤 3: 创建新的存储目录
sh
# 假设你想将 Docker 数据迁移到 /data/docker,先创建目标目录:
sudo mkdir -p /data/docker
# 确保新目录具有适当的权限:
sudo chown -R root:docker /data/docker
sudo chmod -R 755 /data/docker
# 复制原有数据到新目录:
sudo rsync -aP /var/lib/docker/ /data/docker/
说明:
-a:保持文件权限、时间戳等属性。
-P:显示进度并在中断后恢复传输。
sh
# 完成后,建议检查文件数量和大小,确保源目录和目标目录一致:
du -sh /var/lib/docker
du -sh /data/docker
步骤 4: 修改 Docker 配置
sh
# 编辑 Docker 配置文件,通常位于 /etc/docker/daemon.json,如果文件不存在则创建:
sudo vi /etc/docker/daemon.json
添加或修改以下配置,将数据目录指向新路径:
{
"data-root": "/data/docker"
}
步骤 5:重新加载配置并启动 Docker 服务
sh
# 重新加载守护进程并启动 Docker 服务。
sudo systemctl daemon-reload
sudo systemctl start docker
# 检查 Docker 服务状态,确保其运行正常:
sudo systemctl status docker
# 恢复 Docker 服务和 socket
sudo systemctl enable docker.socket
步骤 6:验证迁移是否成功
sh
# 检查 Docker 的数据目录是否已经变更:
docker info | grep "Docker Root Dir"
# 输出应类似于:
Docker Root Dir: /data/docker
步骤 7: 清理旧数据(可选)
sh
# 确认 Docker 使用新目录无误后,可以删除旧的 /var/lib/docker 数据以释放空间:
sudo rm -rf /var/lib/docker
Docker swarm环境
迁移 data-root 前,先将节点设置为 drain 状态:
sh
# 查看所有节点:
docker node ls
docker node update --availability drain <NODE-ID>
确保没有运行中的服务实例后再执行一般Dokcer环境的迁移步骤。
执行完毕后恢复节点为 active 状态:
sh
# 将节点设置为 active 状态:
docker node update --availability active <node-name>
Kubernetes 环境
步骤 1:检查当前 Docker 和 K8s 状态
- 检查现有 Docker 数据目录
sh
# 确认当前 Docker 数据目录:
docker info | grep "Docker Root Dir"
# 输出示例:
Docker Root Dir: /var/lib/docker
- 检查 Kubernetes 节点状态
sh
# 在控制面板所在机器检查集群节点状态:
kubectl get nodes
# 确保所有节点处于 Ready 状态。
- 确认工作负载
sh
# 列出当前运行的 Pod 和服务:
kubectl get pods -A
kubectl get svc
步骤 2:准备迁移环境
- 停止 Kubernetes 工作负载
sh
# 将节点设置为不可调度状态并逐步迁移工作负载:
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data
<NODE_NAME>:需要迁移的节点名称。
--ignore-daemonsets:忽略 DaemonSet。
--delete-emptydir-data:删除 emptyDir 存储卷的数据。
再执行一般Dokcer环境的迁移步骤即可。
-
恢复Kubernetes 工作负载
sh# 使用 kubectl uncordon 命令将节点恢复为可调度状态,即取消 drain 操作: kubectl uncordon <NODE_NAME> # 验证节点状态: kubectl get nodes # 检查被调度的 Pod: kubectl get pods --all-namespaces -o wide
完成以上步骤后,Docker 的默认存储目录就成功迁移了。