未在docker compose中设置主机名

未在docker compose中设置主机名,docker,docker-compose,Docker,Docker Compose,我创建了简单的compose配置来尝试Postgres BDR复制。 我希望容器将主机名作为我定义的服务名,并且我希望一个容器能够解析并访问另一个具有此主机名的容器。我希望这是真的,因为: 我的配置: version: '2' services: bdr1: image: bdr volumes: - /var/lib/postgresql/data1:/var/lib/postgresql/data ports: - "5001:543

我创建了简单的compose配置来尝试Postgres BDR复制。 我希望容器将主机名作为我定义的服务名,并且我希望一个容器能够解析并访问另一个具有此主机名的容器。我希望这是真的,因为:

我的配置:

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
是虫子,还是我做错了什么?
我使用Ubuntu14.04.4 LTS,Docker版本1.10.1,build 9e83765,Docker compose版本1.6.0,build d99cad6,Docker compose为您提供了向上或向下扩展服务的选项,这意味着您可以启动同一服务的多个实例。这至少是主机名不仅仅是服务名的一个原因。您会注意到,如果将bdr1扩展到2个实例,那么将有bdr_bdr1_1和bdr_bdr1_2容器

您可以在docker compose启动的容器中至少通过两种方式解决此问题:

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

您可能会在
networks
部分获得类似的结果,但我自己还没有使用它,因此我不确定。

容器中的主机名应该是短容器id,因此这是正确的(注意,Compose 1.6.0和短容器id存在错误,因此您至少应该使用1.6.2版)。另外,不再使用
/etc/hosts
,现在有了一个嵌入式dns服务器,可以将名称解析为容器ip地址

该容器可由具有3个名称的其他容器发现:容器名称、容器短id和服务名称

但是,当第一个容器启动时,另一个容器可能无法立即使用。您可以使用
dependens\u on
设置顺序


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

谢谢。我试图显式定义主机名,但它不会向/etc/hosts添加其他容器,因此bdr1对bdr2一无所知。我也尝试了链接,但我需要bdr1到bdr2和bdr2到bdr1的链接,这是不允许的。docker docs中写的东西正是我想要的,但它似乎不起作用。我正在尝试设置复制,postgres说,当从bdr2尝试时,bdr1无法解决,反之亦然。该文档最近更新,应该是正确的。你认为有什么不正确的地方?内部主机名和“可发现”主机名之间存在差异。只有一个内部名称,但有许多可发现的名称。另外,很抱歉我之前错过了这个,您应该升级到Compose 1.6.2,1.6.0中有一个短id的错误。