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 后台界面中:
- 进入"服务" → “Docker” → “配置”
- 修改"根目录"为:
/mnt/mydisk/docker/iStoreOS-P1/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 数据目录迁移到新的存储位置。现在系统分区有更多空间,且 Docker 数据存储在更合适的存储设备上。
📝 后续维护建议:
- 定期检查目标分区的磁盘使用情况
- 设置监控告警,防止磁盘空间不足
- 定期备份 Docker 数据目录
- 定期清理不再使用的镜像和容器
- 更新系统时注意检查 Docker 配置是否保持不变
希望本指南能帮助您顺利完成 iStoreOS Docker 目录迁移!🖥️💨