Docker nginx-proxy:容器之间的代理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Docker nginx-proxy:容器之间的代理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3412字,纯文字阅读大概需要5分钟。
内容图文
![Docker nginx-proxy:容器之间的代理](/upload/InfoBanner/zyjiaocheng/964/c144fcb847ed40fdbf041af1dd39f87d.jpg)
我目前正在我公司使用Docker-Compose运行开发堆栈,为开发人员提供编写应用程序所需的一切.
它特别包括:
>一个Gitlab容器(sameersbn/gitlab)来管理私有GIT存储库,
>用于建筑和持续集成的Jenkins容器(library/jenkins),
> Archiva容器(ninjaben/archiva-docker)来管理Maven存储库.
为了通过HTTPS保护服务并将它们暴露给外界,我安装了优秀的nginx-proxy容器(jwilder/nginx-proxy),它允许在容器上使用环境变量进行自动nginx代理配置,以及自动HTTP到HTTPS重定向.
DNS配置为将dockerized服务的每个公共URL映射到主机的IP.
最后,使用Docker-Compose,我的docker-compose.yml文件如下所示:
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /var/config/nginx-proxy/certs:/etc/nginx/certs:ro
postgresql:
# Configuration of postgresql container ...
gitlab:
image: sameersbn/gitlab
ports:
- "10022:22"
volumes:
- /var/data/gitlab:/home/git/data
environment:
# Bunch of environment variables ...
- VIRTUAL_HOST=gitlab.my-domain.com
- VIRTUAL_PORT=80
- CERT_NAME=star.my-domain.com
archiva:
image: ninjaben/archiva-docker
volumes:
- /var/data/archiva:/var/archiva
environment:
- VIRTUAL_HOST=archiva.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
jenkins:
image: jenkins
volumes:
- /var/data/jenkins:/var/jenkins_home
environment:
- VIRTUAL_HOST=jenkins.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
对于开发人员工作站,一切都按预期工作.可以通过https://gitlab.my-domain.com,https://repo.my-domain.com和https://jenkins.my-domain.com访问差异服务.
当其中一个dockerized服务访问另一个dockerized服务时,会发生此问题.例如,如果我尝试从jenkins docker访问https://archiva.my-domain.com,我将从代理获得超时错误.
似乎即使archiva.my-domain.com被解析为来自docker容器的公共主机IP,来自dockerized services的请求也不会被nginx-proxy代理.
据我所知,docker-nginx正在处理来自主机网络的请求,但不关心来自内部容器网络的请求(对于Docker-Compose堆栈,_dockerconfig_default_).
你可以说,为什么我需要使用容器中的代理?当然,我可以使用来自Jenkins容器的URL http:// archiva:8080,它可以工作.但是这种配置不具备可扩展性.
例如,使用Gradle构建来编译一个应用程序,build.gradle需要通过https://archiva.my-domain.com声明我的私有存储库.如果从开发人员工作站启动构建,但不通过jenkins容器启动,它将起作用…
另一个例子是通过OAuth GitLab服务在Jenkins中进行身份验证,其中相同的URL GitLab身份验证需要从外部和Jenkins容器内部获得.
我的问题是:如何配置nginx-proxy来代理从容器到另一个容器的请求?
我没有看到任何讨论这个问题的话题,我对nginx配置构建解决方案的问题不够了解.
任何帮助将非常感激.
解决方法:
BMitch,赔率很高,这确实是一个iptables规则问题,而不是nginx-proxy的错误配置.
表过滤器的链INPUT的默认策略是DROP,并且没有规则来自容器IP(127.20.X.X)的ACCEPT请求.
所以为了记录,如果其他人面临同样的问题,我会提供一些情况的细节.
为了从外部访问容器,Docker对PREROUTING和FORWARD规则规定了允许外部IP从主机IP到容器IP的DNAT.这些默认规则允许任何外部IP,这就是为什么限制对容器的访问需要一些高级iptables自定义.
请参阅此链接以获取示例:http://rudijs.github.io/2015-07/docker-restricting-container-access-with-iptables/
但是如果你的容器需要访问主机资源(在主机上运行的服务,或者在我的情况下,一个nginx-proxy容器监听HTTP / HTTPS主机端口并代理到容器),你需要注意iptables的规则. INPUT链.
实际上,来自容器并发送到主机的请求将由Docker守护程序路由到主机网络堆栈,但是然后需要传递INPUT链(因为请求src IP是主机端).因此,如果您想保护主机资源并让容器访问它们,请不要记得添加如下内容:
iptables -A INPUT -s 127.20.X.X/24 -j ACCEPT
127.20.X.X / 24是运行容器的虚拟网络.
非常感谢你的帮助.
内容总结
以上是互联网集市为您收集整理的Docker nginx-proxy:容器之间的代理全部内容,希望文章能够帮你解决Docker nginx-proxy:容器之间的代理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。