ubuntu vm 将内部 ip 返回到 docker 镜像

ubuntu vm 将内部 ip 返回到 docker 镜像

我在物理主机上有一个在多通道上运行的 docker 镜像。docker 容器正在尝试连接到物理主机上运行的服务。但是,dns 解析告诉 docker,ip 地址是127.0.1.1。我认为虚拟机中的 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

promlife我认为如果 DNS 服务器返回,这个问题就可以解决10.13.31.13

从物理机:

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

来自 promlife 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 会自动将其解析为容器本地网络上的 Docker 主机的 IP 地址 - 这称为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

相关内容