如何让同一主机上的 Ubuntu 22 LXC 容器能够解析彼此的名称?

如何让同一主机上的 Ubuntu 22 LXC 容器能够解析彼此的名称?

环境

主持人是 Ubuntu 22.04.2 LTS 我有 2 组容器

  1. Ubuntu 16.04.7 LTS 容器运行良好
  2. 我目前正在测试 Ubuntu 22.04.2 LTS,因为我最终想升级所有容器
$ apt list -i | grep lxc
liblxc-common/jammy,now 1:5.0.0~git2209-g5a7b9ce67-0ubuntu1 amd64 [installed,automatic]
liblxc1/jammy,now 1:5.0.0~git2209-g5a7b9ce67-0ubuntu1 amd64 [installed,automatic]
lxc-templates/jammy,now 3.0.4-5 amd64 [installed]
lxc-utils/jammy,now 1:5.0.0~git2209-g5a7b9ce67-0ubuntu1 amd64 [installed,automatic]
lxc/jammy,jammy,now 1:5.0.0~git2209-g5a7b9ce67-0ubuntu1 all [installed]
lxcfs/jammy,now 5.0.0-0ubuntu2 amd64 [installed,automatic]
$ apt list -i | grep dnsmasq
dnsmasq-base/jammy-updates,jammy-security,now 2.86-1.1ubuntu0.1 amd64 [installed,automatic]
Container creation
Created both the 16 and 22 containers in the same way, replacing the release name
lxc-create --template download --name {name} --logfile {log} -l trace -- --dist ubuntu --release {release} --arch amd64

容器创建和设置

  1. 以同样的方式创建了 16 和 22 个容器,替换了发布名称
lxc-create --template download --name {name} --logfile {log} -l trace -- --dist ubuntu --release {release} --arch amd64
  1. 另外,我在主机的 /etc/hosts 文件中手动添加每个容器的 IP

  2. “重置 dnsmasq 缓存” -sudo pkill -1 -u lxc-dnsmasq

唯一的区别是,我在 Ubuntu 16 中执行了ifup eth0,但在 Ubuntu 22 中不可用,所以我ip link set eth0 up改为执行了。这与我的问题有关吗?

问题

问题是我的/etc/resolv.conf文件。

在我的 Ubuntu 16 容器中,只有一行简单的代码

nameserver 10.0.3.1

在我的 Ubuntu 22容器中,它包含

nameserver 127.0.0.53
options edns0 trust-ad
search .

我的 Ubuntu 16 容器可以很好地互相 ping 通。我的 Ubuntu 22 容器则不行。它们也无法通过主机名称 ping 通主机,而 Ubuntu 16 容器可以

myuname@mycontainer-local:~$ sudo ping -v rabbitmq-local
ping: rabbitmq-local: Temporary failure in name resolution

(是的,奇怪的是我需要在 22 个容器上使用 sudo,否则它会抱怨不允许打开套接字)

问题是,我从未配置/etc/resolv.conf或任何可以在我的 Ubuntu 16 容器上生成它的东西。所以我不知道它怎么知道它应该使用10.0.3.1,但在 Ubuntu 22 上它显然没有。编辑/etc/resolv.confUbuntu 22 上的以匹配 Ubuntu 16 中的旧文件,解决了这个问题。但显然这个文件是自动生成的,所以这只是一个临时的解决方法。什么是更永久的解决方案?

我研究了可能的编辑/etc/netplan/10-lxc.yaml,但是

  1. 我不太清楚该编辑什么
  2. 我不确定是否可以在不手动将 10.0.3.1 添加到文件的情况下使其正常工作。Ubuntu 16 上会自动配置它,我想继续自动执行此操作,而不是仅在某个 conf 文件中硬编码此 IP(尽管如果没有其他选择,我想我会选择它)

我唯一的线索是 Ubuntu 16ifup eth0和 Ubuntu 22之间可能存在一些不同ip link set eth0 up

答案1

在 Ubuntu 的后续版本中,/etc/resolv.conf 始终指向 127.0.0.53,这是systemd-resolved绑定到用作本地解析器的 IP。 resolvectl将显示本地解析器将请求转发到上游的配置。如果resolvectl没有显示您的 10.0.3.1 名称服务器作为配置的上游解析器,那么您需要调查并修复该配置。

如果使用,lxd一般预期是 DNS 将通过 DHCP 提供给容器。在这种情况下,您lxc直接使用lxc-create,所以我无法谈论这一点。

答案2

在更高版本中(可能是从 18.04 开始),/etc/resolv.conf自动生成systemd。正如您所发现的,编辑它是暂时的。要进行永久更改,您必须编辑其中一个已解析的配置文件/etc/systemd 下的文件。

我通过编辑来定义 DNS 服务器和搜索域/etc/systemd/resolved.conf添加以下内容:

DNS=x.x.x.x y.y.y.y
FallbackDNS=z.z.z.z
Domains=mydomain.org corp.mydomain.org

(请注意,/etc/resolv.conf 中的名称服务器始终为 127.0.0.53,但查找使用您定义的名称服务器)

使用以下命令重启服务systemctl restart systemd-resolved.service

观看什么解决取决于journalctl -u systemd-resolved -f

resolvectl如果你有时间玩一下(我还没玩过),它是一款非常有趣的工具。它允许进行一些配置更改,但我不知道这些更改是否持久。

请参阅man 5 resolved.confman resolvectl了解详情。

相关内容