2017-05-03 54 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

相关问题