问题描述
想要在Docker中运行一个容器,作为连接私有(--internal
)Docker网络和预定义host
网络的路由器。这意味着容器需要具有两个网络接口:一个“外部”接口,可以访问所有主机IP地址,以及一个“内部”接口,作为内部Docker网络中容器的网关。路由器容器本身将对容器之间的网络流量进行NAT处理。
用户尝试手动连接容器,但遇到错误:
# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network
用户希望有人能够展示如何实现这一目标,最好还能使用Docker Compose。
解决方案
在Docker中同时连接容器到主机网络和内部桥接网络是有一些限制的。Docker不允许一个容器同时连接主机网络和其他Docker桥接网络。以下是一个例子来说明这个限制的原因:
假设我们有一个容器C1,它连接到主机网络(--net=host
)和一个Docker桥接网络Br1(--net=Br1
)。还有一个容器C2,连接到Br1。
在上面的设置中,C2可以访问主机网络,这可能会导致主机网络被暴露给非主机指定的容器。因此,Docker会自动阻止将容器无意中连接到主机网络。
如果我们有一组容器,想要使它们相互连接,但只有一个容器可以访问主机网络,可以采取以下步骤:
- 将容器C1连接到主机网络(
--net=host
)。 - 将其他容器(C2、C3、…、CN)连接到一个用户自定义的Docker桥接网络Br1(
--net=Br1
)。 - 在容器C1中暴露端口,以便其他容器可以从容器C1访问。
然而,为了让C1可以从其他容器访问,还需要调整iptables策略。你可以在Docker文档中找到有关如何配置iptables的信息:https://docs.docker.com/network/iptables/
另外,有人提到可以使用network_mode: host
来将容器连接到主机网络,但是这不能同时满足连接到内部网络和主机网络的需求。目前在Docker中并没有一个简单清晰的解决方案来解决这个问题。
请注意,对于这种复杂的网络配置,可能需要进行额外的测试和配置来确保安全性和正确性。