如何使来自两个不同项目的两个docker容器相互通信?

问题:

您在 docker-compose 项目下有一个容器,您想要通信或访问另一个容器,该容器存在于第二个 docker-compose 项目下

现实生活中的情况?

  • 对于某些安全策略,您的 SysOp 或托管服务提供商会阻止所有外部流量,端口 80 (HTTP) 或端口 443 (HTTPS) 的流量除外。但是,您想在您的机器上设置和管理多个 Web(或非 Web)服务,基本上使用 docker 容器并由 docker-compose 管理。

  • 要处理此问题,您需要使用专用的 docker-compose 项目和容器(称为代理)设置反向代理。

  • 代理容器/项目在端口 80 上侦听所有传入的外部请求。 (nginx config 可以通过 server_name 指令区分被调用的域)

  • 另一方面,在另一个 docker-compose 项目中,您有一个 Kibana 服务,它为 kibana.exemple.com 上的请求提供服务,但在端口 5601 下(仍然是 HTTP 流量)。

  • Kibana 服务位于名为 kibana 的专用容器上,位于 ELK docker-compose 项目(不同于反向代理项目)中的其他三个容器中。

  • 解决方案如您所料,reverse-proxy 将外部http://kibana.exemple.com:80转发到内部http://kibana:5601,再转发到解决端口限制问题。

  • 我们要打http://kibana:5601 端点时使用的 kibana 域名,实际上是外界不知道的,甚至主机也不知道(原则上),它只能由 docker built 内部解析-in DNS 将其映射到 kibana 容器。

  • 这里的问题是,kibana容器所属的网络是内部的,只在kibana容器所属的ELK docker compose projcet内可见。

  • 然而,我们希望位于单独项目中的反向代理容器能够在没有太多样板工作的情况下到达该端点。

解决方案?

  • 幸运的是,docker-compose 提供了一种简单的方法来解决这种情况,那就是外部网络。

  • 必须在 docker-compose 配置之外定义外部网络(通过 docker-compose 命令的一种方式)

  • 两个网络都应该加入这个网络,仅此而已。

  • 现在您可以从一侧或另一侧通过容器名称来引用容器,就好像它们在同一个项目中一样

  • 这是官方 docker-compose 如何定义该功能的:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s–yG0VQv2j–/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/j65kwt2p5eiqbtv0ev9n.png)

如何让它工作?

  • 从命令行创建一个外部网络,这里我们假设你将它命名为proxy_external
$ docker network create proxy_external 

进入全屏模式 退出全屏模式

  • 在_reverse-proxy_项目的docker-compose.yml的services→proxy→networks级别下添加proxy_external

  • 直接在elk项目的docker-compose.yml的networks层下添加proxy_external。将此定义为外部网络

# reverse-proxy project version: "3.8" services: proxy: # .. networks: # This is the internal network for the reverse-proxy project - proxy # This is the external proxy - proxy_external networks: # This is the server's network, defined by the service proxy: ~ # This is an external network. It serves as a bridge between reverse-proxy and other projects. proxy_external: external: name: proxy_external 

进入全屏模式 退出全屏模式

  • 在反向代理项目的docker-compose.yml的services→kibana→networks下添加proxy_external

  • 直接在elk项目的docker-compose.yml的networks层下添加proxy_external。将此定义为外部网络

# elk project version: "3.8" services: elk # .. networks: # This is the internal network for the elk project - elk # This is the external proxy - proxy_external networks: # This is the server's network, defined by the service elk: ~ # This is an external network. It serves as a bridge between reverse-proxy and other projects. proxy_external: external: name: proxy_external 

进入全屏模式 退出全屏模式

更多读数:

  • https://docs.docker.com/compose/compose-file/compose-file-v3/#network-configuration-reference

  • https://odysee.com/@the-digital-life:a/docker-networking-tutorial-all-network:1

原文链接:https://devpress.csdn.net/cicd/62ed34ff7e66823466180ab4.html

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享