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


我正在尝试使用dockerized版本的nginx作为我的节点(ExpressJS)应用程序的代理服务器。没有任何配置到nginx和发布容器的端口80,我能够看到默认的nginx登陆页面。所以我知道有很多工作要做。

现在我可以挂载包含配置的启用站点的目录 proxy_pass localhost:3000。我的节点应用程序在本地运行(不在任何Docker容器中),我可以通过端口3000访问它(即 localhost:3000)。但是,我会假设nginx容器正在运行,映射到端口80,并代理我的localhost:3000,我将能够看到我的 非常 简单(hello world)应用程序。相反,我收到502。

我需要把东西传递给码头工人吗?这可能是nginx配置错误吗?这是我的nginx配置:

server {
  listen 0.0.0.0:80;
  server_name localhost;

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

我试过用 这个问题 但它似乎没有帮助。这是除非我做错了。


6544
2018-01-07 01:27


起源

可能重复 通过Docker连接到本地MySQL服务器? - Bryan
我也试过了,似乎无法让它发挥作用。我知道这个类似的问题已被多次询问,甚至我得到的502错误也是如此,但这些都没有奏效。我下班回家的时候会重新检查一下。 - adam-beck
DNS ftw,imo。主人有一个名字;) - user2105103


答案:


您可以获得当前的IP地址,如图所示 这里

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


8
2018-01-07 07:40



这是正确的,但对我来说并不适用。首先,我正在使用我的笔记本电脑,所以我提取ip的方法明显不同。我尝试使用相同的方法更改 en0 但不断得到结果 addr:192.xxx.x.xx所以我最终只是硬编码了。我将使用什么实用程序剥离开头 addr: 提供不适用于docker的提供。谢谢你。我正在为遇到这个问题的其他人写这篇评论。 - adam-beck
没关系,我用过 sed 剥离开头 addr:。你可以告诉我,我不是一个sysops人:) - adam-beck


是。 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;
} 

1
2018-01-07 05:14





如果您使用的是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;
  }
}

1
2018-06-28 15:06





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

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

然后使用Nginx配置proxy_pass HTTP://服务名称:端口 您根本不需要上游应用程序部分


0
2017-08-12 07:47