我正在尝试使用一个dockerized版本的nginx作为我的node(ExpressJS)应用程序的代理服务器。在没有对nginx进行任何配置和容器的发布端口80的情况下,我能够看到默认的nginx登录页面。所以我知道这一切都是有效的。
现在我可以挂载包含proxy_pass localhost:3000
配置的sites-enabled目录了。我让我的node应用程序在本地运行(不在任何Docker容器中),并且我可以通过端口3000(即localhost:3000
)访问它。但是,我假设nginx容器运行,Map到端口80,并且代理我的localhost:3000,我将能够看到我的 very simple(hello world)应用程序。相反,我收到了502。
我需要传递一些东西到docker吗?这可能是一个nginx配置错误吗?下面是我的nginx配置:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
}
}
我试过使用this question,但似乎没有什么帮助。除非我做错了什么。
6条答案
按热度按时间omtl5h9j1#
如果你使用的是docker-for-mac 18.03或更高版本,它会自动创建一个特殊的DNS条目
host.docker.internal
,动态绑定到主机inet ip。然后,你可以使用dns名称从容器内部代理主机上运行的服务,作为localhost
的替代。即一个nginx配置文件:
jyztefdp2#
您可以获取当前的IP地址,如here所示:
然后可以将
--add-host
标志与docker run
一起使用:在
proxypass
中,使用localnode
而不是localhost
。uubf1zoe3#
是的。Docker需要知道您的主机。您可以使用
--add-host
参数设定别名。在 *nix方块上,建立别名给名称“localbox”,这将是:在boot2docker上,它将是:
其中您应该将“192.168.59.3“替换为
boot2docker ip
返回的任何内容。然后,您应该总是通过别名localbox访问您的主机,所以只需将nginx配置更改为:
b09cbbtk4#
在linux上,这对我很有效:
在docker-compose.yml中,将一个入口点脚本挂载到nginx容器:
入口点的内容将本地地址Map到主机本地地址。
然后,您可以使用
docker.host.internal
,而不是在容器内使用localhost
。zzwlnbp85#
我也遇到了同样的问题。通过使用Docker主机的本地IP地址而不是LocalHost来修复它。
因此,如果局域网中Docker主机的本地IP地址是192.168.2.2:
当然,只有当你给你的Docker主机分配了一个静态ip时,这个解决方案才能很好地工作。
bgtovc5b6#
最后,如果你使用Nginx作为多个服务的反向代理,你可以使用docker-compose来旋转所有这些。确保只在Nginx服务上公开端口“80:80”。其他服务你可以只公开服务端口,而不Map到底层网络,如下所示:
然后使用Nginx配置proxy_pass您根本不需要上游应用程序部分