如何将PostgreSQL数据库恢复到新磁盘并部署到Portainer管理的Docker容器
PostgreSQL容器数据恢复与Portainer栈配置指南
接手的产品需迁移至Azure新订阅,原管理团队已离职,因云限制无法通过快照迁移虚拟机,需在新服务器重新配置Portainer栈(含应用容器与Postgres13容器),并恢复PostgreSQL数据库(数据库量小,已导出至本地)。计划将数据库恢复到新虚拟机的数据盘,咨询是否仅需保证数据路径与原栈YAML中
device: /application-drive/postgres_data一致即可,寻求具体配置方案。原栈YAML配置如下:version: '3.2' services: postgres: image: postgres:13 restart: on-failure ports: - 5432:5432 environment: POSTGRES_USER: user POSTGRES_DB: database POSTGRES_PASSWORD_FILE: /run/secrets/db_password secrets: - db_password healthcheck: test: [ "CMD-SHELL", "pg_isready -U user -d database" ] interval: 10s timeout: 5s retries: 5 volumes: - data:/var/lib/postgresql/data networks: - public deploy: mode: replicated replicas: 1 placement: constraints: [ node.role == manager ] application: image: repo.io/application:latest restart: on-failure entrypoint: [ "/bin/sh", "-c" , "cp /run/secrets/application_config /app/resources/application-portainer.yml && /entrypoint.sh" ] environment: SPRING_PROFILES_ACTIVE: prod,swagger,kafka,portainer secrets: - application_config networks: - public depends_on: - postgres deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] labels: - "traefik.enable=true" - "traefik.http.routers.application.rule=Host(`blabla.com`)" - "traefik.http.routers.application.entrypoints=websecure" - "traefik.http.services.application.loadbalancer.server.port=8080" - "traefik.http.routers.application.service=application" secrets: db_password: external: true application_config: external: true networks: public: external: true volumes: data: driver_opts: type: none device: /application-drive/postgres_data o: bind
具体配置方案
仅保证路径一致是不够的,还需处理权限、数据恢复方式、依赖资源配置,以下是分步操作:
1. 准备新服务器的数据路径
- 在新Azure虚拟机上创建对应路径:
mkdir -p /application-drive/postgres_data - 配置PostgreSQL容器所需权限(Postgres容器默认使用UID为999的
postgres用户):chown -R 999:999 /application-drive/postgres_data chmod 700 /application-drive/postgres_data
2. 恢复数据库到目标路径
有两种可靠方式:
方式一:通过容器导入备份
- 先临时启动Postgres容器,挂载目标路径:
docker run -d --name temp-postgres \ -v /application-drive/postgres_data:/var/lib/postgresql/data \ -e POSTGRES_USER=user \ -e POSTGRES_DB=database \ -e POSTGRES_PASSWORD=<原数据库密码> \ postgres:13 - 将本地备份文件(假设为
db_backup.sql)复制到容器内:docker cp db_backup.sql temp-postgres:/tmp/ - 执行恢复命令:
docker exec -it temp-postgres psql -U user -d database -f /tmp/db_backup.sql - 恢复完成后停止并删除临时容器:
docker stop temp-postgres && docker rm temp-postgres
方式二:直接复制Postgres数据目录
如果是从原环境直接复制了Postgres的/var/lib/postgresql/data目录(而非SQL备份),只需将该目录完整复制到新服务器的/application-drive/postgres_data,然后执行步骤1的权限配置即可。
3. 配置Portainer依赖资源
原栈依赖外部资源,需在新Portainer环境中创建:
- Secrets:创建
db_password和application_config两个外部secret,内容与原环境完全一致。 - Network:确保存在名为
public的外部网络,若不存在则创建:docker network create public
4. 部署Portainer栈
- 在Portainer中导入原YAML配置,无需修改卷部分(已保证
device路径与实际恢复路径一致)。 - 启动栈后,检查Postgres容器的healthcheck状态,确认容器正常运行。
5. 验证数据与应用可用性
- 连接PostgreSQL容器验证数据:
docker exec -it <postgres容器ID> psql -U user -d database - 访问应用域名
blabla.com,确认应用能正常连接数据库并提供服务。
内容的提问来源于stack exchange,提问作者Deirdre Rodgers
相关产品推荐
相关产品推荐

