链接的docker容器无法相互通信

时间:2016-09-20 17:45:16

标签: docker docker-compose linux-containers

我正在使用docker-compose来运行我的应用程序堆栈。

应用程序堆栈是:

  1. 蒙戈
  2. 休息服务(以下称为休息服务)
  3. UI服务(以下称为ui-service)
  4. 以下是我的docker-compose的片段:

    services:
      mongodb:
        image: mongo:3
        container_name: mongodb
        ports:
          - "17027:27017"
    
      rest-service:
        build: ./rest-service/
        container_name: rest
        ports:
          - "15000:5000"
        command: "/opt/app/conf/config.yml"
        links:
          - mongodb:mongo
    
      ui-service:
        build: ./ui-service/
        container_name: ui
        ports:
         - "18080:8080"
        links:
          - rest-service:rest
        environment:
          NODE_ENV: development
    

    我在这里面临的问题是我的休息服务可以与mongo容器(我的意思是在端口(Docker容器上的27017)上),因为mongo链接到restService。但是ui-service不能谈论休息服务(我的意思是在港口(码头集装箱上的5000))。

    如果我尝试与主机端口上的休息服务进行ui-service通话(我的意思是端口15000,它监听docker容器的端口5000),它可以工作。 因此,我无法理解为什么会这样。

    任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

除非您要从此容器网络外部访问端口,否则请删除ports部分。链接容器不需要相互明确地公开端口,并且正如您所发现的那样,它将它们公开给主机。您需要不公开端口仅访问您正在使用的端口,而是通过localhost:1234语法(不是container-name:1234)。

确保您了解如何引用端口,如果您使用容器名称,则可能需要 link ,但如果您不想这样做,则需要使用localhost和主机端口。

使用链接自动允许链接的容器访问容器的端口。这意味着你的mongodb上的任何端口都可以通过它的容器端口访问,即使它没有暴露。

当您明确公开它们时,它们会暴露给您的本地主机以获取docker,这就是为什么您的某些东西可以工作的原因。