2017-07-28 67 views
1

我在一個docker-compose.yml中有兩個容器。兩者在同一網絡上相同。我已經使用「depends_on」添加了依賴項,我可以ping其他容器,但curl不起作用。無法從一個容器捲曲到另一個容器

version: "2.1" 
services: 
    web: 
      restart: always 
      build: 
        context: . 
        dockerfile: web.dockerfile 
      ports: 
        - "9000:8080" 
      expose: 
        - "8080" 

      networks: 
        - test 

    nginx_web: 
      restart: always 
      build: 
        context: . 
        dockerfile: nginx_web.dockerfile 
      ports: 
        - "8100:80" 
      expose: 
        - "80" 
      depends_on: 
        - web 
      networks: 
        - test 
    networks: 
      test: 

當我嘗試從nginx_web容器ping到網絡,它工作正常。但捲曲不起作用。我越來越

curl: (7) Failed to connect to 172.28.0.7 port 8080: Connection refused 

而當我從主機直接捲到web端口9000,它工作正常。

+0

你能寫出你正在輸入的確切curl命令嗎?順便說一下,當使用網絡端口暴露是沒有必要的。 – herm

+0

我正在使用:'curl http:// web:8080 /' 我知道端口不是必需的,但只是要加倍確定我正在暴露它。 – user208859

+0

servicename被正確翻譯成IP,我不知道問題是什麼。 – herm

回答

0

在您的django應用程序中,將其從127.0.0.1上的偵聽中更改爲使用0.0.0.0偵聽所有接口。 Docker容器有自己的網絡名稱空間,所以你不能訪問另一個容器的loopback接口。

此外,您的端口不匹配。 Django正在響應9000,因此從容器到容器,您需要使用端口9000.映射到發佈的端口只發生在docker主機上。暴露一個端口對這個用例確實沒有任何作用。

最後,從您的主機,你有端口倒過來。它是主機上的端口,接着是容器內的端口。所以「8080:9000」。

+0

是的,這是個問題,後來我想到了,我在127.0.0.1上運行我的django應用程序,但後來我意識到它不會被允許從外面捲曲 – user208859

+0

有完全相同的問題。知道容器通信使用內部端口是反直覺的恕我直言... ...所以感謝! – gfd

1

我有同樣的問題,當我試圖使curl沒有http時,我已經成功了。你應該試試curl name_of_container:8080/path/to/web/method。這對我來說很有效,因爲在Docker撰寫的過程中,它不需要SSL。

相關問題