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

Mur*_*ada 1221 docker

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

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

小智 1969

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

现代Docker客户端语法:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)

旧Docker客户端语法:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Run Code Online (Sandbox Code Playgroud)

哪个只返回IP地址.

正如评论中所提到的:如果您使用的是Windows,请在花括号周围使用双引号"而不是单引号'.

  • !警告!这不再起作用了.新格式特定于容器,并遵循```{{.NetworkSettings.Networks.$ network.IPAddress}}```的形式.默认似乎是桥接,但在docker-compose下,这将是一个特定的名称,取决于你的应用程序的名称(我想从--project-name标志,虽然这也将取决于什么类型的网络配置你已经建立).我在这里的答案中写了一个完整的答案http://stackoverflow.com/questions/17157721/getting-a-docker-containers-ip-address-from-the-host/31559812#31559812 (50认同)
  • 这是一个更好,更好的解决方案.如果可能的话,只询问你需要的东西! (30认同)
  • 嗯.使用Fig/Boot2Docker在Mac上获得"<no value>"响应 (6认同)
  • @cevaris如果你试图对一个没有运行的容器运行它,你会得到`<no value>`.在执行此操作之前,请确保容器正在运行. (2认同)
  • 也许我是一只困羊,但有关双引号的警告并不足够大胆而含糊其词,不足以引起我的注意。也许提供两个标有Linux和Windows的示例。我从字面上看只是输入了示例,检查了文档[也使用单引号](https://docs.docker.com/engine/reference/commandline/inspect/),然后用Google搜索了错误。我确定我并不孤单。 (2认同)
  • 对于 docker-compose 项目,所需格式为: {{ .NetworkSettings.Networks.&lt;NETWORK NAME&gt;.IPAddress }} ;默认情况下 &lt;网络名称&gt; 是 &lt;项目名称&gt;_default (2认同)
  • 人们遇到格式错误的解决方案:`docker inform &lt;container id&gt; 并向下滚动,您将找到容器的 IP 地址` (2认同)
  • 这不适用于多个网络。我想索引一个容器的IP (2认同)

cre*_*ack 501

您可以使用 docker inspect <container id>

例:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
Run Code Online (Sandbox Code Playgroud)

  • 为了提取ip,您可以执行类似`docker inspect $ CID |的操作 grep IPAddress | 切-d'"' - f 4`,它工作正常:) (64认同)
  • 正如@ user3119830所提到的,有一个新选项可供检查.现在,您可以使用`docker inspect -format'{{.NetworkSettings.IPAddress}}'$ {CID}来更轻松地获取Ip (62认同)
  • 只是一张纸条.不推荐使用单个破折号选项,以便-format变为--format. (16认同)
  • 把它们放在一起,这个shell别名应该列出所有容器ID及其ips:`alias dockerip ='docker ps | 尾巴-n +2 | 读cid b; 做echo -n"$ cid\t"; docker检查$ cid | grep IPAddress | 切-d \" - f 4;完成'` (9认同)
  • `docker inspect -format'{{.NetworkSettings.IPAddress}}'$ {CID}`是新语法.`-format`已弃用,它变为`--format`. (7认同)

Kru*_*nal 380

首先获取容器ID:

docker ps
Run Code Online (Sandbox Code Playgroud)

(第一列是容器ID)

使用容器ID运行:

docker inspect <container ID>
Run Code Online (Sandbox Code Playgroud)

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

或者只是做:

docker inspect <container id> | grep "IPAddress"
Run Code Online (Sandbox Code Playgroud)

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

nPc*_*omp 188

docker inspect CONTAINER_ID | grep "IPAddress"

  • @ M.Vanderlee这个答案有一个更容易记住的命令,这使它成为一个更好的答案IMO. (5认同)
  • 这个答案如何与其他22个更好/不同? (4认同)
  • @WouterHuysentruit 当然可以,但是您会得到多个条目和实际的“IPAddress”文本。如果不进一步操作,您就不能在脚本中使用它。 (2认同)

Hem*_*ela 108

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

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)

如果您使用docker-compose该命令将是这样的:

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)

输出将是:

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢这个,但它对Docker Compose也不起作用,与拥有自己的网络有关.而是将`{{.NetworkSettings.IPAddress}}`更改为`{{range .NetworkSettings.Networks}} {{.IPAddress}} {{end}}` (4认同)

Tuo*_* Le 92

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

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

docker-ip YOUR_CONTAINER_ID
Run Code Online (Sandbox Code Playgroud)

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

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Run Code Online (Sandbox Code Playgroud)

  • `模板解析错误:模板:: 1:19:在<.NetworkSettings.IPA ...>处执行"":map没有关键字"NetworkSettings"的条目 (5认同)
  • 如果您不检查正在运行的容器,而只是检查图像,则会收到此错误...图像没有 IP 地址...可怕的错误消息,是的 (3认同)

