Docker的nginx代理与docker-compose v1一起工作,但不是v2?

我正在尝试为我的Docker容器设置一个nginx代理来使用简单的子域而不是端口。 我喜欢用docker-compose来启动我的容器,因为我一般对docker很陌生,所以我马上开始使用v2格式。

我花了相当长的时间弄清楚为什么这个非常stream行,看似简单的使用nginx代理容器不适合我。 事实certificate,这与我使用docker-compose v2有某种关系。

我将发布我第一次使用的docker-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 

这是jenkins容器的例子来testing它:

 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 

现在我将发布实际上为我开箱即用的configuration:

 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容器:

 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有单独的networking正在创build,但与v1(或一个简单的docker run ),他们最终在同一个networking。 使用network_mode: bridge似乎解决了这个问题。

除此之外,这只是docker-compose.yml文件的一个结构性变化,但是必须有一些其他的差别阻止这个设置工作。

由于V1是弃用,我想使用V2格式…我有什么需要改变,使docker – 撰写V2作为像v1,让代理正常工作?

你需要确保容器在同一个networking上。 在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行,则无法find通用的dockernetworking到达容器,并且将无法路由stream量。

我看到,与以下撰写文件:

 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 

我可以validation它:

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

与jenkins,当你旋转了一个单独的撰写文件(实际上是一个单独的撰写项目,默认情况下,当你在一个不同的目录名称),它会得到一个单独的默认networking。 我拥有的最简单的解决scheme是使用外部networking。 首先你直接在docker中创build它:

 $ docker network create proxynet 

然后你的撰写文件将包括该外部networking:

 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 

jenkins也会这样做:

 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