2016-02-26 104 views
1

我创建了简单的组合配置来尝试Postgres BDR复制。 我期望容器具有主机名作为我定义的服务名称,我期望一个容器能够使用此主机名解析并到达另一个容器。我希望,因为它是真实的: https://docs.docker.com/compose/networking/主机名未在Docker中设置

我的配置:

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

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

您可以解决这一点,被启动的容器内码头工人,组成至少在两个方面:如果一个服务是指其他服务

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

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

+0

谢谢。我试图明确定义主机名,但不会将其他容器添加到/ etc/hosts,因此bdr1对bdr2一无所知。我也尝试过链接,但是我需要bdr1将bdr2和bdr2链接到bdr1链接,这是不允许的。 Docker文档中写的东西正是我想要的,但似乎并不奏效。 –

0

容器内部的主机名应该是短容器ID,所以这是正确的(注意,Compose 1.6.0和简短的容器ID有一个错误,所以你至少应该使用1.6.2版本)。另外/etc/hosts不再使用,现在有一个嵌入式DNS服务器处理解析名称到容器IP地址。

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

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

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

+0

我试图设置复制和postgres说bdr1不能解决从bdr2尝试时,反之亦然。 –

+1

那么https://docs.docker.com/compose/networking/是完全和完整的谎言? –

+0

该文档最近更新了,它应该是正确的。你认为什么是不正确的?内部主机名和“可发现”主机名有所不同。只有一个内部名称,但有许多可发现的名称。 – dnephin