主机名不在docker撰写

我创build了简单的组合configuration来尝试Postgres BDR复制。 我期望容器有主机名称作为我定义的服务名称,我期望一个容器能够parsing并与这个主机名达到另一个。 我期望它是真实的,因为: https : //docs.docker.com/compose/networking/

我的configuration:

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,build d99cad6

docker-compose为您提供了向上或向下扩展服务的选项,这意味着您可以启动同一服务的多个实例。 这是主机名不仅仅是服务名称的至less一个原因。 您会注意到,如果您将bdr1缩放为2个实例,则您将拥有bdr_bdr1_1和bdr_bdr1_2容器。

您可以在由docker-compose启动的容器中解决这个问题,方法至less有两种:

  • 如果服务引用其他服务,则可以使用links部分,例如使bdr1链接到bdr2。 在这种情况下,当你在bdr1里面的时候,你可以通过名字来调用主机bdr2。 在这种情况下,我还没有尝试过放大bdr2时会发生什么情况。
  • 您可以通过使用hostname部分将内部容器的主机名内部强制为所需的名称。 例如,如果将hostname: bdr1添加到bdr1,则可以在内部连接到本身的bdr1。

你可能会得到类似的结果与networks部分,但我还没有使用它自己,所以我不知道。

容器中的主机名应该是简短的容器ID,所以这是正确的(注意有一个与编写1.6.0和短的容器ID错误,所以你应该至less使用版本1.6.2)。 另外/etc/hosts不再被使用,现在有一个embedded式DNS服务器来处理对容器IP地址的parsing名称。

该容器可以被其他具有3个名称的容器发现:容器名称,容器简称和服务名称。

但是,另一个容器在第一个容器启动时可能不会立即可用。 您可以使用depends_on来设置顺序。

如果您正在testing发现,请尝试使用ping,并确保重试,因为名称可能无法立即解决。