2017-05-03 94 views
2

我想爲我的碼頭集裝箱設置一個nginx proxy,以使用簡單的子域而不是端口。我喜歡用docker-compose來啓動我的容器,而且由於我對碼頭工人一般都很陌生,所以我開始馬上使用v2格式。Docker nginx代理與docker-compose v1一起工作,但不是v2?

我花了一段時間弄清楚爲什麼這個非常流行,看似簡單的使用nginx代理容器不適合我。事實證明,這與我使用docker-compose v2有關。

我會後我用第一泊塢窗,compose.yml文件,這並沒有出於某種原因:

version: '2' 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    network_mode: bridge 
    ports: 
     - 80:80 
     - 443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    network_mode: bridge 
    environment: 
     - VIRTUAL_HOST=whoami.local 

這就是例子詹金斯容器來測試它:

version: "2" 

services: 
    jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    network_mode: bridge 
    expose: 
     - 8080 
     - 50000 
    ports: 
     - 8080:8080 
     - 50000:50000 
    volumes: 
     - /srv/jenkins:/var/jenkins_home 
    environment: 
     - VIRTUAL_HOST=jenkins.domain.com 
     - VIRTUAL_PORT=8080 

現在,我將發佈配置實際上工作開箱對我來說:

nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
    - 80:80 
    - 443:443 
    volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
    - ENABLE_IPV6=true 
    - DEFAULT_HOST=domain.com 

whoami: 
    image: jwilder/whoami 
    environment: 
    - VIRTUAL_HOST=whoami.local 

而對於詹金斯容器:

jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    expose: 
    - 8080 
    - 50000 
    ports: 
    - 8080:8080 
    - 50000:50000 
    volumes: 
    - /srv/jenkins:/var/jenkins_home 
    environment: 
    - VIRTUAL_HOST=jenkins.domain.com 
    - VIRTUAL_PORT=8080 

唯一的區別我看到的是去除network_mode: bridge。我補充說,當我注意到v2有單獨的網絡被創建,但是v1(或簡單的docker run),他們最終在同一個網絡上。使用network_mode: bridge似乎解決了這個問題。

除此之外,這只是docker-compose.yml文件的結構更改,但必須存在一些其他差異才能阻止此設置的運行。

由於V1已棄用,我想使用v2格式...我需要更改哪些內容才能使docker-compose v2的行爲如同v1並讓代理正常工作?

+0

是什麼錯誤你看到了嗎? – BMitch

+0

實際上沒有錯誤。代理只是不工作,不會將請求轉發給其他容器。 – noone

回答

2

您需要確保容器位於同一網絡上。在nginx-proxy中,如果它無法到達節點,它將不會添加上游設置。你應該看到:

$ docker exec -it nginx-proxy cat /etc/nginx/conf.d/default.conf 
# .... 
# whoami.local 
upstream whoami.local { 
           ## Can be connect with "nginxproxy_default" network 
         # nginxproxy_whoami_1 
         server 172.19.0.3:8000; 
} 
# .... 

如果上游部分是空的,沒有註釋和server線,那麼它是無法找到一個共同的泊塢窗網絡進入容器,它將不能夠路由通信。

我看到與以下撰寫文件:

version: '2' 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
     - 8080:80 
     - 8443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    environment: 
     - VIRTUAL_HOST=whoami.local 

而且我可以驗證:

$ curl -H "Host: whoami.local" http://localhost:8080 
I'm b066afdb6e45 

隨着詹金斯,當你旋轉說了一個單獨的撰寫文件(實際上是一個單獨的撰寫項目,當你使用不同的目錄名稱時,默認情況下會發生),它將獲得一個單獨的默認網絡。我擁有的最簡單的解決方案是使用外部網絡。首先,你直接在泊塢窗創建它:

$ docker network create proxynet 

然後您撰寫的文件將包括外部網絡:

version: '2' 

networks: 
    proxynet: 
    external: true 

services: 
    nginx-proxy: 
    image: jwilder/nginx-proxy:alpine 
    container_name: nginx-proxy 
    ports: 
     - 8080:80 
     - 8443:443 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    networks: 
     - proxynet 
    environment: 
     - ENABLE_IPV6=true 
     - DEFAULT_HOST=domain.com 

    whoami: 
    image: jwilder/whoami 
    environment: 
     - VIRTUAL_HOST=whoami.local 
    networks: 
     - proxynet 

你會做同樣的詹金斯:

version: "2" 

networks: 
    proxynet: 
    external: true 

services: 
    jenkins: 
    image: jenkins:2.46.2-alpine 
    restart: always 
    hostname: jenkins.domain.com 
    networks: 
     - proxynet 
    expose: 
     - 8080 
     - 50000 
    ports: 
     - 8080:8080 
     - 50000:50000 
    volumes: 
     - /srv/jenkins:/var/jenkins_home 
    environment: 
     - VIRTUAL_HOST=jenkins.domain.com 
     - VIRTUAL_PORT=8080 
+0

感謝您的回答。我將在稍後測試它並驗證它是否有效。但我不明白:爲兩個容器設置共享的外部網絡,還是在兩者中都使用「network_mode:bridge」將它們放在同一個默認橋接網絡上的區別在哪裏? – noone

+0

我需要測試它,但bridge是默認的網絡模式,所以它可能會繼續執行默認的功能,它爲每個項目創建一個獨特的網絡(v2功能)。 – BMitch

+0

列出網絡不會列出任何其他網絡(除了默認的3個網絡)。但是,如果沒有'network_mode:bridge',則有2個額外的網絡(一個用於nginx,一個用於jenkins)。 – noone

相關問題