我有一个 docker 主机(CentOs7),我正在其中运行多个 dockerized 应用程序,并且将来还会有更多。问题是我有一个外部服务,我需要从主机访问该服务,该主机使用 172.18.100.101 地址。
Docker 自动为其创建的桥接网络分配子网,172.18.x、172.19.x 等:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.x.x.x 0.0.0.0 UG 0 0 0 eth0
172.17.1.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-0a7f3df38b5c
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-636432c82f83
我看到的选项:
1. 告诉 Docker 不要使用 172.18.0.0 子网作为网桥。我认为这在 docker 中是不可能的。
2. 对于每个 docker 容器,我可以开始指定一个子网 - 但这变得非常有问题,因为您需要确保它们不会冲突,再加上 docker-compose.yml 文件在主机之间共享,所以这是一个管理噩梦。
3. 尝试在主机上以不同的方式路由所需的 IP (172.18.100.101) - 而 172.18.0.0 子网仍然存在。我不确定这是否可能。我尝试过添加路由,但没有帮助,可能是因为它是在 172.18.0.0 规则之后而不是之前添加的。
$ sudo route add -host 172.18.100.101 dev eth0
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.x.x.x 0.0.0.0 UG 0 0 0 eth0
172.17.1.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-0a7f3dfsudo ip route show to match 172.18.198.12038b5c
172.18.100.101 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-636432c82f83
有任何想法吗?我想问题是如何为选定的 ip(或子网)添加“例外”路由,并确保它在主要规则之前应用。
编辑(2018-06-21):问题不在于尝试连接 Docker 容器中的 ta 服务。我的问题是,在我的网络上有一个服务(在另一台服务器上,不由我拥有/控制),ip 为 172.18.100.101,但我无法从该主机连接到该服务,因为在此主机上 Docker 自动分配 172.18 .0.0 范围到它创建的桥接网络,因此任何对 172.18.100.101 的连接尝试都会发送到 Docker 创建的桥接,而不是发送到该外部主机。
答案1
Dockerbridge
网络只是配置网络的众多选项之一。这Docker 网络文档列出了许多可用于与容器通信的不同网络插件。
如果您只需要连接到 Docker 容器中的服务,那么搞乱网络就有点大材小用了,因为您可以在连接到 Docker 端口的主机上打开服务端口。 Docker 将此称为“发布端口”,并在docker run
带有标志--publish
或 的命令中使用-p
。应该不需要直接连接到 Docker 容器。
不过,如果您确实想直接连接到容器,Docker 肯定会让您进行配置。
编辑:我误解了最初的问题是关于主机路由的。
关于主机路由,Docker 确实允许您更改它使用的网络范围。如果您正在使用docker
它来创建网络,你可以配置docker0
接口无论您想要什么范围,请确保选择您的网络当前未使用的范围。
如果您用于docker-compose
创建网络,则需要在docker-compose.yml
该项目的文件中配置网络范围。
答案2
具有较大前缀的路由(例如您的172.18.100.101
主机路由)将比具有较小前缀的路由(例如 docker 添加的 /16 路由)具有更高的优先级。因此,您最初的方法应该有效。但是,除非172.18.100.101
可以在 上直接访问eth0
,否则您还需要为其指定网关。
例如:
ip route add 172.18.100.101/32 via 10.x.x.x dev eth0