【问题标题】:Nginx reverse proxy not finding other internal Docker container using hostnameNginx 反向代理未使用主机名找到其他内部 Docker 容器
【发布时间】:2020-10-20 05:48:20
【问题描述】:

我有两个 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:在 /etc/nginx/nginx.conf:7 的上游“kestrel”中找不到 [emerg] 主机

我用这两行启动了容器

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 {

}

【问题讨论】:

  • 很可能它们位于不同的 docker 网络上,因为您没有说明是否将它们放在同一个 docker 网络上。
  • Docker 不是默认将所有内容放在同一个内部网络上吗? (两者似乎都在 172.17.0.x 上)
  • docker network connect 声明“一旦连接,容器就可以与同一网络中的其他容器通信。”
  • kestral 容器仅在 docker 的内部网络上。 nginx 容器位于 docker 内部和公共网络上。我尝试在 nginx.conf 中将 dns 服务器设置为 127.0.0.11,以防万一这是它无法解析主机名的原因,但它似乎没有任何效果。 (我可以从 nginx 容器内 ping kestral 的 ip,但无法 ping 主机名)
  • 根据文档“一旦连接到网络,容器只能使用另一个容器的 IP 地址或名称进行通信。”

标签: docker nginx kestrel-http-server


【解决方案1】:

我找到了解决问题的方法。有两个问题。

第一个问题:默认情况下,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

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

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

events {

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 2020-02-26
    • 2021-05-04
    • 2020-09-10
    • 1970-01-01
    • 2018-03-20
    • 2020-01-27
    • 2021-09-30
    相关资源
    最近更新 更多