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

ada*_*eck 16 nginx node.js docker

我正在尝试使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用这个问题,但似乎没有帮助.这是除非我做错了.

dig*_*mer 20

如果你正在使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:“host.docker.internal”在 Linux 上不起作用。 (2认同)
  • 除非您设置“额外主机”/sf/answers/3047921271/ (2认同)
  • 这在 Windows 10 主机上也适用于我。 (2认同)

Abd*_*aly 12

你可以得到你当前的IP地址,如图这里:

ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

然后你可以使用--add-host标志docker run:

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

在你的proxypass使用localnode而不是localhost.


Eli*_*Eli 5

是的。Docker 需要了解您的主机。您可以使用--add-host开关设置别名。在 *nix 框上为名称“localbox”创建别名,这将是:

docker run my_repo/my_image --add-host=localbox:<host_name>`
Run Code Online (Sandbox Code Playgroud)

在 boot2docker 上,它将是:

docker run my_repo/my_image --add-host=localbox:192.168.59.3`
Run Code Online (Sandbox Code Playgroud)

您应该用任何boot2docker ip返回值替换“192.168.59.3” 。

然后,您应该始终通过别名 localbox 访问您的主机,因此只需将您的 nginx 配置更改为:

location / {
  proxy_pass http://localbox:3000;
} 
Run Code Online (Sandbox Code Playgroud)