通过SSH复制只读服务器上含Postgres的Docker容器至新磁盘方案咨询
可行迁移方案
前置准备
- 确认新磁盘已挂载到服务器,用
lsblk或fdisk -l查看设备路径(例如/dev/sdb) - 给新磁盘创建文件系统(以ext4为例):
mkfs.ext4 /dev/sdb - 创建挂载点并挂载新磁盘:
mkdir /new-disk && mount /dev/sdb /new-disk
核心迁移步骤
1. 停止所有运行容器
因磁盘只读,常规停止命令可能报错,用强制终止:docker kill $(docker ps -q)
2. 复制Docker数据目录
默认Docker数据目录为/var/lib/docker,完整复制到新磁盘:rsync -avxP /var/lib/docker/ /new-disk/docker/
-a:保留权限、时间戳等元数据-v:显示复制进度详情-x:不跨文件系统复制,避免意外-P:支持断点续传并显示实时进度
3. 修改Docker数据目录配置
- 编辑(或创建)Docker配置文件
/etc/docker/daemon.json:{ "data-root": "/new-disk/docker" } - 若为旧版Docker,需修改
/etc/systemd/system/docker.service.d/override.conf,在启动参数中添加--data-root /new-disk/docker
4. 重启Docker服务
systemctl daemon-reload && systemctl restart docker
5. 验证数据与服务
- 启动所有容器:
docker start $(docker ps -aq) - 进入Postgres容器验证数据:
docker exec -it <容器名> psql -U <用户名> -d <数据库名>,执行简单查询确认数据完整
只读磁盘特殊处理
若rsync因磁盘损坏无法读取部分文件:
- 跳过损坏文件继续复制:
rsync -avxP --ignore-errors /var/lib/docker/ /new-disk/docker/ - 单独备份Postgres数据:若容器可进入,执行
docker exec <容器名> pg_dump -U <用户名> <数据库名> > /new-disk/pg-backup.sql,后续在新容器中通过cat /new-disk/pg-backup.sql | docker exec -i <新容器名> psql -U <用户名> -d <数据库名>恢复
后续收尾
- 更新
fstab让新磁盘开机自动挂载:用blkid /dev/sdb获取UUID,在/etc/fstab添加一行:UUID=<获取到的UUID> /new-disk ext4 defaults 0 0 - 确认服务正常后,可卸载旧磁盘(如不需要):
umount /dev/sda(替换为实际旧磁盘路径)
内容的提问来源于stack exchange,提问作者Mlgarate
相关产品推荐
相关产品推荐

