nginx proxy_pass 到链接的 docker 容器
nginx proxy_pass to a linked docker container
我有两个 docker 个装有 nginx 的容器。 container1 链接到 container2。 Docker 然后向 /etc/hosts 添加一个条目,我将其输入到 nginx 配置中,如下所示:
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://container1/;
}
}
我可以从 container2 ping container1,但是 nginx 无法解决它:
*1 no resolver defined to resolve container1
如何 proxy_pass 向另一个 docker 容器发出请求?
你应该看看这个关于使用 /etc/hosts 作为解析器的答案:Using /etc/hosts as resolver for url rewriting
基本上,您的 dns 或解析器在查找期间不使用 /etc/hosts 来解析名称,但您可以通过安装 dnsmasq
并使用 127.0.0.1
作为解析器来解决此问题。您可以直接在 nginx 配置中添加 127.0.0.1 作为解析器:
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.1;
proxy_pass http://container1/;
}
}
直接使用上游块而不是容器名称
upstream backend {
server container1;
}
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://backend/;
}
}
这应该允许进行正常的名称解析,从而提供一种通过 nginx 轻松使用 docker 链接的方法。
我相信,Nginx 正在使用自己的 DNS 解析器实现,
您可以使用嵌入式 Docker DNS 服务,如果启用,请检查您的容器解析器:
cat /etc/resolv.conf
应该是:
nameserver 127.0.0.11
使用此 IP 作为解析器:
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.11;
proxy_pass http://container1/;
} }
有很多 Docker 图像在入口点有这样的 hack:
https://github.com/jetbrains-infra/docker-nginx-resolver
entrypoint.sh:
...
echo resolver $(awk 'BEGIN{ORS=" "} =="nameserver" {print }' /etc/resolv.conf) ";" > /etc/nginx/includes/resolver.conf
...
nginx.conf:
http {
include /etc/nginx/includes/resolver.conf;
....
在我的例子中,使用 $request_uri
似乎让我遇到了这个错误。所以我最终使用了这个 Docker 解析器被采用
server {
location /api/ {
proxy_pass http://backend/api/;
}
}
我有两个 docker 个装有 nginx 的容器。 container1 链接到 container2。 Docker 然后向 /etc/hosts 添加一个条目,我将其输入到 nginx 配置中,如下所示:
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://container1/;
}
}
我可以从 container2 ping container1,但是 nginx 无法解决它:
*1 no resolver defined to resolve container1
如何 proxy_pass 向另一个 docker 容器发出请求?
你应该看看这个关于使用 /etc/hosts 作为解析器的答案:Using /etc/hosts as resolver for url rewriting
基本上,您的 dns 或解析器在查找期间不使用 /etc/hosts 来解析名称,但您可以通过安装 dnsmasq
并使用 127.0.0.1
作为解析器来解决此问题。您可以直接在 nginx 配置中添加 127.0.0.1 作为解析器:
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.1;
proxy_pass http://container1/;
}
}
直接使用上游块而不是容器名称
upstream backend {
server container1;
}
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://backend/;
}
}
这应该允许进行正常的名称解析,从而提供一种通过 nginx 轻松使用 docker 链接的方法。
我相信,Nginx 正在使用自己的 DNS 解析器实现,
您可以使用嵌入式 Docker DNS 服务,如果启用,请检查您的容器解析器:
cat /etc/resolv.conf
应该是:
nameserver 127.0.0.11
使用此 IP 作为解析器:
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.11;
proxy_pass http://container1/;
} }
有很多 Docker 图像在入口点有这样的 hack:
https://github.com/jetbrains-infra/docker-nginx-resolver
entrypoint.sh:
...
echo resolver $(awk 'BEGIN{ORS=" "} =="nameserver" {print }' /etc/resolv.conf) ";" > /etc/nginx/includes/resolver.conf
...
nginx.conf:
http {
include /etc/nginx/includes/resolver.conf;
....
在我的例子中,使用 $request_uri
似乎让我遇到了这个错误。所以我最终使用了这个 Docker 解析器被采用
server {
location /api/ {
proxy_pass http://backend/api/;
}
}