2017-07-28 115 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。

相关问题