【问题标题】:Docker container + postgresql interface dependencyDocker容器+postgresql接口依赖
【发布时间】:2020-05-23 18:06:01
【问题描述】:

我是 docker 世界的新手,遇到了一个我不知道如何解决的情况。

基本上,我有一个在 Ubuntu 20.04 服务器内运行 wiki.js 的容器,与仅为此类容器创建的 docker 网络相关联:

sudo docker network create --subnet=172.18.0.0/16 my.wiki.net

sudo docker run -d --net my.wiki.net --name my.wiki \
                -restart=unless-stopped \
                /* other args */ \
                requarks/wiki:2

另一方面,在容器内,wiki 设置为连接到172.18.0.1 以与 postgresql 对话。

最后,postgresql 设置为监听localhost172.18.0.1

listen_address = 'localhost,172.18.0.1`

但是,在机器重启时,postgresqldocker 之前启动,并且由于my.wiki 容器尚未运行,因此主机中不存在接口172.18.0.1,postgresql 无法绑定到它。

我想到了一些潜在的解决方案,但它们都不起作用或不合我的口味:

  • 编辑systemctlpostgresql.service配置文件,添加after关系,确保docker之前启动,所以界面存在:我不喜欢这个解决方案,因为我不想在服务之间创建了这种直接依赖关系。我想让一切都以最懒惰的方式运行。
  • 使用重试策略配置postgresql,使其在某个时间间隔内尝试绑定到它,足以创建接口:我认为postgresql不提供这种自定义(我搜索了它没有成功)。
  • 使 postgresql 绑定到任何 (*) 接口:是的,它肯定会起作用(我仍然有 pg_hba.conf 作为第二层保护),但我不确定它从安全性甚至性能方面。你会向我推荐这种方法吗?
  • 通过重新启动手动创建一个系统范围的接口持久化并使wiki.js容器对其具有可见性:首先我不知道该怎么做,其次从设计的角度来看它有一些影响:如果我运行了第二个需要 postgresql 的容器,之前创建的接口的语义是什么?
    • 这是一个仅用于wiki.js 数据库访问的接口,因此我必须手动为第二个容器创建第二个接口以遵循设计。缺点是:如果你有n 容器,你最终会得到2 * n 接口,n 用于容器的外部可见性(因为,除非它们需要相互通信,否则我更愿意创建一个每个单独的 docker 用户自定义子网),n 用于他们的数据库通信。
    • 对于所有需要postgresql 访问权限的容器来说,这是一个独特的接口,所以它是一种“postgresql-docker` localhost:是的,我可以接受,虽然我不知道该怎么做(我不知道如何正确创建接口),而且,似乎我正在改变我的设计以适应缺陷,而不是解决缺陷(当 postgresql 运行时接口不存在并且它不会重试稍后)。

因此,任何建议、替代设计或实现我上述任何建议的步骤都将受到欢迎。

【问题讨论】:

  • 另一个潜在的解决方案 - 将 Postgres 迁移到 Docker。
  • @AlexanderPavlov 但是如何确保这些容器也以正确的顺序初始化?
  • 如果你使用 docker-compose 那么你可以指定依赖。另外,我不知道wiki 应用程序是如何实现的,但是如果它在 PG 不可用时失败,那么 Docker 会尝试重新启动它,所以最终它会在 PG 启动时连接它。
  • wiki 可以以尝试重新连接PG的方式实现,因此最终会没事的。即使使用当前的 PG,您也可以对其进行测试 - 只需禁用它并重新启动框
  • @AlexanderPavlov 恰恰相反,wiki尝试连接多次,问题是PG没有监听wiki尝试连接的地址,因为相应的接口不存在时PG 运行,因为接口是在启动 wiki 容器时创建的,并且发生在 PG 之后。因此,一旦容器运行,我必须重新启动 PG。

标签: postgresql docker networking


【解决方案1】:

SystemD 服务描述符也允许使用“Before”子句。这会转换为提到的其他服务的 After 子句。

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

此外,您可能希望将网络创建拆分为 Type=oneshot 服务,并使您的 wiki.js 服务双重依赖于 postgres 和该 network-oneshot 单元。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2021-03-23
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2021-11-27
    • 2021-02-03
    相关资源
    最近更新 更多