【发布时间】: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 设置为监听localhost 和172.18.0.1:
listen_address = 'localhost,172.18.0.1`
但是,在机器重启时,postgresql 在docker 之前启动,并且由于my.wiki 容器尚未运行,因此主机中不存在接口172.18.0.1,postgresql 无法绑定到它。
我想到了一些潜在的解决方案,但它们都不起作用或不合我的口味:
- 编辑
systemctl的postgresql.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