![](/img/trans.png)
[英]How do I connect to the localhost of a docker container (from inside the container)
[英]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.