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 的默认存储目录就成功迁移了。

相关推荐
PyAIGCMaster13 分钟前
docker学习记录:部署es+kibana
学习·elasticsearch·docker
AI探索家_星海算力1 小时前
如何配置【Docker镜像】加速器+【Docker镜像】的使用
运维·人工智能·docker·容器·gpu算力
boy快快长大11 小时前
通过Dockerfile来实现项目可以指定读取不同环境的yml包
docker
会飞的土拨鼠呀11 小时前
docker system df命令
运维·docker·容器
dessler14 小时前
Docker-原理之cgroup
linux·运维·docker
Dolphin_Home15 小时前
Docker搭建Skywalking
docker·容器·skywalking
码上飞扬16 小时前
深入探讨服务器虚拟化:架构、技术与应用
服务器·docker·k8s·虚拟化·kvm·xen
ZhangTao_zata17 小时前
rustdesk自己搭建配置
docker
大小科圣18 小时前
docker搭建gitlab和jenkins
docker·gitlab·jenkins
玄明Hanko19 小时前
2024 年 docker 提示index.docker.io
docker·镜像