You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:27:08