我可以在我的 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 -i
和 hostname -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-get
或yum
或您的发行版的包管理器安装它。获取 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。您可以使用awk
或sed
删除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 地址吗?的主要内容,如果未能解决你的问题,请参考以下文章