我创建了简单的compose配置来尝试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
答案 0 :(得分:2)
docker-compose为您提供了向上或向下扩展服务的选项,这意味着您可以启动同一服务的多个实例。这至少是为什么主机名不仅仅是服务名称的原因之一。您会注意到,如果将bdr1缩放到2个实例,那么您将拥有bdr_bdr1_1和bdr_bdr1_2个容器。
您可以通过至少两种方式在docker-compose启动的容器内解决此问题:
links
部分,例如make bdr1链接到bdr2。在这种情况下,当您在bdr1中时,您可以按名称调用主机bdr2。我没有尝试过在这种情况下扩展bdr2时会发生什么。hostname
部分在内部强制容器的主机名为您想要的名称。例如,如果您将hostname: bdr1
添加到bdr1,那么您可以在内部连接到bdr1,它本身就是。您可以使用networks
部分获得类似的结果,但我自己还没有使用它,所以我不确定。
答案 1 :(得分:0)
容器内的主机名应该是短容器ID,所以这是正确的(注意Compose 1.6.0和短容器ID存在错误,所以你应该至少使用版本1.6.2)。此外,/etc/hosts
不再使用,现在有一个嵌入式dns服务器,它处理解析容器ip地址的名称。
容器可由具有3个名称的其他容器发现:容器名称,容器短ID和服务名称。
但是,第一个容器启动时可能无法立即使用另一个容器。您可以使用depends_on
来设置订单。
如果您正在测试发现,请尝试使用ping,并确保重试,因为该名称可能无法立即解析。