我继承了一些 Docker 主机,将其用作公共 HTTPS 入口点的反向代理,以便可以在同一个 HTTPS 入口点下托管多个不同的 web 应用程序。
- https://foo.example.org/app1/->http://172.1?.0.2:3010
- https://foo.example.org/app2/->http://172.1?.0.3:4711
代理部分由 traefik 作为具有网络traefik_default
和的容器托管来实现172.18.0.0/16
。另一方面,默认的 Docker 网络是172.17.0.0/16
,路由表如下所示:
[...]@[...]:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 ens160
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-9628d8a7c930
192.168.131.0 0.0.0.0 255.255.255.0 U 0 0 0 ens160
[...]@[...]:~$ ip route show
default via 192.168.131.254 dev ens160 proto static
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-9628d8a7c930 proto kernel scope link src 172.18.0.1
192.168.131.0/24 dev ens160 proto kernel scope link src 192.168.131.151
[...]@[...]:~$ traceroute 172.17.0.3
traceroute to 172.17.0.3 (172.17.0.3), 30 hops max, 60 byte packets
1 172.17.0.3 (172.17.0.3) 0.050 ms 0.005 ms 0.003 ms
[...]@[...]:~$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
我认识到,事情是否按预期工作取决于容器在哪个网络中启动。如果是默认的 Docker 172.17
,事情就行不通。Traefik 无法转发请求并遇到 HTTP 状态 499、客户端关闭连接或网关超时等错误。这些似乎都与浏览器无关,而与 traefik 本身有关。
172.17.0.2
但是,它正确地记录了路由器、服务等的创建,并告知了有关使用配置的端口设置服务等的信息。没有关于错误网络、端口已被使用或诸如此类的错误。另一方面,当容器刚放入网络中时172.18
,一切立即开始工作,并且 traefik 会记录相同的内容,只是 IP 不同。
我的预期是,只要路由和其他东西正确,traefik 就能够到达容器 IP 和端口,无论容器在哪个网络运行都无关紧要。但事实并非如此,我没有看到路由错误。此外,我偶然发现了以下文档,这些文档甚至不再在搜索结果网站上提及:
Traefik 容器必须与要公开的容器连接到同一网络。如果 Docker Compose 文件中未指定任何网络,Docker 将创建一个默认网络,以允许 Traefik 访问同一文件中定义的容器。
那么,为什么只有将容器放入网络 traefik_default 中时 traefik 才会起作用?
谢谢!