如何使用nginx docker container访问本地主机上的服务器?

koaltpgm  于 2022-11-02  发布在  Nginx
关注(0)|答案(6)|浏览(427)

我正在尝试使用一个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,但似乎没有什么帮助。除非我做错了什么。

omtl5h9j

omtl5h9j1#

如果你使用的是docker-for-mac 18.03或更高版本,它会自动创建一个特殊的DNS条目host.docker.internal,动态绑定到主机inet ip。然后,你可以使用dns名称从容器内部代理主机上运行的服务,作为localhost的替代。
即一个nginx配置文件:

server {
  listen 0.0.0.0:80;
  server_name localhost;

  location / {
    proxy_pass http://host.docker.internal:3000;
  }
}
jyztefdp

jyztefdp2#

您可以获取当前的IP地址,如here所示:

ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'

然后可以将--add-host标志与docker run一起使用:

docker run --add-host localnode:$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print \$2}') ...

proxypass中,使用localnode而不是localhost

uubf1zoe

uubf1zoe3#

是的。Docker需要知道您的主机。您可以使用--add-host参数设定别名。在 *nix方块上,建立别名给名称“localbox”,这将是:

docker run my_repo/my_image --add-host=localbox:<host_name>`

在boot2docker上,它将是:

docker run my_repo/my_image --add-host=localbox:192.168.59.3`

其中您应该将“192.168.59.3“替换为boot2docker ip返回的任何内容。
然后,您应该总是通过别名localbox访问您的主机,所以只需将nginx配置更改为:

location / {
  proxy_pass http://localbox:3000;
}
b09cbbtk

b09cbbtk4#

在linux上,这对我很有效:
在docker-compose.yml中,将一个入口点脚本挂载到nginx容器:

nginx:
    image: nginx:1.19.2
    # ...
    volumes:
      - ./nginx-entrypoint.sh:/docker-entrypoint.d/nginx-entrypoint.sh:ro

入口点的内容将本地地址Map到主机本地地址。

apt update
apt install iproute2 -y
echo "`ip route | awk '/default/ { print $3 }'`\tdocker.host.internal" >> /etc/hosts

然后,您可以使用docker.host.internal,而不是在容器内使用localhost

zzwlnbp8

zzwlnbp85#

我也遇到了同样的问题。通过使用Docker主机的本地IP地址而不是LocalHost来修复它。
因此,如果局域网中Docker主机的本地IP地址是192.168.2.2:

location / {
    proxy_pass http://192.168.2.2:3000;
  }

当然,只有当你给你的Docker主机分配了一个静态ip时,这个解决方案才能很好地工作。

bgtovc5b

bgtovc5b6#

最后,如果你使用Nginx作为多个服务的反向代理,你可以使用docker-compose来旋转所有这些。确保只在Nginx服务上公开端口“80:80”。其他服务你可以只公开服务端口,而不Map到底层网络,如下所示:

web:
.....
    expose:
       - 8080
nginx:
.....
    port:
        - “80:80”

然后使用Nginx配置proxy_pass您根本不需要上游应用程序部分

相关问题