【问题标题】:Can I get ip address inside my docker container?我可以在我的 docker 容器中获取 IP 地址吗?
【发布时间】: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 容器。这看起来很奇怪,但就我而言,这是正确的做法。
  • 酷,只是想确定是有原因的。

标签: docker ip-address


【解决方案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 'END{print $1}' /etc/hosts
172.17.0.14

【讨论】:

  • 这似乎不再正确。在 docker-engine 1.10.3 的容器中,/etc/hosts 的最后一行是我的 ip 地址,第一行是 loopback。
  • 现在awk 'END{print $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 环境变量的计算值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-16
            • 2021-01-04
            • 1970-01-01
            • 2014-05-21
            相关资源
            最近更新 更多