2016-03-22 211 views
22

初學者碼頭工人的問題在這裏,本地主機名的Docker容器

所以我在我運行一個模塊化的應用程序開發環境,它是使用泊塢窗撰寫運行3個容器的工作:服務器,客戶端,數據庫。

docker-compose.yml看起來是這樣的:

############################# 
# Server 
############################# 
server: 
    container_name: server 
    domainname: server.dev 
    hostname: server 
    build: ./server 
    working_dir: /app 
    ports: 
    - "3000:3000" 
    volumes: 
    - ./server:/app 
    links: 
    - database 

############################# 
# Client 
############################# 
client: 
    container_name: client 
    domainname: client.dev 
    hostname: client 
    image: php:5.6-apache 
    ports: 
    - "80:80" 
    volumes: 
    - ./client:/var/www/html 

############################# 
# Database 
############################# 
database: 
    container_name: database 
    domainname: database.dev 
    hostname: database 
    image: postgres:9.4 
    restart: always 
    environment: 
    - POSTGRES_USER=postgres 
    - POSTGRES_PASSWORD=root 
    - POSTGRES_DB=dbdev 
    - PG_TRUST_LOCALNET=true 
    ports: 
    - "5432:5432" 
    volumes: 
    - ./database/scripts:/docker-entrypoint-initdb.d # init scripts 

你可以看到我指定一個.dev域名,以每個人,這工作正常,看一臺機器從另一個(泊塢窗內部網絡),例如我在這裏從client.dev的CLI查驗server.dev

[email protected]:/var/www/html# ping server.dev 
    PING server.dev (127.0.53.53): 56 data bytes 
    64 bytes from 127.0.53.53: icmp_seq=0 ttl=64 time=0.036 ms 

這種內部的偉大工程,但不是我的主機操作系統的網絡上。

爲方便起見,我想在我的本地網絡中分配域名,而不是在Docker容器網絡中,以便我可以在我的瀏覽器URL中鍵入:client.dev並加載Docker容器。

現在

,我只能訪問,如果我使用泊塢IP,這是動態的:

client: 192.168.99.100:80 
server: 192.168.99.100:3000 
database: 192.168.99.100:5432 

是否有自動/方便的方式來做到這一點,不涉及我手動添加到IP我的/ etc/hosts文件?

順便說一句我在OSX上,如果有任何相關性。

謝謝!

編輯:我發現這個Github的問題,這似乎是相關的:https://github.com/docker/docker/issues/2335

據我瞭解,他們似乎說,它的東西是不可用盒子的外面,他們建議外工具,如:

這是正確的嗎?如果是這樣,我應該在特定場景中選擇哪一個?

+0

我從來沒有使用docker,但127.0.0.0/8範圍內的IPv4地址被定義爲環回。這將不允許任何機器外的通信 – infixed

+0

這不是一個碼頭問題,因爲它是一個網絡問題。你想知道你的hostOS如何擁有動態主機別名(如果docker的ip變化)yes?我想你可以結合一個'docker ps -a | grep 192'命令,其中的概念來自https://books.google.com/books?id=HggtWI1ShvMC&pg=PT142&lpg=PT142&dq=how+to+set+a+host+alias+as+an+environment+variable+/etc/hosts&source = BL&OTS = PSOwZZOwVs與SIG = TEHiz2Ef_a36AEhXigSAi0hWsI0&HL = EN&SA = X&VED = 0ahUKEwjdmpz-tdTLAhUIy2MKHZW3CTcQ6AEIWDAJ#v = onepage&q =如何%20to%20set%20A%20host%20alias%20AS%20AN%20environment%20variable%20%2Fetc%2Fhosts&F =假 – CtheGood

回答

11

OK,

這樣以來it seems that there is no native way to do this with Docker,我終於選擇了這個alternate solution從瑞安·阿姆斯特朗,其中包括在動態更新/etc/hosts文件。

我之所以選擇這個,是因爲它對我來說很方便,因爲它作爲一個腳本工作,並且我已經有了一個啓動腳本,所以我可以將這個函數添加到它中。

以下示例將創建一個名爲docker的hosts條目。本地這 將解決你的泊塢窗機IP:

update-docker-host(){ 
    # clear existing docker.local entry from /etc/hosts 
    sudo sed -i '' '/[[:space:]]docker\.local$/d' /etc/hosts 

    # get ip of running machine 
    export DOCKER_IP="$(echo ${DOCKER_HOST} | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" 

    # update /etc/hosts with docker machine ip 
    [[ -n $DOCKER_IP ]] && sudo /bin/bash -c "echo \"${DOCKER_IP} docker.local\" >> /etc/hosts" 
} 

update-docker-host 

這將自動添加或UDPATE我的主機操作系統的/etc/hosts線,當我通過我的啓動腳本啓動泊塢窗機。

不管怎麼說,正如我在我的研究過程中發現,除了編輯hosts文件,你也可以通過setting up a custom DNS server解決這個問題:

還發現在Github上幾個項目,這顯然旨在解決這個問題,儘管我沒有試戴:

4

擴展@ eduwass自己的答案,這是我手動(沒有腳本)做的。

  1. 正如在問題中提到,定義domainname: myapp.devhostname: wwwdocker-compose.yml文件
  2. 帶上你的Docker容器正常
  3. 運行docker-compose exec client cat /etc/hosts得到容器的hosts文件的輸出(其中client是你的服務名稱) (輸出例如:172.18.0.6 www.myapp.dev
  4. 打開您丟失(主機)/etc/hosts文件,並添加一行:172.18.0.6 server.server.dev

如果您的Docker服務容器更改IP或做任何事情都會想要更復雜的解決方案,但此時此功能正滿足我的簡單需求。

+0

我正在尋找在這個所有的互聯網。非常感謝 – Malaba

0

爲了使本地主機的整個域名可以使用dnsmasq。在這種情況下,如果您選擇域.dev任何子域都會指向您的容器。但是你要知道problems.dev

或者你可以使用bash腳本啓動您的碼頭工人,撰寫它在啓動將增加行到/ etc/hosts和你殺了這個過程中這條線將刪除後

#!/usr/bin/env bash 

sudo sed -i '1s;^;127.0.0.1 example.dev\n;' /etc/hosts 

trap 'sudo sed -i "/example.dev/d" /etc/hosts' 2 

docker-compose up 
相關問題