首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从systemd-n育容器访问主机服务

从systemd-n育容器访问主机服务
EN

Server Fault用户
提问于 2017-08-05 21:11:05
回答 2查看 2.8K关注 0票数 0

我有一组由系统d-n产卵管理的容器。容器应该(半)与外部网络隔离,但同时应该能够访问运行在主机上的非容器服务(如DBMS )(请参阅图解)。网络由systemd-networkd在两端进行管理。

我尝试过以下最常见的系统-n派生私有网络模式:

虚拟以太网

-n, --network-veth为每个容器创建一对连接的虚拟以太网适配器,一个在主机端,另一个在容器内。这似乎没有多大用处,因为还不清楚DBMS应该侦听哪个地址,以及容器应该连接到哪个地址。

--network-bridge=所做的基本相同,但是将虚拟适配器添加到指定的桥上。网桥应该已经设置好并分配了一个IP:

代码语言:javascript
复制
# /etc/systemd/network/br0.netdev 
[NetDev]
Name=br0
Kind=bridge
代码语言:javascript
复制
# /etc/systemd/network/br0.network 
[Match]
Name=br0

[Network]
Address=169.254.1.1/16

这个配置已经证明是有效的,但是需要额外的桥接器配置,并且当涉及到容器的外部网络访问时通常是有问题的。

--network-zone=也会这样做,但是会自动管理桥接口。在默认情况下,这座桥的情况如下:

代码语言:javascript
复制
[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.110.0.1.1。通过这两个地址可以从容器中找到主机。但目前还不清楚这些地址来自何处,我也不确定这种情况在系统d的未来版本中不会改变。为了确保,我们可以为桥接器接口分配额外的静态IP:

代码语言:javascript
复制
# /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
代码语言:javascript
复制
# /etc/systemd/network/80-container-vz.network.d/override.conf - drop-in, systemd ≥ 232
[Network]
Address=169.254.1.1/24

这很好,不会给外部网络连接带来问题,但也需要对桥接器配置进行额外的修改。此外,这两种方法(桥和区域)都需要配置静态/etc/hosts条目,因为systemd-resolved和朋友(mymachinesmyhostnameresolve NSS模块)在这里没有多大帮助:

代码语言:javascript
复制
# /etc/hosts
169.254.1.1 host

幸运的是,所有的容器都共享相同的基本OS映像,所以这并不难做到。

问题是,能否以一种更简单的方式进行上述所有的工作?或者我应该等到systemd-nspawn得到一些神奇的选项,比如“让主机通过主机名访问容器中的主机”?

EN

回答 2

Server Fault用户

发布于 2020-03-24 11:21:33

遇到了同样的麻烦--我的回答或多或少和Kiraly的一样,但配置100%由主机控制。

可以复制和修改股票/lib/systemd/network/80-container-ve.network以在特定的静态IP上设置主机地址(您还需要更新[Match])

然后-设置一个只有一个地址的DHCP池。这样它就可以预测-并且容器不需要静态地配置,它只是在引导时选择正确的地址。

所以-就像这样

/etc/systemd/network/50-mycont.network

代码语言:javascript
复制
[Match]
# Hard match for the container interface name - no wildcards
Name=ve-mycont
Driver=veth

[Network]
# Static address for host
Address=10.0.60.49/28
LinkLocalAddressing=yes
DHCPServer=yes
IPMasquerade=yes
LLDP=yes
EmitLLDP=customer-bridge

[DHCPServer]
PoolOffset=2
PoolSize=1
# Little DHCP - container will have address 10.0.60.50
票数 1
EN

Server Fault用户

发布于 2018-02-04 13:14:51

还不清楚这些地址是从哪里来的

如果您使用的是systemd,那么配置文件来自具有.network扩展名的配置文件。这些文件位于/etc/systemd/network/run/systemd/network/usr/lib/systemd/network中,后者是默认的,如果您没有在/etc中修改任何内容。systemd的文档是这里。您可能在您的网络上有一个DHCP服务器,并且根据您使用的网络模式,IP地址可能从该DHCP服务器得到分配。

问题是,能否以一种更简单的方式进行上述所有的工作?

大多数数据库都是基于网络的,它们在主机上的特定端口上进行监听.根据您的网络配置,您的主机应该有一个具有IP地址的接口,该地址位于主机端,但可以从容器中到达。请记住,防火墙和化装舞会也可能发挥重要作用。一旦建立了连接,确保您的数据库服务器也在监听给定的接口。

使主机通过主机名访问容器中的主机

由于您控制着您的主机端IP地址,您可以像以前一样将一个条目放入/etc/hosts中。我不知道有任何更简单的解决方案,也没有任何外部解决方案。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/867055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档