首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从码头容器中获取Linux系统上的对接主机的IP?

如何从码头容器中获取Linux系统上的对接主机的IP?
EN

Stack Overflow用户
提问于 2022-02-10 23:50:32
回答 1查看 1.6K关注 0票数 0

这个问题似乎被问了很多次,但答案似乎过时了,或者根本行不通。

我在一个没有RTC ( raspberry pi)的Linux系统上。我的主机运行一个ntp守护进程(ntpd),当主机启动时,它会检查联机时间,前提是它有互联网,并设置系统时钟。

容器中的代码需要知道主机的系统时钟是否准确(自上次启动以来已经更新)。

在主机上,这是非常容易做到的--使用类似于ntpdate -q 127.0.0.1的东西。ntpdate通过udp连接到127.0.0.1:123,并与ntpd守护进程检查时钟是否准确(如果它自上次启动以来就已经更新)。这似乎更难在容器内完成。

如果我启动一个容器,并使用docker container inspect NAME查看容器的IP,它将显示如下:

代码语言:javascript
复制
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.6",

如果我在容器中运行ntpdate -q 172.19.0.1,这是可行的。不幸的是,172.19.0.1不是主机的永久IP。当容器启动时,子网已经被占用,子网会改变,所以硬编码这个IP是个坏主意。我需要的是一个环境变量,它总是反映主机的适当IP。

Windows和MacOS版本的docker似乎在容器中设置了host.docker.internal主机名,但是Linux没有。有些人建议在主机的/etc/hosts文件中设置这个名称,但是您只是硬编码IP,这同样可以更改。

我使用一个docker-compose.yml文件运行我的停靠容器,显然,在新版本的docker上,您可以这样做:

代码语言:javascript
复制
extra_hosts:
    - "host.docker.internal:host-gateway"

我试过这个,这个很管用。说大也大吧。在我的容器中,host.docker.internal解析为172.17.0.1,这是主机上docker0接口的IP。虽然我可以在容器中使用host.docker.internal,但是使用ntpdate -q host.docker.internalntpdate -q 172.17.0.1并不有效。

是否有办法使host.docker.internal从容器内解析到主机的适当网关IP?在我的例子中,172.19.0.1

注意:是的,我可以使用容器内的代码来检查容器的网关使用netstat或类似的东西,但是接下来我需要将代码复杂化,让它计算出NTP服务器(码头主机)的IP。我可能还可以将接口套接字传递到容器中,并尝试通过该接口获得对接主机的IP,但这似乎是超级hackey,也是不必要的安全问题。

EN

回答 1

Stack Overflow用户

发布于 2022-02-11 07:39:32

我找到的最佳解决方案是使用iproute2包中的iproute2命令,查找默认路由并使用网关地址。

代码语言:javascript
复制
ip route | awk '/default/ {print $3}'

如果您希望它在环境变量中,您可以使用

代码语言:javascript
复制
export HOST_IP_ADDRESS=$(ip route | awk '/default/ {print $3}')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71073713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档