docker - 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 {
}
解决方案
我想出了解决我的问题的方法。有两个问题。
第一个问题:默认情况下,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 {
}
推荐阅读
- python-3.x - 如何从下拉列表中检索值列表
- r - vctr_rcrd 类对象上的取消列出行为
- javascript - 如何知道 iframe 何时完成加载 DOM,但尚未加载所有图像?
- ssis - SSIS 文件传输任务使用了错误的密码
- mongodb - MongoDB 无法匹配聚合返回的对象字段
- scala - 如何更改 IntelliJ IDEA 中的检查方式?(Scala 插件)
- sql - 当某些数据不存在时 SQL 中多列的平均值
- javascript - 如何使用 SVG 路径命令?
- excel - 具有多个记录集的单个 ADO 连接
- version-control - Mercurial 防止在合并时静默删除文件