如何在容器内获取容器的IP地址?
'docker inspect $hostname ...' 不适用,因为我没有共享 /var/run/docker.sock 主机文件到容器中。
如何在容器内获取容器的IP地址?
'docker inspect $hostname ...' 不适用,因为我没有共享 /var/run/docker.sock 主机文件到容器中。
我可以通过以下方式找到IP地址:
hostname -i
当然,如果有多个接口,则可能不完全准确。
编辑
注意:根据hostname man页面,hostname -i
使用DNS解析IP地址,而hostname -I
显示除环回之外的所有地址,不依赖于DNS,并且推荐使用。
在我所有的Docker容器中,-i
和-I
返回相同的结果(但在我的桌面上不是这种情况)。
hostname -i | awk '{print $1}'
的原因是因为存在一个尾随空格(可能会有多个IP地址)。 - Romuald Brunethostname -I | awk '{print $1}'
,因为 -i
只会给出单个 IP,而 -I
则会给出多个(如果有的话)。 - Deepak Deorehostname -i
和 hostname -I
都返回 172.18.0.2 172.19.0.2
(但 hostname -I
返回一个尾随空格)。我认为 hostname -i
的行为取决于 DNS 的配置方式。 - Victor Roetman由于IP地址在 /etc/hosts 的第一行中,您可以在容器中执行 awk 命令来打印 /etc/hosts 的第一行的第一个单词。
$ awk 'END{print $1}' /etc/hosts
172.17.0.14
awk 'END{print $1}' /etc/hosts
似乎能完成任务。 - user2915097sed -i 's/[ \t]*$//' "$1"
。 - Sandburg为什么不使用更简单的方法,例如:
grep "`hostname`" /etc/hosts|awk '{print $1}'
或者
grep "$HOSTNAME" /etc/hosts|awk '{print $1}'
通常情况下,您可以使用Linux程序ifconfig
获取IP地址和其他网络详细信息。但是您的容器可能没有此程序,因此您需要通过apt-get
、yum
或您所使用的发布版软件包管理器进行安装。获取IP地址的基本管道如下:
ifconfig eth0 | grep "inet addr:" | cut -d : -f 2 | cut -d " " -f 1
ifconfig
。 - kiltek我找到了解决我的问题的方法:
/sbin/ip route|awk '/scope/ { print $9 }'
如果容器支持"hostname"命令,这可能在某些容器上起作用。
docker ps 获取(容器ID)
docker exec -it (容器ID)hostname -i
sed -n 's/^\([0-9\.]*\)[[:blank:]]*[0-9a-f]\{12,\}$/\1/p' /etc/hosts
我会使用awk,但是在Debian:jessie中的标准awk不支持像{12,}
这样的正则表达式量词。
ip
而不是ifconfig
,在Linux上可以这样做:ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3
ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3 | tr -d '/'
注意: 这显示容器中的所有IP地址。你可以使用awk
或sed
来删除127.0.0.1/16
和其他不需要的IP地址。 :)
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.]+'"
--link firstcontainer:firstcontainer
,然后在nginx中,你可以直接代理到主机名firstcontainer
,因为链接将自动设置DNS以将其解析为firstcontainer IP。 - loganfsmyth