2016-02-26 102 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