Docker容器在主机中无法访问

时间:2016-07-03 21:24:23

标签: networking nginx docker docker-compose

我的一些容器正在生产中运行Web服务器(PHP,NodeJS)。

如果我们以NodeJS容器为例,这是它的配置

搬运工-compose.yml

version: '2'
services:
  webapp:
    build: .
    volumes_from:
     - data
    links:
     - db:db
     - redis:redis
    ports:
      - '8080:3000'
    restart: always

  ...

使用此配置,我可以通过http://example.com:8080/访问我的网络应用,但我无法使用

访问我的主机
$ curl localhost:8080
(Time-out)

我的主机上有一个 Nginx 服务器,具有以下配置:

example.com.conf

upstream webapp {
   server 127.0.0.1:8080;
}

server {
  listen 80;
  listen [::]:80;

  server_name example.com;

  location / {
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   HOST $http_host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-NginX-Proxy true;
    proxy_redirect off;

    proxy_pass http://webapp;
  }

}

但是加入http://example.com/会抛出504网关超时。

如果我尝试通过docker-compose.yml更改'127.0.0.1:8080:3000'中的端口配置,问题仍然存在,但无法访问http://example.com(和http://example.com:8080,但这是我想要的结果)。

这很奇怪,我没有在新服务器上运行我的应用程序的问题。 我正在寻找这个问题的根源。

感谢您的支持。

编辑:

$ netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address        State       PID/Program name
tcp        0      0 127.0.0.11:59712        0.0.0.0:*               LISTEN      -               
udp        0      0 127.0.0.11:33293        0.0.0.0:*                           -               

Web服务器必须在端口3000上侦听,但我有

$ docker-compose logs
webapp_1  | Express server listening on port 3000 in production mode

服务器也正在运行......

$ docker port webapp_1
3000/tcp -> 127.0.0.1:8080

1 个答案:

答案 0 :(得分:0)

编辑:这应该与您拥有它的方式类似,您是否尝试更改: proxy_set_header HOST $http_host;proxy_set_header HOST $host; 在你的nginx配置?

您可以将nginx放入Docker Compose文件中,让Compose使用自己的网络。如果要在其他网络中添加项目,可以指定自定义网络,请参阅:https://docs.docker.com/compose/networking/

否则,您可以在主机上查看ifconfig等的输出,并查看Compose使用的IP和网络以及主机正在侦听的内容。