我如何在docker中备份数据库

时间:2016-08-29 15:48:59

标签: postgresql docker

我使用docker-compose和以下yml文件

运行我的应用程序
  postgres:
    container_name: postgres
    image: postgres:${POSTGRES_VERSION}
    volumes:
      - postgresdata:/var/lib/postgresql/data
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=42EXP
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  node:
    container_name: node
    links:
      - postgres:postgres
    depends_on:
      - postgres

volumes:
  postgresdata:

正如您在此处所见,我正在使用named volume来管理postgres状态。

根据官方文档,我可以备份如下的卷

docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

其他一些教程建议我使用postgres提供的pg-dump函数进行备份。

pg_dump -Fc database_name_here > database.bak

我想我必须进入postgres容器才能执行此功能并将备份目录挂载到主机。

一种方法比另一方更好/更好吗?

3 个答案:

答案 0 :(得分:39)

要运行pg_dump,您可以使用docker exec命令:

备份:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

删除db(不要在生产中执行此操作,仅用于测试目的!!!):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

恢复:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

你也可以使用docker-compose模拟exec。在这种情况下,您可以使用短服务名称(postgres)而不是完整容器名称(composeproject_postgres)。

docker exec

docker-compose exec

pg_restore

答案 1 :(得分:0)

我只是提交运行数据库的容器。然后,我将该新映像推送到我的私人注册表中。无论应用程序或数据库发生什么情况,我都可以随时将其从注册表中拉出并立即安装。

docker commit [container-name] [domain:port/'new-image-name']

然后,我将图像推送到注册表中。

docker push [new-image-name]

如果我需要恢复该数据库,只需将其从自己的注册表中拉出即可。

docker pull [domain:port/'new-image-name']

因此,为了澄清一下,这是: [domain:port /'new-image-name']

应如下所示: myregistrydomain.com:5000/dbSep

答案 2 :(得分:0)

自从有了

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
</head>

<body>
  <table>
    <tbody>
      <tr>
        <td></td>
        <td colspan="100" class="table_title_top">
          <div>Title Top Title Top</div>
        </td>
      </tr>
      <tr class="calc-tr calc-tr-title">
        <td rowspan="100" class="table_title_left">
          <div>Title Left Title Left</div>
        </td>
        <td>0</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>0</td>
        <td>0</td>
        <td>0</td>
      </tr>
      <tr>
        <td>0</td>
        <td>0</td>
        <td>0</td>
      </tr>
    </tbody>
  </table>
</body>

</html>

您可以运行

expose:     
 - "5432"

pg_dump将连接到5432端口进行转储,因为容器中的postgres使它丢失了,您将从容器中转储db