2017-05-10 43 views
0

我開發了一個Angular App,它通過Nginx與UWSGI Flask Api進行通信。目前我有3個容器(Angular [web_admin],Api [api_admin],Nginx [nginx])Docker-Compose - 與「內部」Api通信。

當我在我的開發機器上運行它時,通信工作正常。角度請求通過url:http://localhost:5000和api響應很好,一切正常。

但是,當我將它部署到我的生產服務器時,我注意到應用程序無法正常工作,因爲端口5000未在我的防火牆中打開。

我的問題很簡單,我如何通過內部網絡調用角容器,調用api容器,而不是從外部調用它?

version: '2' 

services: 
    data: 
    build: data 

    neo4j: 
    image: neo4j:3.0 
    networks: 
     - back 
    volumes_from: 
     - data 
    ports: 
     - "7474:7474" 
     - "7473:7473" 
     - "7687:7687" 
    volumes: 
     - /var/diariooficial/neo4j/data:/data 

    web_admin: 
    build: frontend/web 
    networks: 
     - front 
     - back 
    ports: 
     - "8001:8001" 
    depends_on: 
     - api_admin  
    links: 
     - "api_admin:api_admin" 
    volumes: 
     - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/ 

    api_admin: 
    build: backend/api 
    volumes_from: 
     - data  
    networks: 
     - back 
    ports: 
     - "5000:5000" 
    depends_on: 
     - neo4j 
     - neo4jtest 
    volumes: 
     - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/ 

    nginx: 
    build: nginx 
    volumes_from: 
     - data  
    networks: 
     - back 
     - front 
    ports: 
     - "80:80" 
     - "443:443" 
    volumes: 
     - /var/diariooficial/log/nginx:/var/log/nginx 
    depends_on: 
     - api_admin  
     - web_admin 

networks: 
    front: 
    back: 

回答

1

鏈接在網絡上爲服務創建DNS名稱。您應該將web_admin服務與api_admin:5000對話,而不是localhost:5000api_admin DNS名稱將解析爲api_admin服務之一的IP地址。

一個解釋見https://docs.docker.com/compose/networking/,具體如下:

每個容器現在可以查找主機名的網絡或數據庫,並取回相應的容器的IP地址。例如,Web的應用程序代碼可以連接到URL postgres:// db:5432並開始使用Postgres數據庫。

+0

嘿安迪,謝謝你的迴應。我在Nginx中使用DNS名稱,它工作正常,但我不知道爲什麼,角度不會轉換DNS名稱。 $ http.get(__ env.apiUrl +'/ websites') 選項http:// api_admin:5000/auth/login net :: ERR_NAME_NOT_RESOLVED –

+1

這是從瀏覽器JavaScript代碼中訪問的嗎?在這種情況下,請求來自Docker網絡之外。你必須提供一種在運行時配置'__env.apiUrl'的方法。這聽起來像你的問題類似於http://stackoverflow.com/a/42938882/684908。在這種情況下,您的URL將是Docker主機的IP地址(例如,在帶有Docker Machine的筆記本電腦上,我的Docker主機爲192.168.99.100)。 –