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