Jak*_*e W 34

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

输入正在运行的Docker:

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
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`docker exec [container-name-or-id] ip a` (2认同)

zho*_*uji 34

显示所有容器的IP地址:

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


小智 26

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

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

docker network inspect bridge
Run Code Online (Sandbox Code Playgroud)

然后应返回一个容器部分,该部分将显示该正在运行的容器的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"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)


gog*_*sca 22

执行:

docker ps -a
Run Code Online (Sandbox Code Playgroud)

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

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage
Run Code Online (Sandbox Code Playgroud)

使用CONTAINER ID值:

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
Run Code Online (Sandbox Code Playgroud)

"172.17.0.2"


sil*_*gon 20

根据我喜欢的一些答案,我决定将它们合并到一个函数中以获取所有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}}' "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

docker-ips
docker-ip YOUR_CONTAINER_ID
Run Code Online (Sandbox Code Playgroud)


ctr*_*brk 19

我的答案:

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
Run Code Online (Sandbox Code Playgroud)

也作为 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 }
Run Code Online (Sandbox Code Playgroud)

输出按 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
Run Code Online (Sandbox Code Playgroud)


Sam*_*r C 16

按名称引用容器:

docker run ... --name pg-master
Run Code Online (Sandbox Code Playgroud)

然后按名称获取IP地址:

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
Run Code Online (Sandbox Code Playgroud)


Dun*_*unk 14

我编写了以下Bash脚本来获取运行在其下的所有容器的IP地址表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
}
Run Code Online (Sandbox Code Playgroud)

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


小智 13

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

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

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

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


iva*_*ncz 11

这是我今天用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'])
Run Code Online (Sandbox Code Playgroud)

输出就像这样:

$ 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
Run Code Online (Sandbox Code Playgroud)


Ben*_*ari 10

快速回答(这有效):

获取您的容器名称或ID:

docker container ls
Run Code Online (Sandbox Code Playgroud)

然后这样做:

docker inspect <container_ID Or container_name> |grep 'IPAddress'
Run Code Online (Sandbox Code Playgroud)


Ara*_*thy 9

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
Run Code Online (Sandbox Code Playgroud)

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

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

docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Run Code Online (Sandbox Code Playgroud)


Mar*_*Roy 8

要扩展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'
Run Code Online (Sandbox Code Playgroud)


小智 8

将之前的答案与根据 Docker 映像名称查找容器 ID 相结合:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
Run Code Online (Sandbox Code Playgroud)


小智 8

我用这种简单的方法

docker exec -it <container id or name> hostname -i
Run Code Online (Sandbox Code Playgroud)

例如

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5
Run Code Online (Sandbox Code Playgroud)


Fer*_*oya 7

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

  1. 选择容器
  2. 单击"设置"
  3. 单击端口选项卡.


小智 7

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

docker inspect containerId | awk '/IPAddress/ || /HostPort/'
Run Code Online (Sandbox Code Playgroud)

输出:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",
Run Code Online (Sandbox Code Playgroud)


lav*_*ava 7

Linux容器

。方法一

 docker exec postgres ifconfig
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

。方法二

  docker exec postgres cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

。方法三

docker exec postgres ip a

