Docker主机名在两个微服务之间进行通信

Qui*_*ans 3 docker microservices docker-compose

它现在如何运作:

Microservice X使用静态ip向Microservice Y发出REST API请求

http://{ip-address}:{port}/doSomething
Run Code Online (Sandbox Code Playgroud)

问题:

问题是我不能保证静态ip.我不想通过使用docker主机名来解决这个问题:

http://hostname:{port}/doSomething
Run Code Online (Sandbox Code Playgroud)

我尝试通过在docker-compose中创建一个使用过的已定义网络来实现这一点:

    #part of docker-compose file
    streamapp:
      hostname: twitterstreamapp
      image: twitterstreamapp
      container_name: twitterstreamapp
      restart: always
      ports:
        - '8090:8080'
      build:
        context: ./TwitterStream
        dockerfile: Dockerfile

    storeapp:
      hostname: twitterstoreapp
      image: twitterstoreapp
      container_name: twitterstoreapp
      restart: always
      ports:
        - '8095:8080'
      build:
        context: ./TwitterStore
        dockerfile: Dockerfile
      depends_on:
        - 'mysql-db'
      networks:
        - backend

  volumes:
    MyDataVolume:

  networks:
    backend:
      driver: bridge
Run Code Online (Sandbox Code Playgroud)

我可以从容器X ping容器Y.但不是Curl例如.我该如何解决这个问题,或者这不是达到我想要的最佳方式.

Con*_*enu 7

解决方案非常简单,您可以使用服务名称,而不是使用IP或主机名.

在您的示例中,streamapp您可以使用服务访问另一个服务http://storeapp:8080.

类似地,在storeapp服务中你可以访问另一个http://streamapp:8080.

请注意,您必须使用内部端口,而不是导出的端口.

当您从其他计算机(即从Internet)访问服务时,这不适用.在这种情况下,您必须使用表格http://{IP_OF_THE_MACHINE}:8090

  • 你是我的英雄!我没有意识到我需要使用内部端口。谢谢! (2认同)