Featured image of post iStoreOS Docker 目录迁移 🐳

iStoreOS Docker 目录迁移 🐳

iStoreOS Docker 目录迁移完全指南 🐳 本指南详细介绍如何将 iStoreOS 的 Docker 数据目录迁移到新的存储

iStoreOS Docker 目录迁移完全指南 🐳

本指南详细介绍如何将 iStoreOS 的 Docker 数据目录迁移到新的存储位置,释放系统分区空间并提高存储灵活性。通过本指南,您可以轻松完成 Docker 数据迁移,确保服务无缝切换!🚀


📖 导航目录


✨ 迁移优势

将 Docker 目录迁移到专用存储位置可以带来以下好处:

  • 💾 释放系统空间:避免 Docker 占用宝贵的系统分区空间
  • 🚀 提升性能:将数据存储在更快的存储设备上(如 SSD)
  • 📈 扩展性增强:轻松扩展存储容量而不影响系统分区
  • 🔄 备份更方便:独立存储位置使备份和恢复更简单
  • 🛡️ 系统稳定性:防止 Docker 数据增长导致系统分区爆满
  • 📊 管理更清晰:Docker 数据与系统文件分离,管理更便捷

⚡ 快速开始

基本迁移命令概览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 停止 Docker 服务
/etc/init.d/dockerd stop

# 创建新目录
mkdir -p /mnt/mydisk/docker/iStoreOS-P1/docker

# 备份原数据
cp -r /overlay/upper/opt/docker /overlay/upper/opt/docker-bak

