【问题标题】:how can I communicate between containers?如何在容器之间进行通信?
【发布时间】:2019-04-20 18:51:51
【问题描述】:

我在端口 80 中使用带有 api 网关的容器,并且我需要在另一个容器之间通信 api 网关(所有这些容器都使用 dockerfile 和 docker-compose)。我怎样才能让这些其他容器不将端口暴露给 localhost 但在内部与 api 网关通信?

我的 docker-compose:

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - "3000:3000"

解决方案:

将 docker-compose 文件更改为:

version: '3.5'

    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
        volumes:
          - ./:/usr/src/app
          - /usr/src/app/node_modules
        expose:
          - "3000"
        image: api-name-service
        container_name: api-name-service
        networks: 
          - api-network

networks:
  api-network:
       name: api-network-service

当服务在同一网络中时,此服务可以使用服务名称进行通信,例如“http://api-name-service:3000”。

【问题讨论】:

  • 我不太确定你在问什么——你能试着改一下这个问题吗?
  • 嗨@duhaime。我只需要一个端点来连接外部访问(我的 api 网关 - 端口 80)。其他容器和其他端口,我试图不公开这个端口,因为没有外部连接,但可以在 api 网关和这些其他容器之间访问。
  • 对不起,我还不清楚。您在某个主机上有一个 API,并希望其他主机能够与该 API 通信,但您不想“暴露”它们通信的端口?你能定义“暴露”吗?这都是 TCP 通信吗?
  • @duhaime 对此感到抱歉,感谢您的帮助。想象一下,我的本地主机中有一些容器。只有一个容器接收外部访问。其他人无法接收外部访问,但需要与此特定容器进行内部通信。
  • 但是您只定义了一个服务,您还需要与app 通信的其他容器是什么?它们在哪里定义?如果您在app 旁边声明另一个服务,它们都将能够通过名称发现彼此。

标签: docker docker-compose dockerfile


【解决方案1】:

您想使用expose 而不是ports:

https://docs.docker.com/compose/compose-file/compose-file-v2/#expose

例如:

services:
    app1:
        expose:
            - "3000"
    app2:
        ...

假设app1的3000端口上有一些API,那么app2就可以访问http://app1:3000/api

【讨论】:

  • 我这样做,只是在 docker ps -a 上显示端口(我现在没有外部访问权限)。但是我的其他服务怎么能调用这个呢?
【解决方案2】:

使用 docker 网络。这是 docker 网站上关于如何使用网络黑白容器的非常好的教程:https://docs.docker.com/network/network-tutorial-standalone/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2015-02-26
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多