如何获得Docker容器&x27;来自主机的IP地址

如何获得Docker容器&x27;来自主机的IP地址,docker,ip-address,Docker,Ip Address,创建新容器后,是否可以运行命令从主机获取容器的IP地址 基本上,一旦Docker创建了容器,我就要运行自己的代码部署和容器配置脚本。您可以使用Docker inspect 例如: CID=$(docker run -d -p 4321 base nc -lk 4321); docker inspect $CID inspect的--format选项用于救援 现代Docker客户端语法为: docker inspect -f '{{range.NetworkSettings.Networks}}

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


基本上,一旦Docker创建了容器,我就要运行自己的代码部署和容器配置脚本。

您可以使用
Docker inspect

例如:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
inspect
--format
选项用于救援

现代Docker客户端语法为:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
旧Docker客户端语法为:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
这些命令将返回Docker容器的IP地址

docker-ips
docker-ip YOUR_CONTAINER_ID

如注释中所述:如果您在Windows上,请在花括号周围使用双引号
而不是单引号

在Docker 1.3+中,您还可以使用以下方法进行检查:

输入正在运行的Docker(Linux):

对于windows:

docker exec [container-id or container-name] ipconfig

~/.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}}' "$@"
}

为了扩展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'
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

按名称列出的引用容器:

docker run ... --name pg-master
MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
然后按名称获取IP地址:

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

我编写了以下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
}
您应该将变量网络更改为您自己的网络名称。

为了完整起见:

我真的很喜欢
--format
选项,但一开始我不知道它,所以我使用了一个简单的Python one liner来获得相同的结果:

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
docker inspect | python-c'导入json,sys;obj=json.load(sys.stdin);打印obj[0][“网络设置”][“IPAddress”]

将前面的答案与基于Docker图像名称查找容器ID相结合:

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

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

  • 选择容器
  • 点击设置
  • 单击“端口”选项卡中的

  • 只需一个命令即可获取所有容器名称及其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
    
    执行:

    docker ps -a
    
    这将显示活动的docker图像:

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

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

    注意!!!对于Docker Compose用法:

    由于Docker Compose为每个集群创建了一个隔离的网络,因此下面的方法不适用于
    Docker Compose

    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
    }
    

    最优雅、最简单的方法是定义一个shell函数,这是目前投票最多的答案:

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

    Docker使用
    --cidfile=filename
    运行时,会将容器的ID转储到“filename”

    有关详细信息,请参阅“”

    --cidfile="app.cid": Write the container ID to the file
    
    使用PID文件:

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

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

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  • 可以使用内联Python脚本提取容器IP:

    $ docker inspect `cat 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'])
    
    !/usr/bin/env python
    #编码:utf-8
    #将此文件像get-docker-ip.py一样保存在$PATH中的文件夹中
    #用它运行
    #$docker inspect | get-docker-ip.py
    导入json
    导入系统
    sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress']
    

    有关更多信息,请参见“”。

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

    --cidfile="app.cid": Write the container ID to the file
    
    除非您告诉Docker,否则Docker始终在网桥网络中启动您的容器。因此,您可以尝试以下命令:

    docker network inspect bridge
    
    然后返回一个Containers部分,该部分将显示正在运行的容器的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"
            }
        }
    ]
    
    docker inspect--格式“{{.NetworkSettings.IPAddress}”
    
    如果容器部署到默认网桥网络,则上述方法有效

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

    docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
    
    docker exec/sbin/ifconfig eth0 | grep'inet addr:'| cut-d:-f2 | awk'{print$1}'
    
    显示所有容器的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'
    
    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
    
    使用:


    基于我喜欢的一些答案,我决定将它们合并到一个函数中,以获取所有IP地址,并为特定容器获取另一个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
    

    对于那些来自谷歌的人来说,他们可以从终端(而不是通过脚本)找到命令执行的解决方案,“”是一个带有自动完成和建议的交互式JSON深入实用程序,它可以让你用更少的键入来做同样的事情

    docker inspect $CID | jid
    
    键入Tab.Net Tab,您将看到如下内容:

    [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": "",
    
    [Filter]> .[0].NetworkSettings.IPAddress
    "172.17.0.2"
    
    键入
    .IPA
    选项卡,您将看到如下内容:

    [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": "",
    
    [Filter]> .[0].NetworkSettings.IPAddress
    "172.17.0.2"
    
    您可以将
    -i
    添加到grep以忽略该案例,然后即使以下操作也会起作用:

    docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
    

    要获取容器的IP地址和主机端口,请执行以下操作:

    docker inspect containerId | awk '/IPAddress/ || /HostPort/'
    
    输出:

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

    下面是我今天用Python开发的一个解决方案,它使用
    docker inspect容器
    JSON输出作为数据源

    我有很多容器和基础设施需要检查,我需要从任何容器中快速、漂亮地获取基本的网络信息。这就是我制作这个脚本的原因

    重要提示:自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'])
    

    首先获取容器ID:

    docker ps
    
    (第一列是容器ID)

    使用容器ID运行:

    docker inspect <container ID>
    
    docker检查
    
    在底部的“网络设置”下,您可以找到“IPAddress”

    或者干脆做:

    docker inspect <container id> | grep "IPAddress"
    
    docker inspect | grep“IPAddress”
    
    适用于wi
    docker inspect <container_ID Or container_name> |grep 'Port'
    
    sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
    
    docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
    
    docker exec -it <container id or name> hostname -i
    
    ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
    10.0.1.5
    
    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq
    ) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n
    
    docker-ips() {   docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n }
    
    # docker-ips
    172.18.0.2       memcached
    172.18.0.3       nginx
    172.18.0.4       fpm-backup
    172.18.0.5       dns
    172.18.0.6       fpm-beta
    172.18.0.7       exim
    172.18.0.8       fpm-delta
    172.18.0.9       mariadb
    172.18.0.10      fpm-alpha
    172.19.0.2       nextcloud-redis
    172.19.0.3       nextcloud-db
    172.19.0.4       nextcloud