如何让两个 dockerized 应用程序在给定端口上通信?
Posted
技术标签:
【中文标题】如何让两个 dockerized 应用程序在给定端口上通信?【英文标题】:How do I get two dockerized applications to talk on a given port? 【发布时间】:2020-06-04 19:03:53 【问题描述】:根据我的 docker-compose.yml 文件,我正在尝试让两个 dockerized 应用程序在给定端口上相互通信。
他们能够在端口 app1:61001 和 app2:61002 上相互通信,但我的朋友告诉我他们应该能够在端口 80 上通信。例如.. app2:80,端口 61001 和 61002 应该只能是暴露在 swarm 之外的可访问端口。
应用程序本身设置为 server.port=80
知道如何按照我朋友的建议让它工作吗?
这是我正在使用的 docker-compose 文件:
码头工人撰写
version: "3.5"
services:
app1:
image: docker.artifactory.gr.gr.com/app1:latest
ports:
- "61001:80"
deploy:
replicas: 2
networks:
- custom-network
app2:
image: docker.artifactory.gr.gr.com/app2:latest
ports:
- "61002:80"
deploy:
replicas: 2
networks:
- custom-network
networks:
custom-network:
我的
【问题讨论】:
你的朋友说得对,他们应该通过80端口进行内部通信,但我认为你必须在ports
列表中公开它(即在外部映射上方添加- 80
)。跨度>
【参考方案1】:
首先,查看您的服务是否使用 docker-compose ps
命令公开端口 80。
如果是这种情况,只需删除两个服务的以下代码
ports:
- "61002:80"
如果没有,删除
ports:
- "61002:80"
并添加
expose: 80
在您的应用脚本中,要调用一项服务,只需调用 appN:80
希望我能理解您的要求并帮助您
【讨论】:
【参考方案2】:App1 和 App2 属于您命名为 custom-network 的同一网络。 这意味着容器使用的内部端口(右侧的 80 )在两个应用程序中都是可见的! 如果您必须从 APP 1 向 APP 2 调用服务,您只需使用
命名容器hostname: app2 // do the same for the other container
container_name: app2
然后,您可以从 app1 调用应用程序,只需使用“app1:80/yourpath”即可。 暴露的端口在网络外部可见。
此外: 您可以检查连接性,使用迭代 shell:https://gist.github.com/mitchwongho/11266726 连接到 app1 应用程序,然后执行
ping app1
您会看到 app1 有一个内部 IP 并且可以访问。
【讨论】:
hostname
和 container_name:
都不是容器间通信所必需的; Compose 将使服务块的名称可用作 DNS 名称。 Docker 文档中的Networking in Compose 有更多详细信息。
是的,但在这种情况下,名称将由 docker 自动分配,或者不是?
在原始问题的 docker-compose.yml
文件中,app1
和 app2
将是容器可以用来相互联系的有效 DNS 名称。 Compose 还会分配一个容器名称,但您通常不需要它。
好吧,这是真的;我错过了。缓慢而良好地阅读的能力被严重低估了。 tnx以上是关于如何让两个 dockerized 应用程序在给定端口上通信?的主要内容,如果未能解决你的问题,请参考以下文章
如何让两个 dockerized 应用程序在给定端口上通信?