链接的docker容器可以';我们不能互相交流

链接的docker容器可以';我们不能互相交流,docker,docker-compose,linux-containers,Docker,Docker Compose,Linux Containers,我正在使用docker compose运行我的应用程序堆栈 应用程序堆栈是: 蒙戈 休息服务(以下简称休息服务) 用户界面服务(以下简称用户界面服务) 下面是我的docker compose的片段: services: mongodb: image: mongo:3 container_name: mongodb ports: - "17027:27017" rest-service: build: ./rest-service/ c

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

应用程序堆栈是:

  • 蒙戈
  • 休息服务(以下简称休息服务)
  • 用户界面服务(以下简称用户界面服务)
  • 下面是我的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
    
    我在这里面临的问题是,我的rest服务可以与mongo容器(我的意思是在port(docker容器上的27017))通信,因为mongo链接到restService。但ui服务不能和rest服务对话(我的意思是在端口上(docker容器上的5000)

    如果我试图让ui服务与主机端口上的rest服务对话(我指的是在docker容器的端口5000上侦听的端口15000),它就会工作。 因此,我无法理解为什么会发生这种情况


    非常感谢您的帮助。

    请删除
    端口
    部分,除非您希望从该容器网络外部访问该端口。链接容器不需要显式地相互公开端口,正如您所发现的,它将端口公开给主机。您需要不公开端口或只访问正在使用的端口,而是通过
    localhost:1234
    语法(而不是
    container name:1234

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

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


    当您显式地公开它们时,它们将公开给docker的本地主机,这就是为什么您的一些东西可以工作。

    ui服务的
    /etc/hosts
    中的
    rest
    ui服务
    是否能够ping
    rest
    (docker exec-ti ui服务bash->ping rest)?@ThomasMaier
    rest
    不在
    ui服务
    命令的
    /etc/hosts
    中,docker exec-ti ui服务bash->ping rest
    没有给我任何信息。当我用命令连接到ui服务时,
    docker exec-ti ui service bash
    ,然后在容器上,如果我说,
    ping rest
    ,那么我确实得到了正确的响应。这是否意味着我需要在主机的
    /etc/hosts
    上添加
    rest
    。但是,只要看看是否还有其他更好的解决方法?没有必要在主机
    /etc/hosts
    中添加容器的IP,因为您没有在容器中绑定/装载它。当您执行上面的Docker-compose.yml时,Docker应该将容器的动态IP添加到ui服务的
    /etc/hosts
    。你能证实吗?@ThomasMaier它没有补充。在主机的
    /etc/hosts
    文件中手动添加
    rest
    的映射可以解决这个问题。我知道我正在向主机公开容器的端口,但我只是特意做了一些验证。一旦一切正常,我会移除它们。我面临的问题是,rest服务可以和“mongo:27017”对话,但ui服务不能像rest:27017那样和rest服务对话8080@Aditya您是否正在本地主机上运行另一个已经在使用8080的服务?