# 迁移数据
mv /overlay/upper/opt/docker/* /mnt/mydisk/docker/iStoreOS-P1/docker/

# 配置新路径
echo '{"data-root": "/mnt/mydisk/docker/iStoreOS-P1/docker"}' > /etc/docker/daemon.json

# 启动 Docker
/etc/init.d/dockerd start

⚠️ 注意:以上是简化流程,详细步骤请参考下面的完整指南。


⚠️ 迁移前准备

1. 检查当前 Docker 使用情况

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看当前 Docker 根目录
docker info | grep 'Docker Root Dir'
# 📍 默认位置: /overlay/upper/opt/docker

# 查看磁盘空间使用
df -h /overlay/upper/opt/
df -h /mnt/mydisk/
# 💾 确认目标分区有足够空间

# 计算 Docker 数据大小
du -sh /overlay/upper/opt/docker
# 📊 了解需要迁移的数据量

2. 备份重要数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 备份 Docker 配置文件
cp /etc/docker/daemon.json /etc/docker/daemon.json.backup

# 列出所有容器和镜像
docker ps -a
docker images
docker volume ls
# 📋 记录当前状态以便验证

# 导出容器列表(可选)
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" > docker_containers.list

3. 准备目标位置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 确保目标位置有足够空间
TARGET_SIZE=$(du -s /overlay/upper/opt/docker | cut -f1)
AVAILABLE_SIZE=$(df /mnt/mydisk/ | awk 'NR==2{print $4}')

if [ $TARGET_SIZE -gt $AVAILABLE_SIZE ]; then
    echo "❌ 错误: 目标位置空间不足!"
    exit 1
fi

# 创建目标目录结构
mkdir -p /mnt/mydisk/docker/iStoreOS-P1/docker

🚀 迁移步骤

1. 停止 Docker 服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 停止 Docker 服务
/etc/init.d/dockerd stop
# 🔴 确保所有容器已停止

# 确认服务状态
/etc/init.d/dockerd status
# ✅ 应该显示: stopped

# 确保所有容器已停止
docker ps -q | xargs -r docker stop
# 🛑 停止所有运行中的容器

2. 创建新目录结构

1
2
3
4
5
6
7
8
9
# 创建新的 Docker 目录
mkdir -p /mnt/mydisk/docker/iStoreOS-P1/docker
# 📁 创建多层目录结构

# 设置正确的权限
chmod 755 /mnt/mydisk/docker/iStoreOS-P1/docker

# 设置所有权(如果需要)
chown root:root /mnt/mydisk/docker/iStoreOS-P1/docker

3. 备份原数据(重要!)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建原数据备份
cp -r /overlay/upper/opt/docker /overlay/upper/opt/docker-bak
# 🎯 备份到同分区,避免迁移失败无法恢复

# 验证备份完整性
du -sh /overlay/upper/opt/docker /overlay/upper/opt/docker-bak
# 📊 两个目录大小应该相同

# 可选:创建压缩备份
tar -czf /overlay/upper/opt/docker-backup-$(date +%Y%m%d).tar.gz -C /overlay/upper/opt/docker .

4. 迁移数据到新位置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用 rsync 进行更可靠的迁移
rsync -avh --progress /overlay/upper/opt/docker/ /mnt/mydisk/docker/iStoreOS-P1/docker/
# 🔄 使用 rsync 可以断点续传并验证数据完整性

# 或者使用 mv 命令移动数据
mv /overlay/upper/opt/docker/* /mnt/mydisk/docker/iStoreOS-P1/docker/
# 🚚 移动所有数据文件

# 验证移动结果
ls -la /mnt/mydisk/docker/iStoreOS-P1/docker/
# 📋 应该包含 containers, images, volumes 等目录

5. 创建 Docker 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 创建配置目录(如果不存在)
mkdir -p /etc/docker/

# 创建新的 daemon.json 配置
cat > /etc/docker/daemon.json << EOF
{
  "data-root": "/mnt/mydisk/docker/iStoreOS-P1/docker",
  "log-level": "warn",
  "iptables": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "2"
  },
  "storage-driver": "overlay2"
}
EOF

# 验证配置文件语法
jq . /etc/docker/daemon.json > /dev/null 2>&1 && echo "✅ 配置文件语法正确" || echo "❌ 配置文件有语法错误"

6. 图形界面配置(可选)

在 iStoreOS 后台界面中:

  1. 进入"服务" → “Docker” → “配置”
  2. 修改"根目录"为: /mnt/mydisk/docker/iStoreOS-P1/docker
  3. 保存配置

Docker 配置界面

7. 启动 Docker 服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 启动 Docker 服务
/etc/init.d/dockerd start
# 🟢 启动服务

# 检查启动状态
/etc/init.d/dockerd status
# ✅ 应该显示: running

# 等待服务完全启动
sleep 10

8. 验证迁移结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 检查新的 Docker 根目录
docker info | grep 'Docker Root Dir'
# 📍 应该显示: /mnt/mydisk/docker/iStoreOS-P1/docker

# 查看容器状态
docker ps
docker ps -a
# 📋 所有容器应该正常显示

# 测试容器功能
docker run --rm hello-world
# 🎯 测试 Docker 基本功能

# 检查卷和镜像
docker volume ls
docker images
# ✅ 确认所有数据都已迁移

9. 清理旧数据

1
2
3
4
5
6
7
8
9
# 确认新位置工作正常后,删除备份
rm -rf /overlay/upper/opt/docker-bak

# 删除旧数据目录
rm -rf /overlay/upper/opt/docker
# 🗑️ 释放系统分区空间

# 可选:创建符号链接保持兼容性
ln -sf /mnt/mydisk/docker/iStoreOS-P1/docker /overlay/upper/opt/docker

10. 重启 Docker 服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 完全重启 Docker 服务
/etc/init.d/dockerd restart
# 🔄 确保所有配置生效

# 最终状态检查
docker info | grep -E 'Docker Root Dir|Storage Driver'
# ✅ 确认一切正常

# 验证所有容器运行状态
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"

🔧 高级配置选项

1. 使用 Overlay2 存储驱动

1
2
3
4
5
6
7
8
9
# 在 daemon.json 中添加存储驱动配置
{
  "data-root": "/mnt/mydisk/docker/iStoreOS-P1/docker",
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true",
    "overlay2.size": "20G"
  ]
}

2. 配置日志轮转

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 更详细的日志配置
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3",
    "compress": "true",
    "labels": "production"
  }
}

3. 网络配置优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 禁用 iptables 并配置自定义网络
{
  "iptables": false,
  "bridge": "none",
  "default-address-pools": [
    {
      "base": "192.168.0.0/16",
      "size": 24
    }
  ],
  "dns": ["8.8.8.8", "8.8.4.4"]
}

4. 资源限制配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 设置 Docker 资源限制
{
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  },
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 2
}

🐛 故障排除

1. 迁移后容器无法启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检查容器日志
docker logs <container_name>

# 检查存储驱动兼容性
docker info | grep 'Storage Driver'

# 恢复备份数据
cp -r /overlay/upper/opt/docker-bak/* /mnt/mydisk/docker/iStoreOS-P1/docker/

# 检查文件权限
namei -l /mnt/mydisk/docker/iStoreOS-P1/docker

2. 权限问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 修复目录权限
chown -R root:root /mnt/mydisk/docker/iStoreOS-P1/docker
chmod -R 755 /mnt/mydisk/docker/iStoreOS-P1/docker

# 检查 SELinux/AppArmor
sestatus
aa-status

# 如果是 SELinux 问题
restorecon -Rv /mnt/mydisk/docker/iStoreOS-P1/docker

3. 磁盘空间不足

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检查目标分区空间
df -h /mnt/mydisk/

# 清理不必要的镜像
docker system prune -a

# 调整 Docker 存储位置
# 选择更大的分区进行迁移

# 查看磁盘使用详情
ncdu /mnt/mydisk/docker/iStoreOS-P1/docker

4. 网络问题

1
2
3
4
5
6
7
8
# 检查 Docker 网络配置
docker network ls

# 重启 Docker 网络
systemctl restart docker-network

# 检查 iptables 规则
iptables -L -n | grep DOCKER

5. 服务启动失败

1
2
3
4
5
6
7
8
9
# 查看 Docker 服务日志
journalctl -u dockerd -n 50 --no-pager

# 调试模式启动 Docker
dockerd --debug

# 检查内核兼容性
uname -r
modprobe overlay

💡 最佳实践建议

1. 定期维护

1
2
3
4
5
6
7
8
# 设置定时清理任务
echo "0 3 * * * docker system prune -f" >> /etc/crontabs/root

# 监控磁盘使用
echo "0 * * * * df -h /mnt/mydisk/ >> /var/log/disk-usage.log" >> /etc/crontabs/root

# 定期检查 Docker 健康状态
echo "0 2 * * * docker ps -q | xargs -r docker inspect --format='{{.State.Status}}' | grep -v running && systemctl restart dockerd" >> /etc/crontabs/root

2. 备份策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建 Docker 数据备份脚本
cat > /usr/local/bin/docker-backup << 'EOF'
#!/bin/sh
BACKUP_DIR="/mnt/backup/docker"
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/docker-$(date +%Y%m%d).tar.gz -C /mnt/mydisk/docker/iStoreOS-P1/docker .
find $BACKUP_DIR -name "docker-*.tar.gz" -mtime +7 -delete
EOF
chmod +x /usr/local/bin/docker-backup

# 添加到计划任务
echo "0 2 * * * /usr/local/bin/docker-backup" >> /etc/crontabs/root

3. 监控告警

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 设置磁盘空间告警
cat > /etc/docker/disk-alert.sh << 'EOF'
#!/bin/sh
USAGE=$(df /mnt/mydisk/ | awk 'NR==2{print $5}' | sed "s/%//")
if [ $USAGE -gt 90 ]; then
    echo "警告: Docker 存储空间不足 ${USAGE}%" | logger -t docker-monitor
    # 发送邮件或通知
fi
EOF
chmod +x /etc/docker/disk-alert.sh

# 添加到计划任务
echo "*/30 * * * * /etc/docker/disk-alert.sh" >> /etc/crontabs/root

