ChatGPT解决这个技术问题 Extra ChatGPT

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

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

基本上,一旦 Docker 创建了容器,我想滚动我自己的代码部署和容器配置脚本。

我只是想确保其他菜鸟不会犯我的错误,并尝试从图像而不是容器中获取 IP。确保您获得 CID 或容器 ID 并进行查询; CID 通过 'docker ps' 就是这样。

S
Sebastian Viereck

inspect--format 选项可以解决问题。

现代 Docker 客户端语法是:

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

旧的 Docker 客户端语法是:

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

这些命令将返回 Docker 容器的 IP 地址。

如评论中所述:如果您使用的是 Windows,请在大括号周围使用双引号 " 而不是单引号 '


这是一个非常非常好的解决方案。如果可能的话,只问你需要什么!
唔。使用 Fig/Boot2Docker 在 Mac 上获取 <no value> 响应
!警告!这不再起作用了。新格式特定于容器并遵循 {{ .NetworkSettings.Networks.$network.IPAddress }} 格式。默认似乎是桥接,但在 docker-compose 下,这将是一个特定名称,取决于您的应用程序的名称(我认为来自 --project-name 标志,尽管这也取决于网络配置的类型你已经设置)。我在这里的答案中写了一个完整的答案stackoverflow.com/questions/17157721/…
也许我是一只昏昏欲睡的羊,但是关于双引号的警告不够大胆和闪烁,不足以引起我的注意。也许提供两个明确标记 Linux 和 Windows 的示例。我实际上只是输入了示例,检查了文档 which also uses single quotes,然后在 Google 上搜索了错误。我确定我并不孤单。
人们收到格式错误的解决方案:docker inspect <container id> and scroll down you will find the container ip-address
t
the Tin Man

您可以使用 docker inspect <container id>

例如:

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

为了提取 ip,您可以执行 docker inspect $CID | grep IPAddress | cut -d '"' -f 4 之类的操作,它可以正常工作:)
综上所述,这个 shell 别名应该列出所有容器 ID 及其 ip:alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
正如@user3119830 所提到的,有一个新的检查选项。现在,您可以使用 docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID} 更轻松地获取 IP
只是一个注释。单破折号选项已被弃用,因此 -format 将变为 --format。
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID} 是新语法。 -format 已弃用,它变为 --format
R
Rich

首先获取容器ID:

docker ps

(第一列是容器 ID)

使用容器 ID 运行:

docker inspect <container ID>

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

或者只为基于 UNIX 做:

docker inspect <container id> | grep "IPAddress"

对于 Windows CMD:

docker inspect <container id> | findstr "IPAddress"

太糟糕了,在我的一个实例上(以 docker run -it MYCONTAINER /bin/bash 开头),inspect 的输出没有 NetworkSettings 部分!
这在 Windows 10 上不起作用。您还需要使用 ipconfig 找出 DockerNAT 的 IP 地址。
@Eric您还可以为此检查网桥:docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
对于获取 IP 所需的所有格式细节,我非常喜欢 ... | grep IP 解决方案。 +1
@Eric - 您将 containerimage 混淆了。该命令实际上是 docker run -it MYIMAGE(这不是 容器 名称);如果您执行 docker inspect MYIMAGE,您将获得有关 图像 的静态信息。您需要找到 正在运行的容器 的名称(或按照其他人的建议使用其 id)。在我的系统上,从该图像创建的第一个此类容器默认名称为 MYIMAGE_1,因此 docker inspect MYIMAGE_1 具有 NetworkSettings。
n
nPcomp
docker inspect CONTAINER_ID | grep "IPAddress"

您可以将 -i 添加到 grep 以忽略大小写,那么即使以下内容也可以:

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"

这个答案与其他 22 个答案有何不同/更好?
这绝对不是最好的答案。 WouterD 的答案就是您正在寻找的答案。
@M.Vanderlee 这个答案有一个更容易记住的命令,这使它成为一个更好的答案 IMO。
@WouterHuysentruit 当然,但是您会得到多个条目和实际的“IPAddress”文本。如果没有进一步的操作,您将无法在脚本中使用它。
你是对的。在问题的上下文中,另一个答案更合适。
P
Peter Mortensen

只需一个命令即可获取所有容器名称及其 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 Compose,这与拥有自己的网络有关。而是将 {{.NetworkSettings.IPAddress }} 更改为 {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
这是我使用的变体:docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'sed(1) 删除存在但没有 IP 地址的容器的空行。
P
Peter Mortensen

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

Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
这对我有用,但需要source ~/.bash_profile
如果您不检查正在运行的容器,而只是检查图像,则会收到此错误...图像没有 IPAddress... 可怕的错误消息,是的
t
the Tin Man

在 Docker 1.3+ 中,您还可以使用以下命令检查它:

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

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

对于窗户:

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

或者只是docker exec [container-name-or-id] ip a
对于 Windows docker exec [container-id or container-name] ipconfig
t
the Tin Man

显示所有容器的 IP 地址:

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

A
Athena

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

除非你告诉 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"
        }
    }
]

如果您的容器部分是空的,这意味着什么?然而容器已经启动并运行。
g
gogasca

执行:

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”


c
ctrlbrk

我的答案:

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

也作为 bash 别名:

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 }

输出按 IP 地址排序,并以制表符分隔:

# 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

P
Peter Mortensen

