我们目前使用 CentOS libvirt-LXC 工具集在 CentOS 7.1 下创建和管理容器。不过,此工具集已被弃用,因此我们计划将容器改为在 linuxcontainers.org 框架下运行。我将其简称为 LXC,而不是 libvirt-LXC。
在 libvirt-LXC 下,我们将容器配置为使用主机桥接,因此它们连接到主机网络。每个容器都有自己的静态 IP,并在网络上显示为物理机器。它们可以看到彼此以及在同一网络上运行的其他系统。
到目前为止,我还无法让主机桥接与 LXC 配合使用。关于 LXC 的网络,有很多信息,但很多信息似乎描述了略有不同的设置方法,而且我尝试过的方法都没有按我预期的方式工作。我能够让容器互相看到,但无法让它们看到主机网络。我为容器使用的配置如下所示:
lxc.utsname = test1
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
br0 接口与我为 libvirt-LXC 容器配置的桥接接口相同。我遇到的一些讨论为 LXC 设置主机桥接的网站都说要在 iptables 中配置规则。但是,对于 libvirt-LXC,我们不需要任何此类规则,而且实际上 iptables(或者更准确地说,CentOS 7 下的防火墙)甚至没有启用。
除了我正在使用的这个配置之外,我还创建了 /etc/sysconfig/network-scripts/ifcfg-eth0,其中包含以下条目:
DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
BOOTPROTO=none
IPADDR=172.16.110.222
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
这是我用于基于 libvirt-LXC 的容器的完全相同的文件。正如我所说,容器可以互相看到,但它们无法访问主机网络。它们甚至无法 ping 自己的主机。不过,我的 LXC 和 libvirt-LXC 容器的路由表是相同的:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1021 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
我不确定我缺少什么 LXC 魔法来将容器打开到外部网络。我对 LXC 和 libvirt-LXC 测试使用相同的模板,并且对两者使用相同的主机。我缺少什么?
运行一个容器的“bridge link show br0”的输出是:
# bridge link show br0
3: bond0 state UP : <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 19
6: virbr0-nic state DOWN : <BROADCAST,MULTICAST> mtu 1500 master virbr0 state disabled priority 32 cost 100
22: veth5BJDXU state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master virbr0 state forwarding priority 32 cost 2
veth 名称由 LXC 自动选择。使用 libvirt-LXC 和一个容器的等效设置产生的输出基本相同,只是生成的名称是 veth0。
顺便说一句,virbr0-nic 接口由 libvirt 创建,用于配置为使用 NAT 而不是桥接的 libvirt-LXC 容器和虚拟机。有趣的是,如果我对 libvirt-LXC 容器使用 NAT 寻址,它们的行为与我的 LXC 容器相同,LXC 容器应该使用通过 br0 的桥接网络。这让我怀疑我是否实际上以某种方式对 LXC 容器使用 NAT 寻址而不是桥接网络。