首页 > 解决方案 > Nginx 反向代理未使用主机名找到其他内部 Docker 容器

问题描述

我有两个码头集装箱。一个运行 Kestrel (172.17.0.3),另一个运行 Nginx (172.17.0.4),使用反向代理连接到 Kestrel。当我使用 Kestrel 容器的内部 Docker ip 时,Nginx 连接正常,但是当我尝试使用 nginx.conf(kestral)中的容器主机名连接到 Kestrel 时,出现以下错误:

2020/06/30 00:23:03 [emerg] 58#58:在 /etc/nginx/nginx.conf:7 中的上游“kestrel”中找不到主机 nginx:在上游“kestrel”中找不到 [emerg] 主机/etc/nginx/nginx.conf:7

我用这两行启动了容器

docker run -d --name kestrel --restart always -h kestrel mykestrelimage
docker run -d --name nginx --restart always -p 80:80 -h nginx mynginximage

我的 nginx.conf 文件如下。

http {
        # I've tried with and without line below that I found on Stackoverflow
        resolver 127.0.0.11 ipv6=off;
        server {
                listen 80;
                location / {
                        # lines below don't work 
                        # proxy_pass http//kestrel:80;
                        # proxy_pass http//kestrel
                        # proxy_pass http//kestrel:80/;
                        # proxy_pass http//kestrel/;


                        # when I put internal docker ip of Kestrel server works fine  
                        proxy_pass http://172.17.0.3:80/;
                }
        }
}
events {

}

标签: dockernginxkestrel-http-server

解决方案


我想出了解决我的问题的方法。有两个问题。

第一个问题:默认情况下,Docker 在创建容器时使用默认的桥接网络。不过,默认的 Docker 桥接网络不解析 DNS。您必须创建自定义桥接网络,然后在创建 docker 容器时指定网络。下面允许我使用主机名在容器之间 ping

docker network create --driver=bridge mycustomnetwork

docker run -d --name=kestrel --restart=always -h kestrel.local --network=mycustomnetwork mykestrelimage

docker run -d --name=nginx --restart always  -p 80:80 -h nginx.local --network=mycustomnetwork mynginximage

第二个问题:尽管出于某种原因它只是一个红隼服务器,但 Nginx 要求我在 /etc/nginx/nginx.conf 中设置一个上游部分

http {
        upstream backendservers {
                server kestrel;
        }
        server {
                listen 80;
                location / {
                        proxy_pass http://backendservers/;
                }
        }
}

events {

}

推荐阅读