主机名未在docker compose中设置

时间:2016-02-26 03:35:23

标签: docker docker-compose

我创建了简单的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

2 个答案:

答案 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,并确保重试,因为该名称可能无法立即解析。