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

时间:2015-01-07 01:27:12

标签: node.js nginx 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;
  }
}

我尝试使用this question,但似乎没有帮助。这是除非我做错了。

5 个答案:

答案 0 :(得分:13)

如果您使用的是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 :(得分:10)

您可以按照here所示获取当前的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

答案 2 :(得分:2)

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

你应该替换&#34; 192.168.59.3&#34;无论boot2docker ip返回什么。

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

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

答案 3 :(得分:1)

在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

然后,您可以使用localhost来代替在容器内使用docker.host.internal

答案 4 :(得分:-1)

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

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

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