我正在尝试为我的docker容器设置nginx代理,以使用简单的子域而不是端口。我喜欢使用Docker-Compose启动我的容器,并且由于我对Docker的新手很新,因此我立即开始使用V2格式。
我花了很多时间弄清楚为什么这种非常受欢迎且看似易于使用Nginx代理容器对我不起作用。事实证明,这与我使用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容器进行测试的示例:
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
现在,我将发布实际上DID 为我工作的配置:
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一样行动并让代理正确工作?
您需要确保容器在同一网络上。在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