我创建了简单的撰写配置来尝试 Postgres BDR 复制。 我希望容器将主机名作为我定义的服务名称,并且我希望一个容器能够使用该主机名解析并到达另一个容器。我希望这是真的,因为: https://docs.docker.com/compose/networking/
我的配置:
version: '2'
services:
bdr1:
image: bdr
volumes:
- /var/lib/postgresql/data1:/var/lib/postgresql/data
ports:
- "5001:5432"
bdr2:
image: bdr
volumes:
- /var/lib/postgresql/data2:/var/lib/postgresql/data
ports:
- "5002:5432"
但实际上,两个容器都获得垃圾主机名,并且无法通过容器名称访问:
Creating network "bdr_default" with the default driver
Creating bdr_bdr1_1
Creating bdr_bdr2_1
Attaching to bdr_bdr1_1, bdr_bdr2_1
bdr1_1 | Hostname: 938e0585fee2
bdr2_1 | Hostname: 7153165f4d5b
这是一个错误,还是我做错了什么? 我使用 Ubuntu 14.04.4 LTS,Docker 版本 1.10.1,构建 9e83765,docker-compose 版本 1.6.0,构建 d99cad6
最佳答案
docker-compose 为您提供了扩展或缩小服务的选项,这意味着您可以启动同一服务的多个实例。这至少是主机名不仅仅是服务名称的原因之一。您会注意到,如果将 bdr1 扩展到 2 个实例,您将拥有 bdr_bdr1_1 和 bdr_bdr1_2 容器。
您可以通过至少两种方式在 docker-compose 启动的容器内解决此问题:
- 如果某个服务引用其他服务,您可以使用
links
部分,例如将 bdr1 链接到 bdr2。在这种情况下,当您位于 bdr1 内部时,您可以通过名称调用主机 bdr2。我还没有尝试过在这种情况下扩展 bdr2 时会发生什么。 - 您可以使用
hostname
部分在内部将容器的主机名强制设置为您想要的名称。例如,如果您将hostname: bdr1
添加到 bdr1,那么您可以在内部连接到 bdr1,即 bdr1 本身。
您可能可以使用networks
部分获得类似的结果,但我自己还没有使用过它,所以我不确定。
关于docker - docker compose 中未设置主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35642956/