Docker nginx 代理适用于 docker-compose v1,但不适用于 v2?
Docker nginx proxy works with docker-compose v1, but not v2?
我正在尝试为我的 docker 容器设置一个 nginx proxy 以使用简单的子域而不是端口。我喜欢使用 docker-compose 来启动我的容器,而且由于我对 docker 总体来说还很陌生,所以我立即开始使用 v2 格式。
我花了很多时间弄清楚为什么这个非常流行且看似简单易用的 nginx 代理容器对我不起作用。原来,这与我使用 docker-compose v2.
有某种关系
我将 post 我最初使用的 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 容器:
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
现在我将 post 实际上 为我 开箱即用的配置:
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 时会创建单独的网络,但使用 v1(或简单的 docker run
)时,它们最终会在同一个网络上。使用 network_mode: bridge
似乎解决了这个问题。
除此之外,这只是 docker-compose.yml
文件中的一个结构性变化,但必须有一些其他差异阻止此设置工作。
由于 V1 已弃用,我想使用 v2 格式...我必须更改什么才能使 docker-compose v2 像 v1 一样运行并使代理正常工作?
您需要确保容器在同一个网络上。在 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
行,那么它将无法找到一个公共 docker 网络来到达容器,并且它将无法路由流量.
我在以下撰写文件中看到了这一点:
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
使用 Jenkins 时,当您使用单独的撰写文件(实际上是一个单独的撰写项目,当您在不同的目录名称中时默认发生),它将获得一个单独的默认网络。我拥有的最简单的解决方案是使用外部网络。首先你直接在 docker:
中创建它
$ 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
你会对 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
我正在尝试为我的 docker 容器设置一个 nginx proxy 以使用简单的子域而不是端口。我喜欢使用 docker-compose 来启动我的容器,而且由于我对 docker 总体来说还很陌生,所以我立即开始使用 v2 格式。
我花了很多时间弄清楚为什么这个非常流行且看似简单易用的 nginx 代理容器对我不起作用。原来,这与我使用 docker-compose v2.
有某种关系我将 post 我最初使用的 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 容器:
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
现在我将 post 实际上 为我 开箱即用的配置:
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 时会创建单独的网络,但使用 v1(或简单的 docker run
)时,它们最终会在同一个网络上。使用 network_mode: bridge
似乎解决了这个问题。
除此之外,这只是 docker-compose.yml
文件中的一个结构性变化,但必须有一些其他差异阻止此设置工作。
由于 V1 已弃用,我想使用 v2 格式...我必须更改什么才能使 docker-compose v2 像 v1 一样运行并使代理正常工作?
您需要确保容器在同一个网络上。在 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
行,那么它将无法找到一个公共 docker 网络来到达容器,并且它将无法路由流量.
我在以下撰写文件中看到了这一点:
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
使用 Jenkins 时,当您使用单独的撰写文件(实际上是一个单独的撰写项目,当您在不同的目录名称中时默认发生),它将获得一个单独的默认网络。我拥有的最简单的解决方案是使用外部网络。首先你直接在 docker:
中创建它$ 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
你会对 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