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
| /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
/etc/init.d/dockerd start
|
⚠️ 注意:以上是简化流程,详细步骤请参考下面的完整指南。
⚠️ 迁移前准备
1. 检查当前 Docker 使用情况
1 2 3 4 5 6 7 8 9 10 11 12
| docker info | grep 'Docker Root Dir'
df -h /overlay/upper/opt/ df -h /mnt/mydisk/
du -sh /overlay/upper/opt/docker
|
2. 备份重要数据
1 2 3 4 5 6 7 8 9 10 11
| 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
| /etc/init.d/dockerd stop
/etc/init.d/dockerd status
docker ps -q | xargs -r docker stop
|
2. 创建新目录结构
1 2 3 4 5 6 7 8 9
| 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 -avh --progress /overlay/upper/opt/docker/ /mnt/mydisk/docker/iStoreOS-P1/docker/
mv /overlay/upper/opt/docker/* /mnt/mydisk/docker/iStoreOS-P1/docker/
ls -la /mnt/mydisk/docker/iStoreOS-P1/docker/
|
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/
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
| /etc/init.d/dockerd start
/etc/init.d/dockerd status
sleep 10
|
8. 验证迁移结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker info | grep 'Docker Root Dir'
docker ps docker ps -a
docker run --rm hello-world
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
| /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
| { "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": 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
| { "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
sestatus aa-status
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
ncdu /mnt/mydisk/docker/iStoreOS-P1/docker
|
4. 网络问题
1 2 3 4 5 6 7 8
| docker network ls
systemctl restart docker-network
iptables -L -n | grep DOCKER
|
5. 服务启动失败
1 2 3 4 5 6 7 8 9
| journalctl -u dockerd -n 50 --no-pager
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
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
| cat > /usr/local/bin/docker-backup << 'EOF'
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'
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
| cat >> /etc/docker/daemon.json << EOF "storage-opts": [ "overlay2.override_kernel_check=true", "overlay2.size": "20G" ] EOF
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 数据存储在更合适的存储设备上。
📝 后续维护建议:
- 定期检查目标分区的磁盘使用情况
- 设置监控告警,防止磁盘空间不足
- 定期备份 Docker 数据目录
- 定期清理不再使用的镜像和容器
- 更新系统时注意检查 Docker 配置是否保持不变
希望本指南能帮助您顺利完成 iStoreOS Docker 目录迁移!🖥️💨
iStoreOS Docker 目录迁移完全指南 🐳