在此输入图像描述

。方法4

使用 Powershell

docker inspect postgres | select-string 'ipaddress'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


gun*_*sus 6

注意!!!for Docker Compose用法:

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


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

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

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

Docker运行PID等效部分

--cidfile="app.cid": Write the container ID to the file
Run Code Online (Sandbox Code Playgroud)

使用PID文件

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

a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909

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

    ? blog-v4 git:(develop) ? docker inspect `cat app.cid`

  2. 提取Container IP内联Python脚本:

    $ 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'])
Run Code Online (Sandbox Code Playgroud)

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

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


Joe*_*ell 6

对于那些从 Google 来寻找从终端(而不是通过脚本)执行命令的解决方案的人来说,“ jid ”是一个交互式 JSON 深入实用程序,具有自动完成和建议功能,可让您以更少的输入完成同样的事情.

docker inspect $CID | jid
Run Code Online (Sandbox Code Playgroud)

输入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": "",
Run Code Online (Sandbox Code Playgroud)

输入.IPA Tab,你会看到类似的内容:

[Filter]> .[0].NetworkSettings.IPAddress
"172.17.0.2"
Run Code Online (Sandbox Code Playgroud)


Hai*_*yen 6

对于Windows 10:

docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId
Run Code Online (Sandbox Code Playgroud)


小智 6

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

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
Run Code Online (Sandbox Code Playgroud)


Dra*_*kes 6

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

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

172.20.0.4172.18.0.5
Run Code Online (Sandbox Code Playgroud)

下一个最佳答案更接近:

> docker inspect cc54d96d63ea | grep "IPAddress"

"SecondaryIPAddresses": null,
"IPAddress": "",
    "IPAddress": "172.20.0.4",
    "IPAddress": "172.18.0.5",
Run Code Online (Sandbox Code Playgroud)

我喜欢用jqJSON 来解析网络:

> 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
  }
}
Run Code Online (Sandbox Code Playgroud)

要列出每个容器的 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",
Run Code Online (Sandbox Code Playgroud)


KAR*_*N.A 6

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

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
Run Code Online (Sandbox Code Playgroud)


F1L*_*nux 6

使用任意字符串提取 IP:

我在这个问题中读到的许多(几乎所有)解决方案都需要用户首先识别<容器名称><容器 ID>的中间步骤,然后将其提供给他们的解决方案以显示 IP。

重新创建容器时,IP 可能会发生变化,如果发生这种情况,引用它的任何脚本现在都将被破坏......

因此,我需要一种无需手动干预即可提取容器 IP 的方法,以确保脚本始终具有正确的 IP,即使每次重新创建容器时 IP 都会发生变化。

解决方案:

#!/bin/bash

# Only need to set "CONTAINERNAME" variable with an arbitrary
# string found in either the Container ID or Image Name and
# it prints container IP. Ensure the string is unique to desired host

CONTAINERNAME='mariadb-blog'
CONTAINERID="$(docker ps | grep -i $CONTAINERNAME | awk '{print $1}')"
CONTAINERIP="$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINERID)"

echo "$CONTAINERIP"
Run Code Online (Sandbox Code Playgroud)

结论:

我已经用我自己的 Linux Docker-Compose 主机测试了这个脚本,自 20220722 起它就可以可靠地工作。事实上,复制粘贴脚本来验证我的结果是否可重现是很容易的。

请注意:存在潜在的可靠性致命弱点:如果您不剪切自己的 docker 镜像并依赖第三方的镜像,他们可能会更改镜像的命名约定并破坏脚本grep中的命名约定。因此,我建议将任意字符串设置为容器名称,因为您可以控制它,确保该字符串的 grep 始终成功并打印 IP 以提供给您的脚本。


小智 5

只是为了完整性:

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

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


Ale*_*ick 5

用:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 5

docker inspect <container id> | grep -i ip
Run Code Online (Sandbox Code Playgroud)

例如:

docker inspect 2b0c4b617a8c | grep -i ip
Run Code Online (Sandbox Code Playgroud)