Postgresql and Docker



我们有一个应用程序,它被拆分为几个git存储库:

  1. WebApp Git存储库(Django+Postgres+Celery)
  2. 工人(Python+Celery)

这样,我们还需要一个rabbitmq服务器。我能够成功地对第一个WebApp进行dockerize,但我对dockerize有一些问题,尤其是对Postgres有一些问题。

今天,我们有一个数据库,供我们的webbApp使用。这个数据库是在Postgres Container中创建的,使用的是我们在/docker-entrypoint-initdb.d中放置的脚本,如官方Postgres容器中指定的那样。

如果明天,我有第二个web应用程序,需要使用postgres数据库,我是否绝对需要修改我当前的postgres容器来创建新的数据库?用这个特定的数据库创建一个新的postgres容器更好吗?还有一件事我有困难:我的容器中的数据不是持久的。当容器停止时,所有写在postgres容器中的数据都将被销毁。docker的兼容解决方案是什么,可以保持这些数据的持久性?

谢谢你的帮助。

您应该使用数据卷使数据持久化。

docker run -v /var/lib/postgresql/data --name dbdata busybox /bin/true
docker run --volume-from dbdata postgresql # and additional parameters

要创建新数据库,可以使用nsenter 输入容器

# start the shell in a container
ne() {
pid=$(docker inspect --format '{{.State.Pid}}' $1)
env SHELL='/bin/bash' sudo -E nsenter --target $pid 
--mount --uts --ipc --net --pid
}

ne my_postgresql_container

(参考:http://docs.blowb.org/setup-host/docker.html)

如果您想更频繁地使用该函数,可以将其保存到.bashrc文件中。

在那里,启动postgresql客户端并运行sql语句来创建数据库。

postgres数据库实例有两种思想流派。

  • 为所有应用程序创建一个单独的数据库,然后可以进行单独的备份和wal日志文件以及复制
  • 为每个应用程序创建一个数据库容器。这是每个应用程序都对其数据库负责。我更喜欢这种方法,因为应用程序之间不需要任何合作

至于数据放在哪里,它可以:

  • 进入postgres容器
  • 进入一个只包含数据的容器,并使用来自postgres容器的--volumes装载它。仅数据容器可以使用与postgres容器相同的映像
  • 转到主机本身,数据就从主机装入。这可能是最安全的选择,因为数据没有连接到容器

这是一个棘手的问题,尤其是当你开始使用docker compose、fleet、swarm、kubernetes等进行编写时。你不希望你的数据库数据消失。

只要你定期备份数据库,你就有一个"容器外"的最坏情况恢复选项。如果您还将事务日志复制到另一台主机,那么您可以使用备份+事务日志恢复到几乎当前版本。或者,您可以使用复制数据库并将数据管道传输到另一个容器,这样,如果主数据库出现故障,您就可以将其保存在备份容器中。

对我来说,如果数据库是大的和中心的,那么在docker之外管理数据库并用使用它的容器指向它是有意义的,但这只是我的观点:-)

最新更新