我正在尝试设置可以访问互联网的容器,但到目前为止尚未成功。
# sudo systemd-nspawn -nb -M debian-tree
# systemctl enable --now systemd-networkd systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: host0@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether 42:ca:d5:8c:af:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# ping google.com
ping: google.com: Temporary failure in name resolution
在主机上
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 7c:7a:91:ae:7d:47 brd ff:ff:ff:ff:ff:ff
8: ve-debian-tree@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 92:f7:e1:4b:c6:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0
有什么想法为什么它不起作用吗?
答案1
根据我的经验,容器和主机都需要运行 systemd-networkd 和 systemd-resolved。它可以在 Ubuntu Bionic 中工作,但不能在 Xenial 中工作,因为后者使用 /etc/network/interfaces (networking.service) 而不是 systemd-networkd。
出于同样的原因,它也不适用于 Debian Stretch。
答案2
您的问题是您可能没有正确设置 DNS 解析器。
通过检查输出,我们确实看到容器附加了自己的网络命名空间(网络堆栈),并且该堆栈与主机断开连接,并且您有虚拟网络电缆host0@if8
进入主机link-netnsid 0
(netns 0 = 主机网络堆栈):
2: host0@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
link/ether 42:ca:d5:8c:af:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0
我们还看到该虚拟网络电缆的其他部分卡在主主机网络命名空间(主网络堆栈)中:
8: ve-debian-tree@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 92:f7:e1:4b:c6:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0
我不完全确定,但主机上的状态应该是state UP
,而不是state DOWN
报道的那样。
无论如何,您应该获得给定链接的 IP 地址,ip addr
并且您应该能够从容器内 ping 各个接口(本地接口和主机接口)。
一旦成功 - 您应该能够 ping 通 DNS 服务器运行的接口。如果此 DNS 服务器无法访问,您需要修复它。
一旦开始,您应该能够解析外部 DNS 名称。