当前位置: 首页 > 面试题库 >

Docker Nginx代理:容器之间的代理

夏侯鹏
2023-03-14
问题内容

我目前在公司中使用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.comhttps://repo.my- domain.comhttps://jenkins.my-domain.com

当其中一个dockerized服务访问另一个dockerized服务时,就会发生此问题。例如,如果尝试https://archiva.my- domain.com从jenkins docker 访问,则会从代理收到超时错误。

似乎即使将archiva.my-domain.com其解析为 来自Docker 容器的公共主机IP,
来自dockerized服务的请求也不会被nginx-proxy代理。

据我了解,docker-nginx正在处理来自主机网络的请求,但并不关心来自内部容器网络(对于Docker-
Compose堆栈为_dockerconfig_default_)的请求。

您可能会说,为什么我需要使用容器中的代理?当然,我可以使用http://archiva:8080Jenkins容器中的URL
,它可以工作。但是这种配置是不可扩展的。

例如,使用Gradle构建来编译一个应用程序,build.gradle需要通过声明我的私有存储库https://archiva.my- domain.com。如果从开发人员工作站启动构建,但不能通过jenkins容器启动构建,它将起作用。

另一个示例是通过OAuth GitLab服务在Jenkins中进行身份验证,其中需要在Jenkins容器的外部和内部 可以使用相同的URL
GitLab身份验证。

那么我的问题是: 如何配置nginx-proxy以将请求从一个容器代理到另一个容器?

我没有看到任何讨论此问题的主题,并且我对问题的理解还不足以在nginx配置上构建解决方案

任何帮助将非常感激。


问题答案:

BMitch,赔率很好,这的确是iptables规则的问题,而不是nginx-proxy的错误配置。

该表的默认链INPUT策略filterDROP,并且未对ACCEPT来自容器IP(127.20.XX)的请求制定任何规则。

因此,为了记录在案,我提供了一些其他人遇到相同问题时的情况的详细信息。

为了从外部访问容器,Docker在PREROUTING和FORWARD规则上设置了规则,以允许将外部IP从主机IP映射到容器IP。这些默认规则允许任何外部IP,这就是为什么限制对容器的访问需要一些高级iptables自定义的原因。

请参阅此链接以获取示例:http : //rudijs.github.io/2015-07/docker-
restricting-container-access-with-
iptables/

但是,如果您的容器需要访问主机资源(在主机上运行的服务,或者在我的情况下是侦听HTTP /
HTTPS主机端口并代理到容器的nginx代理容器),则需要注意容器中的iptables规则输入链。

实际上,来自容器并发给主机的请求将由Docker守护程序路由到主机网络堆栈,
随后需要传递INPUT链(因为请求srcIP是主机的IP)。因此,如果您想保护主机资源并允许容器访问它们,请不要记得添加以下内容:

iptables -A INPUT -s 127.20.X.X/24 -j ACCEPT

其中127.20.XX / 24是运行容器的虚拟网络。

非常感谢您的帮助。



 类似资料:
  • 以下是我对这些的理解,我看到了很少的差距;特别是何时何地使用 HTTP(s)代理: 可用作TLS终止代理 可用于修改HTTP标头 可用作DMZ前面的负载均衡器或公共IP提供程序,以屏蔽后端服务器 TCP代理 可以用作TCP连接的反向代理,不仅支持HTTP而且支持其他应用层协议,如FTP 我的问题 如果我只接受HTTP web流量,我们应该使用TCP代理而不是HTTP代理的用例是什么 这种理解是连接

  • 我在编写一个非常庞大的mib时遇到了问题,因为我只有一个代理与许多没有snmp的设备连接。所有设备都通过推送将相同类型的数据发送到代理,然后代理将snmp陷阱发送到snmp管理器。此外,Manager正在向代理发送SNMP GET。我想编写一个标准的mib,它适用于每个设备,管理器只需发送一些OID来获取对应的值,而不是数百个OID。一个非常庞大的mib意味着有很多分支。

  • 本文向大家介绍Spring中JDK动态代理和CGLib代理之间的区别,包括了Spring中JDK动态代理和CGLib代理之间的区别的使用技巧和注意事项,需要的朋友参考一下 Spring AOP是基于代理的。Spring使用了两种代理策略,一种是JDK动态代理,另一种是CGLIB代理。 JDK提供了JDK动态代理。它只能是按接口的代理,因此目标类需要实现接口。在您实现一个或多个接口时,spring会

  • 我尝试在使用相同nodejs应用程序的两个容器之间实现nginx反向代理负载平衡。 目录结构: docker撰写。yml:

  • 行动时刻 - 在两个组织之间配置代理 我们将从my-org.com的FreeRADIUS服务器开始: 编辑位于FreeRADIUS配置目录下的用户文件,并确保以下alice条目存在: "alice" Cleartext-Password := "passme" Tunnel-Type = VLAN, Tunnel-Medium-Type = IEEE-802, Tunnel-Private-Gro

  • 我有两个docker容器由docker compose管理,似乎无法正确使用webpack将某些请求代理到后端api。 docker-compose.yml: 服务web是一个简单的react应用程序,由webpack开发服务器提供服务。服务返回是一个节点应用程序。 我没有问题从我的主机访问任何应用程序: 我还可以从web容器ping和curl back服务: 但是我有一个问题与代理。Webpac