首页 文章

如何从主机获取Docker容器的IP地址?

提问于
浏览
889

在创建新容器后,是否有一个命令可以运行以从主机获取容器的IP地址?

基本上,一旦Docker创建容器,我想推出自己的代码部署和容器配置脚本 .

30 回答

  • 9

    要获取容器的IP地址和主机端口:

    docker inspect conatinerId | awk '/IPAddress/ || /HostPort/'
    

    输出:

    "HostPort": "4200"
                        "HostPort": "4200"
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
    
  • 11

    只是为了完整性:

    我真的很喜欢 --format 选项,但起初我并不知道这个选项,所以我用一个简单的Python单行程来得到相同的结果:

    docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
    
  • 21

    检查对我不起作用 . 也许因为我正在使用 -net host 和一些命名空间 .

    无论如何,我发现这很好用:

    docker exec -i -t NAME /sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
    
  • 29

    在Docker 1.3中,您还可以通过以下步骤进行检查:

    输入正在运行泊坞窗:

    docker exec [container-id or container-name] cat /etc/hosts
    172.17.0.26 d8bc98fa4088
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.17 mysql
    
  • 1381

    根据我喜欢的一些答案,我决定将它们合并到一个函数中以获取所有IP地址,将另一个合并到特定容器中 . 它们现在在我的 .bashrc 文件中 .

    docker-ips() {
        docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
    }
    
    docker-ip() {
      docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
    }
    

    第一个命令提供所有容器的IP地址,第二个命令提供特定容器的IP地址 .

    docker-ips
    docker-ip YOUR_CONTAINER_ID
    
  • 92

    对于Windows 10:

    docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId
    
  • 84

    首先获取容器ID:

    docker ps
    

    (第一列是容器ID)

    使用容器ID运行:

    docker inspect <container ID>
    

    在底部,在“NetworkSettings”下,您可以找到“IPAddress”

    或者只是做:

    docker inspect <container id> | grep "IPAddress"
    
  • 31

    Docker在Go内部制作,它也使用Go语法进行查询 .

    要检查特定容器的IP地址,需要运行命令(-f表示格式选项)

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name

    对于容器ID或名称,可以运行命令 docker container ls . 它将列出每个正在运行的容器 .

  • 6

    我编写了以下Bash脚本来获取在 docker-compose 下运行的所有容器的IP地址表 .

    function docker_container_names() {
        docker ps -a --format "{{.Names}}" | xargs
    }
    
    # Get the IP address of a particular container
    dip() {
        local network
        network='YOUR-NETWORK-HERE'
        docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
    }
    
    dipall() {
        for container_name in $(docker_container_names);
        do
            local container_ip=$(dip $container_name)
            if [[ -n "$container_ip" ]]; then
                echo $(dip $container_name) " $container_name"
            fi
        done | sort -t . -k 3,3n -k 4,4n
    }
    

    您应该将变量网络更改为您自己的网络名称 .

  • 317

    从Docker版本1.10.3开始,构建20f81dd

    除非你告诉Docker,否则Docker总是在桥接网络中启动你的容器 . 所以你可以尝试下面这个命令:

    docker network inspect bridge
    

    然后应该返回一个容器部分,该部分将显示该正在运行的容器的IP地址 .

    [
        {
            "Name": "bridge",
            "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
            "Scope": "local",
            "Driver": "bridge",
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16"
                    }
                ]
            },
            "Containers": {
                "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
                    "Name": "drunk_leavitt",
                    "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
                    "IPv4Address": "172.17.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {
                "com.docker.network.bridge.default_bridge": "true",
                "com.docker.network.bridge.enable_icc": "true",
                "com.docker.network.bridge.enable_ip_masquerade": "true",
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            }
        }
    ]
    
  • 4

    NOTE!!! for Docker Compose Usage:

    由于Docker Compose为每个集群创建了一个独立的网络,因此以下方法不适用于 docker-compose .


    最优雅,最简单的方法是将shell函数定义为最多投票的答案@WouterD's

    dockip() {
      docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
    }
    

    Docker可以将容器ID写入Linux程序之类的文件中:

    使用 --cidfile=filename 参数运行,Docker将容器的ID转储到此文件 .

    Docker runs PID equivalent Section

    --cidfile="app.cid": Write the container ID to the file
    

    使用PID文件

    • 运行容器 --cidfile 参数, app.cid 文件内容如下:

    a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909

    • 您可以使用文件内容来检查Docker容器:

    ➜ blog-v4 git:(develop) ✗ docker inspectcat app.cid``

    • 提取容器IP内联Python脚本:

    $ docker inspectcat app.cid| python -c "import json;import sys;\ sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])" 172.17.0.2


    更加人性化的形式

    #!/usr/bin/env python
    # Coding: utf-8
    # Save this file like get-docker-ip.py in a folder that in $PATH
    # Run it with
    # $ docker inspect <CONTAINER ID> | get-docker-ip.py
    
    import json
    import sys
    
    sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])
    

    http://networkstatic.net/10-examples-of-how-to-get-docker-container-ip-address/

    这里有10种获取Docker容器IP地址的替代方案 .

  • 463
    docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
    

    如果容器部署到默认桥接网络,则上述方法有效 .

    但是,如果使用自定义桥接网络或覆盖网络,我发现以下内容更好:

    docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
    
  • 21

    快速回答(这有效):

    获取您的容器名称或ID:

    sudo docker container ls
    

    然后这样做:

    sudo docker inspect <container_ID Or container_name> |grep 'IPAddress'
    

  • 6

    对于那些来自谷歌的人来说,从终端(而不是通过脚本)找到命令执行的解决方案,jid(具有自动完成和建议的交互式JSON向下钻取工具)可以让您通过减少输入来实现相同的功能 .

    docker inspect $CID | jid
    

    键入tab .Net选项卡,您将看到以下内容:

    [Filter]> .[0].NetworkSettings
    {
      "Bridge": "",
      "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
      "Gateway": "172.17.0.1",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "HairpinMode": false,
      "IPAddress": "172.17.0.2",
      "IPPrefixLen": 16,
      "IPv6Gateway": "",
      "LinkLocalIPv6Address": "",
      "LinkLocalIPv6PrefixLen": 0,
      "MacAddress": "02:42:ac:11:00:02",
      "Networks": {
        "bridge": {
          "Aliases": null,
          "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5",
          "Gateway": "172.17.0.1",
          "GlobalIPv6Address": "",
    

    输入.IPA标签,您会看到以下内容:

    [Filter]> .[0].NetworkSettings.IPAddress
    "172.17.0.2"
    
  • 4

    我不得不通过docker容器名称提取docker容器IP地址,以便在部署脚本中进一步使用 . 为此,我编写了以下bash命令:

    docker inspect $(sudo docker ps | grep my_container_name | head -c 12) | grep -e \"IPAddress\"\:[[:space:]]\"[0-2] | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
    

    假设把它放到一个bash脚本中会很方便,它会将my_container_name作为参数...

  • 3

    检查的 --format 选项来救援 .

    现代Docker客户端语法:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
    

    旧Docker客户端语法:

    docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
    

    这将只返回IP地址 .

  • 13

    你可以使用 docker inspect <container id>

    例:

    CID=$(docker run -d -p 4321 base nc -lk 4321);
    docker inspect $CID
    
  • 160

    只需一个命令即可获取所有容器名称及其IP地址 .

    docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
    

    如果您使用的是 docker-compose ,则命令将为:

    docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
    

    输出将是:

    /containerA - 172.17.0.4
    /containerB - 172.17.0.3
    /containerC - 172.17.0.2
    
  • 4

    使用:

    docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
    
  • 4

    如果您使用Docker Toolbox安装了Docker,则可以使用Kitematic应用程序获取容器IP地址:

    • 选择容器

    • 单击“设置”

    • 单击“端口”选项卡 .

  • 4

    ~/.bashrc 或相关文件中添加此shell脚本:

    docker-ip() {
      docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
    }
    

    然后,要获取容器的IP地址,只需执行以下操作:

    docker-ip YOUR_CONTAINER_ID
    

    对于新版本的Docker,请使用以下内容:

    docker-ip() {
            docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
    }
    
  • 18

    执行:

    docker ps -a
    

    这将显示活动泊坞窗图像:

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
    3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage
    

    使用CONTAINER ID值:

    docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
    

    “172.17.0.2”

  • 16

    对于 Windows containers 使用

    docker exec <container> ipconfig
    

    其中 <container> 是容器的 nameid .

    您可以使用 docker ps 查找容器的ID .

  • 12

    要扩展ko-dos的答案,这里是列出所有容器名称及其IP地址的别名:

    alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'
    
  • 8

    将先前的答案与基于Docker映像名称查找容器ID相结合 .

    docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
    
  • 7

    如果您忘记了容器ID或者不想使用shell命令进行操作,那么最好使用像Portainer这样的UI .

    https://portainer.io/

    $ docker volume create portainer_data
    $ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
    

    在那里,您可以找到有关容器和IP的所有信息 .

  • 5

    显示所有容器的IP地址:

    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
    
  • 5

    docker inspect CONTAINER_ID | grep "IPAddress"

  • 4

    这是我今天用Python开发的解决方案,使用“docker inspect container”JSON输出作为数据源 .

    我有很多容器和基础设施需要检查,我需要以快速和 pretty 方式从任何容器中获取基本网络信息 . 这就是我制作这个剧本的原因 .

    IMPORTANT: 从版本1.9开始,Docker允许您创建多个网络并将它们附加到容器 .

    #!/usr/bin/python
    
    import json
    import subprocess
    import sys
    
    try:
        CONTAINER = sys.argv[1]
    except Exception as e:
        print "\n\tSpecify the container name, please."
        print "\t\tEx.:  script.py my_container\n"
        sys.exit(1)
    
    # Inspecting container via Subprocess
    proc = subprocess.Popen(["docker","inspect",CONTAINER],
                          stdout=subprocess.PIPE,
                          stderr=subprocess.STDOUT)
    
    out = proc.stdout.read()
    json_data = json.loads(out)[0]
    
    net_dict = {}
    for network in json_data["NetworkSettings"]["Networks"].keys():
        net_dict['mac_addr']  = json_data["NetworkSettings"]["Networks"][network]["MacAddress"]
        net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"]
        net_dict['ipv4_net']  = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"]
        net_dict['ipv4_gtw']  = json_data["NetworkSettings"]["Networks"][network]["Gateway"]
        net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"]
        net_dict['ipv6_net']  = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"]
        net_dict['ipv6_gtw']  = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"]
        for item in net_dict:
            if net_dict[item] == "" or net_dict[item] == 0:
                net_dict[item] = "null"
        print "\n[%s]" % network
        print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY")
        print "--------------------------------------------"
        print "IPv4 settings:{:>16}/{:<5}  {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw'])
        print "IPv6 settings:{:>16}/{:<5}  {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])
    

    The output is just like this:

    $ python docker_netinfo.py debian1
    
    [frontend]
    
    02:42:ac:12:00:02   IP/NETWORK        GATEWAY
    --------------------------------------------
    IPv4 settings:      172.18.0.2/16     172.18.0.1
    IPv6 settings:            null/null   null
    
    [backend]
    
    02:42:ac:13:00:02   IP/NETWORK        GATEWAY
    --------------------------------------------
    IPv4 settings:      172.19.0.2/16     172.19.0.1
    IPv6 settings:            null/null   null
    
  • 3

    按名称引用容器:

    docker run ... --name pg-master
    

    然后按名称获取IP地址:

    MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
    

相关问题