繁体   English   中英

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

[英]How do I access a server on localhost with nginx docker container?

我正在尝试使用 nginx 的 dockerized 版本作为我的节点 (ExpressJS) 应用程序的代理服务器。 没有对 nginx 进行任何配置并为容器发布端口 80,我就可以看到默认的 nginx 登陆页面。 所以我知道很多事情都在起作用。

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

我需要将某些东西传递给 docker 吗? 这可能是 nginx 配置错误吗? 这是我的nginx配置:

server {
  listen 0.0.0.0:80;
  server_name localhost;

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

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

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

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

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

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

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

在您的proxypass使用localnode而不是localhost

是的。 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`

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

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

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

在 linux 上,这对我有用:

在 docker-compose.yml 中,将入口点脚本挂载到 nginx 容器中:

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

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

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

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

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

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

然后使用 Nginx 配置 proxy_pass http://service-name:port你根本不需要上游应用部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM