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/;
    }
}