打包容器有两种方式,取决于你的需求:
方式一:打包容器为镜像(保留运行状态 + 数据)
bash
# 1. 停止容器(可选,但建议)
docker stop 3b82aa60bbb4
# 2. 提交为镜像
docker commit 3b82aa60bbb4 my-postgres-backup:v1.0
# 3. 保存为 tar 文件
docker save -o /backup/my-postgres-backup-v1.0.tar my-postgres-backup:v1.0
# 4. 压缩(可选,节省空间)
gzip /backup/my-postgres-backup-v1.0.tar
目标机器还原:
bash
# 传输后加载
gunzip /backup/my-postgres-backup-v1.0.tar.gz
docker load -i /backup/my-postgres-backup-v1.0.tar
# 运行(数据已内置)
docker run -d --name postgres-new -p 5432:5432 my-postgres-backup:v1.0
⚠️ 注意 :这种方式把数据打包进镜像层,镜像会很大,且后续数据变更不会持久化到宿主机。
方式二:只打包容器配置(推荐配合数据分离)
bash
# 导出容器配置(JSON 格式,包含环境变量、挂载等)
docker inspect 3b82aa60bbb4 > /backup/postgres-container-config.json
# 配合数据目录打包
tar czf /backup/postgres-full_$(date +%Y%m%d_%H%M%S).tar.gz \
-C /backup postgres-container-config.json \
-C /opt/git-resources/AFFiNE/data/self-host/postgres pgdata
目标机器还原:
bash
# 1. 解压数据
tar xzf /backup/postgres-full_xxx.tar.gz -C /
# 2. 根据 JSON 配置重新创建容器
docker run -d \
--name postgres-new \
-e POSTGRES_PASSWORD=your_password \
-e POSTGRES_USER=postgres \
-v /opt/git-resources/AFFiNE/data/self-host/postgres/pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16
方式对比
| 方式 | 包含内容 | 镜像大小 | 适用场景 |
|---|---|---|---|
docker commit + save |
容器文件系统快照 | 大(含数据) | 快速迁移、测试环境克隆 |
docker inspect + 数据分离 |
仅配置 + 独立数据包 | 小 | 生产环境、长期维护 |