如何备份包含数据的Docker容器并迁移至另一服务器?
嘿,我来帮你把这个迁移问题理得明明白白!首先给你吃个定心丸:你的理解完全正确!像PostgreSQL这类官方容器,默认会把核心数据存储在独立的Docker Volume中——镜像本身只包含运行容器所需的程序和基础配置,不会包含Volume里的用户业务数据。所以只迁移镜像的话,你的数据库数据肯定会丢,必须同时处理镜像和Volume的数据才能完成完整迁移。
下面是一步步的实操流程,帮你把整个迁移过程落地:
一、在原服务器上做备份准备
1. 先停止目标容器(可选但强烈推荐)
避免备份过程中数据被写入,导致备份文件出现不一致的问题:
docker stop your-postgres-container-name
2. 把Volume数据打包备份到本地
用一个临时的轻量容器(比如busybox)挂载要备份的Volume,把数据打包成tar文件:
docker run --rm -v your-postgres-volume:/volume -v $(pwd):/backup busybox tar cvf /backup/postgres-backup.tar /volume
--rm:临时容器执行完命令自动删除,不用手动清理-v your-postgres-volume:/volume:把你要备份的PostgreSQL Volume挂载到临时容器的/volume目录-v $(pwd):/backup:把本地当前目录挂载到临时容器的/backup目录,用来存放最终的备份文件busybox:体积极小的Linux镜像,自带tar等基础命令,适合做这类临时操作
3. 导出定制化镜像(如果不是用官方镜像的话)
如果你对PostgreSQL镜像做过自定义修改(比如加了插件、改了配置),需要把镜像也导出:
docker save -o postgres-custom-image.tar your-postgres-image:tag
二、把备份文件传到新服务器
用scp、SFTP或者你熟悉的文件传输工具,把刚才生成的postgres-backup.tar和postgres-custom-image.tar(如果有的话)传到新服务器的某个目录下,比如~/docker-backups/。
三、在新服务器上恢复数据与启动容器
1. (可选)导入定制化镜像
如果之前导出了自己的定制镜像,先导入到新服务器的Docker中:
docker load -i ~/docker-backups/postgres-custom-image.tar
2. 创建新的Volume用来恢复数据
docker volume create new-postgres-volume
3. 把备份数据恢复到新Volume里
还是用临时容器挂载新Volume和备份文件,解压tar包:
docker run --rm -v new-postgres-volume:/volume -v ~/docker-backups:/backup busybox tar xvf /backup/postgres-backup.tar -C /volume --strip-components 1
--strip-components 1:去掉tar包里面的/volume前缀,直接把文件放到新Volume的根目录,避免出现嵌套目录的问题
4. 用恢复好的Volume启动PostgreSQL容器
启动容器时指定使用刚才恢复好的Volume,注意数据路径要和原容器保持一致(PostgreSQL官方镜像默认路径是/var/lib/postgresql/data):
docker run -d --name new-postgres-container -v new-postgres-volume:/var/lib/postgresql/data -p 5432:5432 your-postgres-image:tag
四、验证迁移结果
容器启动后,用PostgreSQL客户端连接到新服务器的5432端口,检查是否能看到原来的数据库、表和业务数据。确认一切正常后,就可以放心清理原服务器上的旧容器和Volume了。
如果过程中找不到Volume名称,可以用docker volume ls查看所有Volume列表,用docker inspect your-postgres-container查看容器挂载的Volume详情。
内容的提问来源于stack exchange,提问作者Viktor




