Ubuntu VM が Docker イメージに内部 IP を返す

Ubuntu VM が Docker イメージに内部 IP を返す

物理ホスト上のマルチパスで実行されている Docker イメージがあります。Docker コンテナは、物理ホストで実行されているサービスに接続しようとしています。ただし、DNS 解決により、IP アドレスが であると Docker に通知されます127.0.1.1。VM の DNS ルックアップでは、パブリック アドレスが必要なときに、ローカル IP アドレスが返されていると思います。

physical host: culsu (ubuntu 18.04)
    multipass host: promlife (ip: 10.13.31.13) (ubuntu 22.04)
        docker container: prometheus (ip: 172.18.0.9)
            dns lookup of promlife: 127.0.1.1

promlifeDNSサーバーが復帰すれば問題は解決できると思います10.13.31.13

物理マシンから:

$ ping promlife
PING promLife (10.13.31.13) 56(84) bytes of data.

プロムライフVMより:

$ ping promlife
PING promlife (127.0.1.1) 56(85) bytes of data.

Docker コンテナから:

$ ping promlife
PING promlife (127.0.1.1) 56(85) bytes of data.

Prometheus で仮想ホストを解決するために何を変更する必要があるかについて、何かご意見はありますか?

この問題は systemd-resolvd に関連している可能性がありますか?

ご協力いただきありがとうございます!

答え1

アドレス 127.0.1.1 は、Linux ホストが で「名前による自分自身への」アドレスとして設定するアドレスです/etc/hosts。 を実行するとping(または POSIX 名前解決を使用する他の何か)、nsswitchライブラリを使用してファイルを調べ、/etc/hosts完全修飾名ではない名前の意味を見つけます。

コンテナ内部からなぜそうなるのかはわかりません。何らかの方法でホストnsswitchライブラリにオフロードしますが、これは Docker の問題かもしれません。

とにかく、Docker コンテナ内から Docker ホストにアクセスする場合、正しい方法は、コンテナのローカル ネットワーク上の Docker ホストの IP アドレスに Docker が自動的に解決する特別なホスト名を使用することです。これは と呼ばれますhost.docker.internal

試してください:ping host.docker.internalコンテナ内から。

答え2

DNS設定を更新する必要がありますプロムライフ/etc/netplan/netcfg.yamlファイルを編集することができます。ネームサーバー優先 DNS サーバーを指定するフィールド。

network:
  version: 2
  ethernets:
    ens: 
      addresses: [10.13.31.13/24] # Your IP configuration
      gateway4: 10.13.31.1 # Your gateway
      nameservers:
        addresses: [8.8.8.8]  

設定を更新したら、それを適用します
sudo netplan apply
systemd 解決済みサービスが変更を確実に取得できるようにします。
sudo systemctl restart systemd-resolved

関連情報