2016-09-20 85 views
2

我正在使用docker-compose來運行我的應用程序堆棧。鏈接的碼頭集裝箱不能互相通信

應用程序的堆棧是:

  1. 蒙戈
  2. REST服務(稱爲下文其餘服務)
  3. UI服務(稱爲下文UI服務)

下面是碼頭的碼頭 - 撰寫:

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。但用戶服務不能與休息服務(我的意思是在碼頭上的5000(碼頭集裝箱上))。

如果我嘗試在主端口(我的意思是端口15000在端口容器的端口5000上偵聽)上使用ui-service對話服務,它就可以工作。 因此,我無法理解爲什麼發生這種情況。

任何幫助將不勝感激。

+0

'ui-service'的'/ etc/hosts'中是否有'rest'? 'ui-service'能夠ping'rest'(docker exec -ti ui-service bash - > ping rest)嗎? –

+0

@ThomasMaier'rest'不在'ui-service'的'/ etc/hosts'中 命令'docker exec -ti ui-service bash - > ping rest'不會給我任何東西。 當我用命令連接到ui-service時, 'docker exec -ti ui-service bash',然後在容器上,如果我說, 'ping rest',那麼我確實得到了正確的響應。 這是否意味着我需要在主機的'/ etc/hosts'上添加'rest'? – Aditya

+0

@ThomasMaier剛剛證實,如果我在主機的'/ etc/hosts'文件中爲'rest'添加映射,情況就會奏效。 但只是看看是否還有其他更好的出路? – Aditya

回答

0

刪除ports部件,除非您想從該容器網絡外部訪問該端口。鏈接的容器不需要顯式地將端口公開給對方,並且如你所知,它將它暴露給主機。您需要不公開端口只訪問您正在使用的端口,但通過localhost:1234語法(而不是container-name:1234)。

確保你瞭解你如何引用端口,如果你使用容器名稱,你可能需要鏈接但是如果你不想這樣做,將需要使用localhost和主機端口。

使用鏈接自動允許鏈接的容器訪問容器的端口。這意味着您的mongodb上的任何端口都可以通過它的容器端口訪問,即使它沒有暴露。

當你明確地暴露他們,他們暴露在您的本地主機的泊塢窗,這就是爲什麼一些你的東西的作品。

+0

我知道我正在將容器的端口暴露給我的主機,但是我故意只是爲了驗證一些東西。一旦一切正常,我會刪除它們。 我面對的問題是,休息服務可以與「mongo:27017」交談,但是ui服務無法與休息服務通話:8080 – Aditya

+0

@Aditya在localhost上運行的另一項服務已經是使用8080? – enderland