LXCコンテナを使用しており、CONTAINERNAME.lxdを指定されたコンテナのIPとして確認するには、次のようにします。
sudo resolvectl dns lxdbr0 $bridge_ip
sudo resolvectl domain lxdbr0 '~lxd'
本当に良いです!ただし、変更はホストを再起動しても保持されません。
(私はこの質問に答えて、さまざまなレベルの成功と共に「私が試したこと」を説明しました。)
私はUbuntu 22.04に基づくPop!_OS 22.04を使用しています。
再起動後もこれらのresolvctlの変更を維持するにはどうすればよいですか?
答え1
これLXD ドキュメントにはソリューションが記載されています。:
これを /etc/systemd/system/lxd-dns-lxdbr0.service に入れてください:
[Unit]
Description=LXD per-link DNS configuration for lxdbr0
BindsTo=sys-subsystem-net-devices-lxdbr0.device
After=sys-subsystem-net-devices-lxdbr0.device
[Service]
Type=oneshot
ExecStart=/usr/bin/resolvectl dns lxdbr0 BRIDGEIP
ExecStart=/usr/bin/resolvectl domain lxdbr0 '~lxd'
ExecStopPost=/usr/bin/resolvectl revert lxdbr0
RemainAfterExit=yes
[Install]
WantedBy=sys-subsystem-net-devices-lxdbr0.device
(で独自のBRIDGEIPに交換lxc network show lxdbr0 | grep ipv4.address
)
その後、再起動せずに次の設定を適用します。
sudo systemctl daemon-reload
sudo systemctl enable --now lxd-dns-lxdbr0
答え2
私はひどい解決策を思いついた。lxc-ip
出力からコンテナのIPv4を取得するスクリプトを作成しますlxc list
。使用例: ping $(lxc-ip mycontainer)
。
スクリプトは次のとおりです。
#!/usr/bin/env bash
prog=$(basename $0)
function usage {
echo "Usage: $prog CONTAINER" >&2
echo "Outputs IPv4 address of given CONTAINER." >&2
}
container=""
while [[ $# -gt 0 ]]
do
case "$1" in
-h|--help)
usage
exit 0
;;
*)
if [ -z "$container" ]; then
container=$1
else
echo "$prog error: Not multiple CONTAINERs" >&2
usage
exit 1
fi
;;
esac
shift
done
if [ -z "$container" ]; then
echo "$prog error: Must pass a CONTAINER" >&2
usage
exit 1
fi
table=$(lxc list -c ns4 -f csv)
line=$(echo "$table" | grep "$container")
if [ -z "$line" ]; then
echo "$prog error: Container '$container' not found. Existing containers are:" >&2
lxc list -c n -f compact >&2
exit 2
fi
if ! grep -qs RUNNING <<<"$line" ; then
echo "$prog error: Container is not running: $line" >&2
exit 3
fi
ipv4=$(echo "$line" | cut -d',' -f3 | cut -d' ' -f1)
if [ -z "$ipv4" ]; then
echo "$prog error: Container has no IPv4: $line" >&2
exit 4
fi
echo "$ipv4"
答え3
誰もが改善または確認できる場合、同僚は次のテキストに関連するいくつかのメカニズムを使用してこの問題を解決したと報告しました/etc/systemd/network/lxd.network
。
[Match]
Name=lxdbr0
[Network]
Address=BRIDGEIP/24
DNS=BRIDGEIP
Domains=lxd
(で独自のBRIDGEIPに交換lxc network show lxdbr0 | grep ipv4.address
)
(この場合、systemd-networkdとNetworkManagerを同時に実行する必要があるかもしれません)
答え4
一つ見た同様のaskubuntu.comの問題ここで唯一の(-1)答えは、他のresolvctl変更をnmcli(Network Manager CLI)呼び出しに変換して保存することを提案しました。これは明らかに情報を永続的などこかに保存し、起動時に「resolvectl」設定を埋めるために使用されます。
これにより、次を使用して最初のresolvctl呼び出しを変換する方法がわかります。
sudo nmcli connection modify lxdbr0 ipv4.dns $bridge_ip
ただし、2番目のresolvctl呼び出し( "domain = ~ lxd"設定)をnmcliコマンドに変換することはできません。
したがって、この方法では問題は解決されません。