我目前在我的公司中使用 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 服务时,就会出现问题。例如,如果我尝试https://archiva.my-domain.com
从 jenkins docker 访问,我会从代理收到超时错误。
似乎即使archiva.my-domain.com
被解析为来自 docker 容器的公共主机 IP,来自 dockerized 服务的请求也不会被 nginx-proxy 代理。
据我了解,docker-nginx 正在处理来自主机网络的请求,但并不关心来自内部容器网络的请求(_dockerconfig_default_ 用于 Docker-Compose 堆栈)。
你可以说,为什么我需要使用容器中的代理?当然,我可以使用http://archiva:8080
Jenkins 容器中的 URL,它会起作用。但是这种配置是不可扩展的。
例如,使用 Gradle 构建编译一个应用程序,build.gradle 需要通过https://archiva.my-domain.com
. 如果从开发人员工作站启动构建,但不是通过 jenkins 容器启动,它将起作用......
另一个示例是通过 OAuth GitLab 服务在 Jenkins 中进行的身份验证,其中相同的 URL GitLab 身份验证需要从外部和 Jenkins 容器内部都可用。
我的问题是:如何配置 nginx-proxy 将请求从一个容器代理到另一个容器?
我没有看到任何讨论这个问题的话题,我对这个问题的理解还不够,无法在 nginx 配置上构建解决方案。
任何帮助将非常感激。