Node.js 如何使用nginx docker容器访问localhost上的服务器?

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

我正在尝试使用一个固定版本的nginx作为我的node(ExpressJS)应用程序的代理服务器。没有对nginx和容器的发布端口80进行任何配置,我可以看到默认的nginx登录页。所以我知道很多都在起作用

现在,我可以挂载启用站点的目录,其中包含
代理\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”