我可以在我的 docker 容器中获取 IP 地址吗?

Posted

技术标签:

【中文标题】我可以在我的 docker 容器中获取 IP 地址吗?【英文标题】:Can I get ip address inside my docker container? 【发布时间】:2015-02-24 13:18:52 【问题描述】:

如何获取该容器内的容器ip地址?

'docker inspect $hostname ...' 不适合,因为我不将 /var/run/docker.sock 主机文件共享到容器。

【问题讨论】:

用于什么用例?如果是用于服务器,您通常只需查看本地 IP 以获取传入请求。 我会将ip发送到另一个容器(例如nginx)并从nginx创建上游(重定向子域http请求)到第一个容器。 我认为通常你会通过链接来做到这一点?就像当你启动你的 nginx 机器时,你指定 --link firstcontainer:firstcontainer 然后在 nginx 中,你实际上可以代理到主机名 firstcontainer 因为链接会自动设置 DNS 以将其解析为第一个容器 IP。 我无法链接,因为首先我运行的是 nginx 容器。这看起来很奇怪,但就我而言,这是正确的做法。 酷,只是想确定是有原因的。 【参考方案1】:

我可以通过

找到IP地址
hostname -i

当然,如果有多个接口,这可能并不完全准确。

编辑

注意:根据hostname手册页,hostname -i使用DNS解析ip地址,其中hostname -I显示除了loopback之外的所有地址,不依赖DNS,推荐.

在我所有的 Docker 容器中,-i-I 返回相同的结果(但在我的桌面上不是这种情况)。

【讨论】:

太棒了,没想到这么简单:) 应该选择这个作为答案 更准确地说:hostname -i | awk 'print $1' 因为有一个尾随空格(并且可能不止一个 IP) @RomualdBrunet 它应该是hostname -I | awk 'print $1' 因为-i 提供单个IP,而-I 提供多个(如果存在) 当我将 docker 容器连接到两个网络时,hostname -ihostname -I 都返回 172.18.0.2 172.19.0.2(但 hostname -I 确实返回尾随空格)。我认为hostname -i 的行为取决于dns 的配置方式。【参考方案2】:

由于 IP 地址在 /etc/hosts 的第一行,您可以在容器中执行 awk 命令,打印 /etc/hosts 第一行的第一个单词

$ awk 'ENDprint $1' /etc/hosts
172.17.0.14

【讨论】:

这似乎不再正确。在 docker-engine 1.10.3 的容器中,/etc/hosts 的最后一行是我的 ip 地址,第一行是 loopback。 现在awk 'ENDprint $1' /etc/hosts似乎可以完成这项工作 不一定正确且完全不安全 awk 太过分了,也许一个简单的 sed 命令就可以满足需要(我猜要删除空格?)sed -i 's/[ \t]*$//' "$1"【参考方案3】:

为什么不这么简单:

grep "`hostname`" /etc/hosts|awk 'print $1'

grep "$HOSTNAME" /etc/hosts|awk 'print $1'

【讨论】:

如果您的主机名恰好是其他主机名的子字符串,这将返回多个 IP 地址。【参考方案4】:

通常您可以使用 linux 程序ifconfig 来获取 IP 地址和其他网络详细信息。您的容器可能没有它,在这种情况下,您需要通过apt-getyum 或您的发行版的包管理器安装它。获取 IP 地址的基本管道是

ifconfig eth0 | grep "inet addr:" | cut -d : -f 2 | cut -d " " -f 1

【讨论】:

容器不一定有 eth0 接口。 容器也不一定要安装ifconfig【参考方案5】:

我找到了解决问题的方法:

/sbin/ip route|awk '/scope/  print $9 '

打印类似:'172.17.0.135'

【讨论】:

【参考方案6】:

您还可以在 /etc/hosts 中查找以容器 id 结尾的行并打印第一个字段:

sed -n 's/^\([0-9\.]*\)[[:blank:]]*[0-9a-f]\12,\$/\1/p' /etc/hosts

我会使用 awk,但 dedian:jessie 中的标准 awk 不支持像 12, 这样的正则表达式量词。

【讨论】:

【参考方案7】:

如果您更喜欢使用ip 而不是ifconfig,在Linux 上您可以这样做:

ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3

这只是获取所有的 IP 地址和接口,仅搜索以 inet 开头的那些并仅返回第 3 列。

作为一个很好的副作用,这也包括子网掩码! (例如172.17.0.2/16

如果不需要子网掩码,可以使用:

ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3 | tr -d '/'

注意:这显示了容器中的所有 IP。您可以使用awksed 删除127.0.0.1/16 和其他不需要的IP。 :)

【讨论】:

【参考方案8】:

如果它具有“主机名”命令,这可能适用于某些容器。

docker ps 获取(容器id)

docker exec -it(容器 ID)主机名 -i

【讨论】:

猜对了,但不是。该问题明确指出他们无法在容器内运行 docker 命令。【参考方案9】:
FROM alpine

# Upgrade grep so that it supports -Po flags
RUN apk add --no-cache --upgrade grep

ENV IPADDRESS "ip a show eth0 | grep -Po 'inet \K[\d.]+'"

【讨论】:

【参考方案10】:

较早的答案非常有帮助。

这对我有用;它将导出命令附加到容器内主 (~/) 目录中的 .bashrc 文件中

# Add this line to Dockerfile
RUN echo 'export CONTAINER_IP="$(hostname -i)"' >> ~/.bashrc

现在您可以访问容器内CONTAINER_IP 环境变量的计算值。

【讨论】:

以上是关于我可以在我的 docker 容器中获取 IP 地址吗?的主要内容,如果未能解决你的问题,请参考以下文章

Docker 1.10 容器在局域网中的 IP

容器中的 Node.js 始终获取 docker0 ip

如何从 docker 容器中获取 docker 主机的 IP 地址

如何从docker容器中获取docker主机的IP地址

如何在 Docker 容器中设置静态 IP 地址?

docker容器ip地址是none怎么解决