Node.js 如何使用nginx docker容器访问localhost上的服务器?
我正在尝试使用一个固定版本的nginx作为我的node(ExpressJS)应用程序的代理服务器。没有对nginx和容器的发布端口80进行任何配置,我可以看到默认的nginx登录页。所以我知道很多都在起作用 现在,我可以挂载启用站点的目录,其中包含Node.js 如何使用nginx docker容器访问localhost上的服务器?,node.js,nginx,docker,Node.js,Nginx,Docker,我正在尝试使用一个固定版本的nginx作为我的node(ExpressJS)应用程序的代理服务器。没有对nginx和容器的发布端口80进行任何配置,我可以看到默认的nginx登录页。所以我知道很多都在起作用 现在,我可以挂载启用站点的目录,其中包含代理\u pass localhost:3000的配置。我的节点应用程序在本地运行(不在任何Docker容器中),我可以通过端口3000访问它(即localhost:3000)。然而,我假设nginx容器运行时,映射到端口80,并代理我的localho
代理\u pass localhost:3000的配置。我的节点应用程序在本地运行(不在任何Docker容器中),我可以通过端口3000访问它(即localhost:3000
)。然而,我假设nginx容器运行时,映射到端口80,并代理我的localhost:3000,我将能够看到我非常简单的(helloworld)应用程序。相反,我收到了502
我需要把东西传给docker吗?这可能是nginx配置错误吗?以下是我的nginx配置:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
}
}
我试过使用,但似乎没有帮助。除非我做错了什么事。是的。Docker需要了解您的主机。您可以使用--add host
开关将别名设置为该别名。在*nix框上创建名称“localbox”的别名,如下所示:
docker run my_repo/my_image --add-host=localbox:<host_name>`
docker run my_repo/my_image --add-host=localbox:192.168.59.3`
您应该将“192.168.59.3”替换为boot2dockerip
返回的任何内容
然后,您应该始终通过alias localbox访问主机,因此只需将nginx配置更改为:
location / {
proxy_pass http://localbox:3000;
}
您可以获取当前IP地址,如图所示:
然后,您可以将--addhost
标志与docker run
一起使用:
docker run --add-host localnode:$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print \$2}') ...
在proxypass
中,使用localnode
而不是localhost
如果您使用mac 18.03或更高版本的docker,它会自动创建一个特殊的DNS条目host.docker.internal
,动态绑定到主机inet ip。然后,您可以使用dns名称从容器内部代理主机上运行的服务,作为localhost
的代理
i、 e.nginx配置文件:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://host.docker.internal:3000;
}
}
最后,如果您使用Nginx作为多个服务的反向代理,那么您可以使用docker compose实现所有这些。确保仅在Nginx服务上公开端口“80:80”。其他服务您可以只公开服务端口,而不映射到底层网络,如下所示:
web:
.....
expose:
- 8080
nginx:
.....
port:
- “80:80”
然后使用Nginx配置代理\u pass
在linux上,您根本不需要上游应用程序部分,这对我很有用:
在docker-compose.yml中,将入口点脚本装入nginx容器:
nginx:
图片:nginx:1.19.2
# ...
卷数:
-./nginx entrypoint.sh:/docker entrypoint.d/nginx entrypoint.sh:ro
入口点的内容将本地地址映射到主机本地地址
apt更新
apt安装iproute2-y
echo“`ip路由| awk'/default/{print$3}`\tdocker.host.internal”>>/etc/hosts
然后,您可以使用docker.host.internal
的可能副本,而不是在容器中使用localhost
,我也尝试过,但似乎无法使其工作。我知道类似的问题已经被问过很多次了,甚至我得到的502错误也被问过了,但是这些都不起作用。我下班回家后会重新检查。DNS ftw,imo。主机有名称;)linux上的docker,版本>=20.04
可以使用带有运行标志的host.docker.internal
;看,这是正确的,但并不完全适合我。首先,我在笔记本电脑上工作,所以我提取ip的方法明显不同。我尝试使用相同的方法更改en0
,但一直使用addr:192.xxx.x.xx
得到结果,所以我最终只是硬编码了它。如果docker无法使用,我将使用什么实用程序剥离开头的addr:
。谢谢你。我是为遇到这个问题的其他人写这篇评论的。不过,我使用了sed
来去掉开头的addr:
。正如你所知道的,我不是一个系统操作人员:)这是一个很棒的建议。谢谢,伙计。现在还不清楚我们不需要的“上游应用程序部分”是什么意思。如果http://service-name
是您的外部域,而不是本地主机。这是我找到的第一个localhost替代方案,但我不喜欢它,因为我不能确定我的nginx重定向是否真的返回到internet只是为了使用不同的端口。请阅读文档,这是一个你应该熟悉的技术术语。这是一个我熟悉的专业术语,但我不希望每个人都这样,我甚至不确定你指的是什么。另外,我不知道你为什么提到它,因为没有其他人提到上面的“上游”。我不认为“上游”模块是初学者的特点,所以说“你应该知道这一点”不是很有意思。这是stackoverflow,人们来这里是因为他们不可能知道所有的事情。我使用了这个解决方案!非常简单:host.docker.internal
在linux上不起作用。除非您设置了额外的主机
web:
.....
expose:
- 8080
nginx:
.....
port:
- “80:80”