我有一台 docker 主机,位于一个小型专用网络上,该网络上还连接了一些 IP 摄像机,其中一个位于例如192.168.10.10。 我还有一个需要相互通信的 docker 容器集群,将其保留在自己的 docker 桥接网络中会很方便。 问题是:我可以允许容器访问容器主机可以解析的非公共 IP,同时仍然连接到桥接网络吗?
--network=host
和 --network=mycoolnet
(“无法同时附加用户定义和非用户定义的网络模式。”)--aux-host=mycamera:192.168.10.10
)可以提供一个不错的主机名,但不会使该IP上的内容在容器内可访问docker network create -d macvlan --subnet 192.168.0.0/16 --gateway 192.168.0.1 -o parent mynetworkdevice my-macvlan-net
)会在该子网上为容器分配一个身份,但并不会使该子网的内容必须可供容器使用。我不是问具体如何连接到本地主机;在另一个问题
中已经简洁而正确地回答了这个问题编辑:这个原始问题中尚不清楚的一个复杂问题(也是解决问题的关键)是,192.168.10.10 不能由主机上的主网络接口解析,而是由第二个接口(前面提到的“小专用网络”)解析。 ”)
我遇到的问题与 docker 网络本身如何工作无关,而是与 iptables 如何路由我的请求有关。 我在最初的问题(我将很快更新)中没有提到的一个复杂问题是 docker 主机位于多个网络上。 对 192.168.10.10 的请求将退出 docker 容器并由主网络接口处理,但辅助网络接口可以解决该请求。 因此,请求将在容器内被退回。 在容器之外,主机知道尝试这两个接口,并且可以很好地满足我的请求。
解决我的特殊情况的步骤:
创建docker网络时,我使用特定的子网来创建它
docker network create --driver=bridge --subnet=192.168.100.0/24 dev2-bridge
检查iptables,可以看到docker创建了一个伪装规则,这显然不是我想要的:
> iptables -L -n -t nat
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.100.0/24 0.0.0.0/0
...
让我们看看我的IP路由并找到我想要的设备的网关
> ip route
...
192.168.10.0/24 dev interface2 proto kernel scope link src 192.168.10.3 metric 101
看起来我想使用网关 192.168.10.3 来解析 192.168.10.0 地址!
我删除了伪装规则(我下面的命令从技术上删除了newest规则),并添加了一个SNAT规则
> iptables -t nat -D POSTROUTING 1
> iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -d 192.168.10.0/24 -j SNAT --to-source 192.168.10.3
> iptables -L -n -t nat
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
...
SNAT all -- 192.168.100.0/24 0.0.0.0/0 to:192.168.10.3
...
这意味着 docker 网络 dev2-bridge 现在看不到我的本地网络 192.168.10.3 看不到的任何内容。 这对我来说很好! 它可能不适合您的用例。
ServerFault 上的这个答案是获得我需要的结果的关键。