Docker 存储目录迁移-实操

文章目录

  • 介绍
  • 注意事项
  • 一般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 的默认存储目录就成功迁移了。

相关推荐
yuguo.im2 小时前
Docker 两大基石:Namespace 和 Cgroups
运维·docker·容器
会飞的土拨鼠呀2 小时前
docker部署 outline(栗子云笔记)
笔记·docker·容器
Jelly-小丑鱼3 小时前
Linux搭建syslog日志服务器
linux·服务器·docker·日志服务器·syslog服务器
没有bug.的程序员3 小时前
高频IO服务优化实战指南
java·jvm·spring·容器
lisanmengmeng4 小时前
docker 方式安装部署禅道zentao(五)
运维·docker·容器
程序员老赵5 小时前
AdguardHome Docker 容器化部署指南
docker·dns
露临霜6 小时前
Docker安装nginx
nginx·docker·容器
CAFEBABE 348 小时前
安装完docker之后怎么使用
运维·docker·容器
测试人社区—小叶子9 小时前
测试开发面试高频“灵魂八问”深度解析与应答策略
网络·人工智能·测试工具·云原生·容器·面试·职场和发展
全靠bug跑9 小时前
Nacos 入门实战:部署、服务注册与发现全指南
java·spring cloud·docker·nacos