使用docker-compose时如何安全地停止/启动我的Postgres服务器

时间:2018-09-30 16:22:47

标签: postgresql docker

当我在应用程序中发布新功能时,有时我会非常频繁地停止/启动docker。

docker-compose up -d
docker-compose stop

我正在使用几乎所有的postgres docker设置(请参阅下文)。 我正在将/ data文件夹映射到我的主机。

如果我一天中多次停止/启动docker,是否有数据损坏的事情?

调用docker-compose stop是停止我的postgres实例的最佳方法吗?

我在docker-compose中的postgres服务如下:

  db:
    image: postgres:9.4
    volumes:
      - "/home/deploy/data/pgdata:/var/lib/postgresql/data"
    restart: always

此设置目前在开发中运行顺利,但是一旦投入生产,我想确保自己遵循最佳实践等。

2 个答案:

答案 0 :(得分:2)

特别是数据库的设计通常使数据丢失非常困难,即使机器在向磁盘写入某些内容时掉电了也是如此。 (这要付出一些性能上的代价。)只要您一次使用同一后备数据存储区没有一个以上的PostgreSQL实例,我希望它不会丢失数据或破坏自身。您应该期望看到的最糟糕的情况是启动时出现一条消息,表明它正在从预写日志或类似内容中恢复。

docker stop将向容器发送一个信号,提示它彻底关闭,而PostgreSQL将以此为提示关闭。看起来像docker-compose stopdocker-compose down,并且向docker-compose up发送^ C都使用相同的机制。因此,您现在执行的方式应该会导致干净关闭(假设PostgreSQL在10秒内完成清理)。

我相信您可以docker-compose restart特定服务,或docker-compose up --force-recreate。如果您重建了应用程序容器并需要重新启动它,而不是重新启动它的数据库,这将有所帮助。

答案 1 :(得分:1)

使用

docker-compose down -v

它的作用基本上是删除您添加的所有卷。如果您不这样做,那么这些卷将挂断并占用您的空间。它仅删除docker容器内的卷。如果您希望该数据在容器删除后仍然存在,则主机中的卷将保留并在容器删除后继续存在。

每当您通过docker run创建Docker容器时,Docker都会创建一个volume /目录来保留有关容器的详细信息。执行docker run后,如果查看/var/lib/docker/containers,将为启动的每个容器看到一个目录。如果尚未删除先前容器的卷,则会在“容器”目录下看到许多目录。这些目录的名称将是非常长的随机字母和数字。因此,如果您在停止容器时不告诉docker删除这些目录,它将永远存在。我上面提到的v选项将在您卸下容器时删除这些目录。 请注意,您只能以root用户身份查看目录/var/lib/docker的内容。要更改为root用户,请在尝试查看目录内容之前使用sudo -i