根据我喜欢的一些答案,我决定将它们合并到一个函数中,以获取所有 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

t
the Tin Man

这是一个快速的工作答案:

获取您的容器名称或 ID:

docker container ls

然后获取IP:

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

获取端口:

docker inspect <container_ID Or container_name> |grep 'Port'

P
Peter Mortensen

我编写了以下 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
}

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


Tuong Le 从这里回答 stackoverflow.com/questions/17157721/… 避免在 dip() 中指定网络: docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
t
the Tin Man

Docker 是用 Go 编写的,它也使用 Go 语法进行查询。

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

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

对于容器 ID 或名称,您可以运行命令

docker container ls

这将列出每个正在运行的容器。


这非常有用。我在哪里可以找到编写自己的 Go 查询的文档?
P
Peter Mortensen

按名称引用容器:

docker run ... --name pg-master

然后按名称获取IP地址地址:

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

t
the Tin Man

这是我今天使用 Python 开发的解决方案,使用 docker inspect container 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'])

输出是:

$ 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

请在脚本中改成python2.7,python3现在常用还是写两个版本
我会更新我的 Gist,一旦我有了它,我会在这里发布。事实上,这个包装器是为 Python 2.7 设计的。感谢您的反馈!
L
Lemix

我用这个简单的方法

docker exec -it <container id or name> hostname -i

例如

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5

A
Aravind Murthy
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}'

P
Peter Mortensen

为了扩展 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 ps -q 来避免 tail,使用 --format 来避免 grep。您也可以将多个容器 ID 传递给 docker inspect 而不是在 shell 中循环。
docker ps -q 只显示容器的数字 ID,但我认为使用它们的名称更好。 tail 只是去掉第一行(表头)&仍然需要。不过,我可以使用 --formatdocker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done。但这似乎不是一个很大的改进...... grep 在 IMO 中更具可读性。
稍作改动的版本,首先列出 IP,在一行中与容器名称一起列出:docker ps |尾-n +2 |同时读取-aa;做名称=${a[$((${#a[@]}-1))]};码头工人检查 $name | grep "IPAddress.*[0-9]\+" | cut -d \" -f 4 | tr "\n" " "; echo -e "\t${name}"; 完成
结束于:docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
其实更喜欢这个的风格docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo ${name};docker inspect $name | grep "IPAddress.*[0-9]\+"; done
t
the Tin Man

笔记!!!对于 Docker 撰写用法:

由于 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 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'])

有关详细信息,请参阅“10 alternatives of getting the Docker container IP addresses”。


t
the Tin Man

结合之前的答案和根据 Docker 镜像名称查找容器 ID:

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

t
the Tin Man

只是为了完整性:

我真的很喜欢 --format 选项,但一开始我并没有意识到它,所以我使用了一个简单的 Python 单线来获得相同的结果:

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

这是最酷的答案。另请参阅另一个答案 - stackoverflow.com/a/36306632/432903
t
the Tin Man

对于那些从谷歌来寻找从终端执行命令的解决方案(不是通过脚本)的人,“jid”是一个具有自动完成和建议功能的交互式 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": "",

输入 .IPA Tab,您会看到类似以下内容:

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

P
Peter Mortensen

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

选择容器 单击设置 单击端口选项卡。


对我来说,IP 地址在“主机名/端口”选项卡上,但这仍然是一个非常有用的答案!请注意,当您运行 docker 工具箱时,docker inspect 不起作用。它会报告一个 IP 地址,但它不是您的服务将使用的正确地址。
s
ssmith

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

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

输出:

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

H
Hai Nguyen

对于 Windows 10:

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

s
sɐunıɔןɐqɐp

这将列出主机上的所有容器 IP:

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done

D
Drakes

接受的答案不适用于每个容器的多个网络:

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

172.20.0.4172.18.0.5

下一个最佳答案更接近:

> docker inspect cc54d96d63ea | grep "IPAddress"

"SecondaryIPAddresses": null,
"IPAddress": "",
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",

我喜欢使用 jq 来解析网络 JSON:

> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []'

{
  "proxy": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935",
    "EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b",
    "Gateway": "172.20.0.1",
    "IPAddress": "172.20.0.4",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:14:00:04",
    "DriverOpts": null
  },
  "webservers": {
    "IPAMConfig": null,
    "Links": [
      "server1_php_1:php",
      "server1_php_1:php_1",
      "server1_php_1:server1_php_1"
    ],
    "Aliases": [
      "cc54d96d63ea",
      "web"
    ],
    "NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6",
    "EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae",
    "Gateway": "172.18.0.1",
    "IPAddress": "172.18.0.5",
    "IPPrefixLen": 24,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:12:00:05",
    "DriverOpts": null
  }
}

要列出每个容器的 IP 地址,则变为:

for s in `docker ps -q`; do
  echo `docker inspect -f "{{.Name}}" ${s}`:
  docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress";
done

/server1_web_1:
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",
/server1_php_1:
    "IPAddress": "172.20.0.3",
    "IPAddress": "172.18.0.4",
/docker-gen:
    "IPAddress": "172.18.0.3",
/nginx-proxy:
    "IPAddress": "172.20.0.2",
    "IPAddress": "172.18.0.2",

K
KARTHIKEYAN.A

Docker 检查用于打印所有容器 ip 及其各自的名称

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'