4. 性能优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 如果使用 SSD,启用 TRIM 支持
cat >> /etc/docker/daemon.json << EOF
"storage-opts": [
  "overlay2.override_kernel_check=true",
  "overlay2.size": "20G"
]
EOF

# 调整 I/O 调度器(如果使用 SSD)
echo 'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/rc.local

✅ 验证清单

完成迁移后,请验证以下项目:

  • Docker 服务正常运行: systemctl status dockerd
  • 根目录已更改: docker info | grep 'Docker Root Dir'
  • 所有容器正常: docker ps
  • 镜像列表完整: docker images
  • 卷数据可访问: docker volume ls
  • 新目录权限正确: ls -ld /mnt/mydisk/docker/iStoreOS-P1/docker
  • 备份已清理: ls /overlay/upper/opt/docker*
  • 系统日志无错误: dmesg | grep -i docker
  • 容器网络正常: docker exec <container> ping -c 1 8.8.8.8
  • 存储驱动正常: docker info | grep 'Storage Driver'

🎉 恭喜! 您已成功将 Docker 数据目录迁移到新的存储位置。现在系统分区有更多空间,且 Docker 数据存储在更合适的存储设备上。


📝 后续维护建议

  1. 定期检查目标分区的磁盘使用情况
  2. 设置监控告警,防止磁盘空间不足
  3. 定期备份 Docker 数据目录
  4. 定期清理不再使用的镜像和容器
  5. 更新系统时注意检查 Docker 配置是否保持不变

希望本指南能帮助您顺利完成 iStoreOS Docker 目录迁移!🖥️💨