我正在尝试使用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,但似乎没有帮助。这是除非我做错了。
答案 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 您根本不需要上游应用程序部分