我有一个运行 Web 服务器的 Docker 容器,它正在监听端口 80 (jenkins/jenkins:lts)
我在主机上有 2 个接口,一个专用于容器(一旦启用,它将被锁定,仅允许 HTTP/HTTPS
这是实例上的 NIC 配置(这是 AWS,因此它们是弹性网络接口):
- 网关:10.10.20.1
- eth0 ip 10.10.20.200
- eth1 ip 10.10.20.111
路由配置,因为这是非对称路由:
- ip route 添加默认通过 10.10.20.1 dev eth0 tab 1
- ip route 通过 10.10.20.1 dev eth1 tab 2 添加默认
- ip 规则从 10.10.20.111/32 选项卡 2 添加优先级 500
- ip 规则从 10.10.20.200/32 选项卡 1 添加优先级 600
以下是设置上述路由规则后的一些输出:
root@docker01:/home/ubuntu#ip route show tab 1
default via 10.10.20.1 dev eth0
root@docker01:/home/ubuntu# ip route show tab 2
default via 10.10.20.1 dev eth1
root@docker01:/home/ubuntu# ip rule
0: from all lookup local
500: from 10.10.20.111 lookup 2
600: from 10.10.20.200 lookup 1
32766: from all lookup main
32767: from all lookup default
Docker 容器正在监听 0.0.0.0:80
尝试访问时,结果如下:
- http://10.10.20.200— 工作正常(加载 Jenkins 界面)
- http://10.10.20.111— 不起作用
- ping 10.10.20.200 — 成功
- ping 10.10.20.111 — 成功
- ssh 10.10.20.200 — 有效
- ssh 10.10.20.111 — 有效
由于 ping 和 ssh 可以工作,我感觉这与 docker 有特别的关系。
以下是端口的“docker ps”输出:
0.0.0.0:443->443/tcp, 0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp
我已经检查过的内容:
- 防火墙/安全组 — 两个 ENI 都允许端口 80 和 ICMP,并且所有内容都允许不受限制的出站。除了 docker 自动创建的规则外,没有其他 Iptables 规则
- 使用明确的监听 IP 运行容器(例如:-p 10.10.20.111:80:80)虽然没有什么区别,但是它显然破坏了通过其他地址访问它的能力。
- netstat 显示端口 80 开放并在全球范围内监听