我有一套由systemd-nspawnpipe理的容器。 容器应该与外部networking(半)隔离,但同时应该能够访问主机上运行的非集装箱服务,如DBMS(见图)。 networking由systemd-networkd
两端pipe理。
我已经尝试了systemd-nspawn的以下最常见的专用networking模式:
-n, --network-veth
为每个容器创build一对连接的虚拟以太网适配器,一个在主机端,另一个在容器内。 看起来好像没什么用处,因为不清楚DBMS应该监听哪个地址以及容器应该连接到哪个地址。
--network-bridge=
大致相同,但将虚拟适配器添加到指定的桥接器。 桥应该已经安装并分配了一个IP:
# /etc/systemd/network/br0.netdev [NetDev] Name=br0 Kind=bridge
# /etc/systemd/network/br0.network [Match] Name=br0 [Network] Address=169.254.1.1/16
这个configuration已经被certificate是可行的,但是需要额外的网桥configuration,并且在涉及容器的外部networking访问时通常是有问题的。
--network-zone=
相同,但自动pipe理网桥接口。 以下是我们在桥上默认获得的内容:
[root@host ~]# ip addr show vz-containers 26: vz-containers: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 inet 169.254.120.107/16 brd 169.254.255.255 scope link vz-containers valid_lft forever preferred_lft forever inet 10.0.0.1/24 brd 10.0.0.255 scope global vz-containers valid_lft forever preferred_lft forever inet 10.0.1.1/24 brd 10.0.1.255 scope global vz-containers valid_lft forever preferred_lft forever
好像它被分配了一个169.254.0.0/16
的随机地址,以及两个静态地址10.0.0.1
和10.0.1.1
。 主机可以通过这两个地址从容器到达。 但是目前还不清楚这些地址是从哪里来的,我不确定在未来的systemd版本中这一点是不会改变的。 为了确保,我们可以为网桥接口分配一个额外的静态IP:
# /etc/systemd/network/80-container-vz.network - full override, systemd < 232 [Match] Name=vz-* Driver=bridge [Network] # Default to using a /24 prefix, giving up to 253 addresses per virtual network. Address=0.0.0.0/24 Address=169.254.1.1/24 # the rest is left as in the original /usr/lib/systemd/network/80-container-vz.network
# /etc/systemd/network/80-container-vz.network.d/override.conf - drop-in, systemd ≥ 232 [Network] Address=169.254.1.1/24
这很好,不会造成外部networking连接的问题,但也需要额外的桥接configuration。 此外,这两种方法(网桥和区域)都需要configuration静态/etc/hosts
条目,因为systemd-resolved
和朋友( mymachines
, myhostname
和resolve
NSS模块)在这里不是很有帮助:
# /etc/hosts 169.254.1.1 host
幸运的是,所有容器共享相同的基本操作系统映像,所以这并不难。
问题是,以上所有可以以更简单的方式完成吗? 还是应该等到systemd-nspawn
得到一些神奇的选项,比如“让主机在容器中可以通过<foo>主机名称访问”?