如何让两个 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 并且可以访问。

【讨论】:

hostnamecontainer_name: 都不是容器间通信所必需的; Compose 将使服务块的名称可用作 DNS 名称。 Docker 文档中的Networking in Compose 有更多详细信息。 是的,但在这种情况下,名称将由 docker 自动分配,或者不是? 在原始问题的 docker-compose.yml 文件中,app1app2 将是容器可以用来相互联系的有效 DNS 名称。 Compose 还会分配一个容器名称,但您通常不需要它。 好吧,这是真的;我错过了。缓慢而良好地阅读的能力被严重低估了。 tnx

以上是关于如何让两个 dockerized 应用程序在给定端口上通信?的主要内容,如果未能解决你的问题,请参考以下文章

如何让两个 dockerized 应用程序在给定端口上通信?

如果没有在 API 请求中指定端口号,服务器如何决定该请求是针对端口 80 还是 443

如何将两个 docker 容器与 nomad 连接

白话 Linux 容器资源的隔离限制原理

有容云:梁胜-如何让Docker容器在企业中投产(下)

两种方法让Docker帮您快速构建应用程序(本文以构建Haskell应用程序为例)