主机中无法访问Docker容器
我的一些容器正在生产中运行一个Web服务器(PHP,NodeJS)。
如果我们以NodeJS容器为例,这是它的configuration
泊坞窗,compose.yml
version: '2' services: webapp: build: . volumes_from: - data links: - db:db - redis:redis ports: - '8080:3000' restart: always ...
有了这个configuration,我可以通过http://example.com:8080/
访问我的webapp,但是我无法访问我的主机
$ curl localhost:8080 (Time-out)
我的主机上有这个configuration的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; } }
但是joinhttp://example.com/
导致504网关超时。
如果我尝试通过'127.0.0.1:8080:3000'
更改docker-compose.yml
的端口configuration,问题仍然存在,但无法访问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
编辑:这应该工作类似于你如何,你尝试改变: proxy_set_header HOST $http_host;
到proxy_set_header HOST $host;
在你的nginxconfiguration?
你可以把nginx放到你的Docker Compose文件中,让Compose使用自己的networking。 如果要在其他networking中添加项目,则可以指定自定义networking,请参阅: https : //docs.docker.com/compose/networking/
否则,您可以查看主机上ifconfig
等的输出,查看哪些IP和networking撰写正在使用以及主机正在监听什么。