1835

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

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

4

53 回答 53

3089

--format选项inspect来救援。

现代 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 上,请在大括号周围使用双引号"而不是单引号。'

于 2013-12-19T15:56:21.003 回答
556

您可以使用docker inspect <container id>.

例如:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
于 2013-06-17T22:37:03.043 回答
492

首先获取容器ID:

docker ps

(第一列是容器 ID)

使用容器 ID 运行:

docker inspect <container ID>

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

或者只是这样做:

docker inspect <container id> | grep "IPAddress"
于 2017-09-19T22:08:01.507 回答
260
docker inspect CONTAINER_ID | grep "IPAddress"

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

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
于 2017-01-04T20:01:51.670 回答
183

只需一个命令即可获取所有容器名称及其 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
于 2016-01-12T16:52:29.443 回答
104

~/.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}}' "$@"
}
于 2014-11-18T00:04:31.187 回答
48

在 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
于 2014-11-02T00:05:48.133 回答
44

显示所有容器的 IP 地址:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
于 2016-04-27T07:50:02.340 回答
34

从 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"
        }
    }
]
于 2016-04-08T14:06:14.847 回答
32

执行:

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”

于 2016-01-18T20:01:20.703 回答
28

我的答案:

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
于 2020-07-21T21:29:18.557 回答
28

根据我喜欢的一些答案,我决定将它们合并到一个函数中,以获取所有 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
于 2016-10-05T20:25:02.623 回答
22

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

获取您的容器名称或 ID:

docker container ls

然后获取IP:

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

获取端口:

docker inspect <container_ID Or container_name> |grep 'Port'
于 2018-06-07T10:46:18.747 回答
21

我编写了以下 Bash 脚本来从运行在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
}

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

于 2015-07-22T09:57:00.120 回答
20

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

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

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

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

docker container ls

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

于 2017-10-28T03:42:30.147 回答
19

按名称引用容器:

docker run ... --name pg-master

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

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
于 2015-04-23T14:08:29.817 回答
18

这是我今天用 Python 开发的一个解决方案,使用docker inspect containerJSON 输出作为数据源。

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

重要提示:从 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
于 2017-02-22T23:06:13.500 回答
13

我用这个简单的方法

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

例如

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5
于 2019-09-11T09:55:42.337 回答
10

为了扩展 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'
于 2015-03-05T20:34:03.053 回答
10

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

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


最优雅和最简单的方法是定义一个 shell 函数,目前是@WouterD's投票最多的答案:

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

Docker 可以将容器 ID 写入文件,如 Linux 程序:

运行时--cidfile=filename,Docker 将容器的 ID 转储到“文件名”。

有关更多信息,请参阅“ Docker 运行 PID 等效部分”。

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

使用 PID 文件:

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

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

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  3. 您可以使用内联 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'])

有关详细信息,请参阅“获取 Docker 容器 IP 地址的 10 种替代方法”。

于 2016-03-30T10:50:15.370 回答
10
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}'
于 2016-04-18T10:12:20.170 回答
10

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

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
于 2015-11-30T22:39:32.383 回答
8

只是为了完整性:

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

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
于 2015-10-08T15:54:04.803 回答
8

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

  1. 选择容器
  2. 点击设置
  3. 单击端口选项卡。
于 2015-12-25T20:59:49.420 回答
8

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

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

输出:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",
于 2017-02-15T14:54:03.147 回答
7

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

> 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",
于 2019-02-28T10:12:07.060 回答
7

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

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
于 2018-07-31T06:52:56.870 回答
7

对于 Windows 10:

docker inspect --format "{{ .NetworkSettings.IPAddress }}"  containerId
于 2017-10-08T10:46:00.393 回答
7

对于那些从谷歌来寻找从终端(而不是通过脚本)执行命令的解决方案的人来说,“ 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"
于 2016-12-12T16:06:35.720 回答
7

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

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
于 2019-03-14T06:09:25.573 回答
5

利用:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
于 2016-07-28T18:07:48.813 回答
4

如果您忘记了容器 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。

于 2017-12-04T13:11:42.940 回答
4

还没有人提出 Docker Python API。获取 IP 地址的 Docker API 解决方案相当简单。

*基于 NIX 的操作系统: docker api 3.7(感谢评论中的canadadry更新)

import docker

client = docker.DockerClient(base_url='unix://var/run/docker.sock')
x_container = client.containers(filters={"name":"x_container"})[0]
x_ip_addr = x_container["NetworkSettings"]["Networks"]["NETWORK_NAME"]["IPAddress"]

与操作系统无关: docker api 4.0.x(感谢评论中的pds添加)

import docker

client = docker.from_env()
container = client.containers.get(container_name)
vars( container )["attrs"]["NetworkSettings"]["Networks"]["<NETWORK_NAME>"]["IPAddress"]

不是太难找,但很有用。此外,这可以轻松修改以查找分配给各种网络上容器的所有 IP。

于 2018-08-17T06:47:36.797 回答
4

对于Windows 容器使用

docker exec <container> ipconfig

容器<container>名称id在哪里。

您可以使用docker ps来查找容器的 id。

于 2017-10-25T17:03:15.613 回答
3

检查对我不起作用。也许就像我使用的-net host和一些命名空间一样。

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

docker exec -i -t NAME /sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
于 2015-06-04T18:05:10.657 回答
3

我必须通过 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 作为参数......

于 2017-08-26T18:59:32.803 回答
3
docker inspect <container id> | grep -i ip

例如:

docker inspect 2b0c4b617a8c | grep -i ip
于 2017-10-08T04:11:33.270 回答
3

此脚本将获取所有正在运行的容器的 IPv4 地址,而无需进一步处理或解释结果。如果您也不需要容器名称,则可以删除“echo -n $NAME:”行。非常适合自动化或填充变量。

#!/bin/sh
for NAME in $(docker ps --format {{.Names}})
do
  echo -n "$NAME:"
  docker inspect $NAME | grep -i "ip.*[12]*\.[0-9]*" | \
         sed -e 's/^  *//g' -e 's/[",]//g' -e 's/[a-zA-Z: ]//g'
done

如果你想要这样的话,你也可以创建一个别名:

alias dockerip='for NAME in $(docker ps --format {{.Names}}); do echo -n "$NAME:"; docker inspect $NAME|grep -i "ip.*[12]*\.[0-9]*"|sed -e "s/^  *//g" -e "s/[*,]//g" -e "s/[a-zA-Z: ]//g"'
于 2018-02-06T20:52:24.847 回答
3

我的多网络环境有问题,所以这是一个更动态的版本

获取驻留在一个撰写文件中的所有主机名、网络和 IP

 for N in $(docker-compose ps -q) ; do echo "$(docker inspect -f '{{.Config.Hostname}}' ${N}) $(docker inspect -f '{{range $i, $value := .NetworkSettings.Networks}} [{{$i}}:{{.IPAddress}}]{{end}}' ${N})"; done

输出

containerA [networkA:192.168.1.4] [networkB:192.168.2.4]
containerB  [networkA:192.168.1.5]

要获取所有正在运行的容器,请替换第一个命令

for N in $(docker-compose ps -q)

 for N in $(docker container ls | awk 'NR>=2' | cut -c1-12 );

给定 1 个特定网络,获取 1 个特定容器(具有多个网络)的 IP

docker inspect --format='{{range $i, $value := .NetworkSettings.Networks}}{{if eq $i "NETWORKNAME"}}{{.IPAddress}}{{end}}{{end}}' CONTAINERNAME

输出

192.168.1.4

给定 1 个特定网络,获取所有容器(具有多个网络)的“主机名 IP”

for N in $(docker-compose ps -q) ; do echo "$(docker inspect -f '{{.Config.Hostname}}' ${N}) $(docker inspect -f '{{range $i, $value := .NetworkSettings.Networks}}{{if eq $i "intranet"}}{{.IPAddress}}{{end}}{{end}}' ${N})"; done

输出

containerA 192.168.1.4
containerB 192.168.1.5

给定 1 个特定网络,获取所有容器(具有多个网络)的 IP

for N in $(docker-compose ps -q) ; do echo " $(docker inspect -f '{{range $i, $value := .NetworkSettings.Networks}}{{if eq $i "intranet"}}{{.IPAddress}}{{end}}{{end}}' ${N})"; done

输出

192.168.1.4
192.168.1.5
于 2020-07-03T18:57:42.227 回答
2

如果您需要特定的方便别名来获取特定的容器 ip,请连同接受的答案一起使用此别名

alias dockerip='f(){ docker inspect $1|grep -i "ipaddress.*[12]*\.[0-9]*"|sed -e "s/^  *//g" -e "s/[\",]//g" -e "s/[*,]//g" -e "s/[a-zA-Z: ]//g" | sort --unique;  unset -f f; }; f'

然后你可以得到你的容器IP

dockerip <containername>  

您也可以使用 containerid 而不是 containername

顺便说一句,接受了很好的答案并没有产生干净的输出,所以我对其进行了编辑并像这样使用;

alias dockerips='for NAME in $(docker ps --format {{.Names}}); do echo -n "$NAME:"; docker inspect $NAME|grep -i "ipaddress.*[12]*\.[0-9]*"|sed -e "s/^  *//g" -e "s/[\",]//g" -e "s/[_=*,]//g" -e "s/[a-zA-Z: ]//g "| sort --unique;done'
于 2019-01-11T11:32:21.023 回答
2

检查此脚本:https ://github.com/jakubthedeveloper/DockerIps

它以以下格式返回容器名称及其 IP:

abc_nginx 172.21.0.4
abc_php 172.21.0.5
abc_phpmyadmin 172.21.0.3
abc_mysql 172.21.0.2
于 2019-06-27T09:58:57.453 回答
2

在 Windows PowerShell 中尝试:

     docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <container id>
于 2018-05-13T09:49:45.890 回答
2

只是另一个经典的解决方案:

docker ps -aq | xargs docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}'
于 2019-11-07T23:23:48.950 回答
2

接受的答案准确地涵盖了要输入的内容,但这里有一个小的改进:

docker container inspect \
  --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' \
  $container_id_or_name

这使用了docker container inspect而不是更通用的,docker inspect因为 docker 在他们的命令中转向名词+动词语法,并消除了您正在检查的内容的歧义。我还在 IP 地址之后添加了一个空格,因为容器可以位于具有多个 IP 地址的多个 docker 网络上。可以将其换成对您有意义的任何其他字符或字符串。


对于那些想知道如何查找其他值的人,我经常使用以下命令将任何 docker 格式的语法输出到 json 中:

docker container inspect --format '{{json .}}' $container_id_or_name | jq .

您可能需要安装jq它才能工作,或者您可以省略尾随命令以将 json 读取为单个长行。查看此输出时,您可以看到每个键名及其父项,因此您可以创建自己的格式字符串来输出您想要的任何内容。格式语法是使用golang 的模板实现的,其中包含一些额外的 docker 特定功能


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

我回答的主要原因是这条评论对我来说是一个巨大的危险信号。它表明您的图像不包含运行应用程序所需的所有内容,这在使用容器时是一个很大的反模式。多年来有十几个客户,我还没有找到一个真实的用例,可以通过 docker 主机的内部 IP 地址直接连接到容器,但没有更好的选择。相反,如果您的容器中有需要运行的启动后配置,则通常使用入口点脚本来完成。

还有一个危险信号表明您正在绕过 docker 的网络模型。使用 docker 网络,有两种选择。首先,在容器之间进行通信时,这是通过用户创建的网络并使用 docker 的内置 DNS 通过名称或网络别名而不是通过重新创建容器时会更改的 IP 地址连接到容器来完成的。对于从 docker 外部到容器的通信,这是通过从 docker 主机向容器发布一个端口,然后在该端口上连接到主机而不是直接连接到容器来完成的。如果您坚持使用这两个选项,您应该能够在不知道其内部 IP 地址的情况下访问您的应用程序。

于 2018-09-05T12:55:12.077 回答
1

如果您想快速查看所有 Docker IP 地址,或者不输入实例名称,您可以破解docker ps命令将其添加到您的~/.bashrc文件中:

function docker-ips() {
    docker ps | while read line; do
        if `echo $line | grep -q 'CONTAINER ID'`; then
            echo -e "IP ADDRESS\t$line"
        else
            CID=$(echo $line | awk '{print $1}');
            IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" $CID);
            printf "${IP}\t${line}\n"
        fi
    done;
}

这来自Docker GitHub 上 Andrew Johnstone的提议: https ://github.com/docker/docker/issues/8786

于 2016-02-07T21:34:52.487 回答
1

docker inspect MY_CONTAINER | jq -r '.[].NetworkSettings.Networks[].IPAddress'

  • 优雅的语法
  • 灵活(一旦你使用 jq,你可以在任何有 json 的地方使用它,非常有用)
  • 强大的

  • 需要安装 jq(例如 apt-get install jq)
于 2018-08-24T09:36:54.870 回答
1
docker inspect --format "{{ .NetworkSettings.Networks.mynetwork.IPAddress }}" <containername or containerID here>

以上适用于已设置网络的 Windows 容器

docker create network mynetwork 
于 2018-07-16T08:22:39.190 回答
0

有多种方法可以从主机获取容器的 IP

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

如果您不记得上面的命令,您可以随时执行以下操作

docker inspect containerID

它将在返回信息后返回有关 Docker 对象的低级信息查找"Networks"并在其中找到"IPAddress"容器

于 2019-11-16T13:18:55.497 回答
0

这对我有用,我在 Windows 10 家庭版的 docker-toolbox 18.09.3 上运行:

输入命令'docker-machine ls'

λ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.98.100:2376 v18.09.6

它会在 URL 列下显示实际 IP。例如'192.168.98.100'

于 2019-07-25T09:31:18.287 回答
0

使用Python新的API

import docker

client = docker.DockerClient()
container = client.containers.get("NAME")
ip_add = container.attrs['NetworkSettings']['IPAddress']
print(ip_add)
于 2019-10-22T10:25:21.417 回答
0

Linux 容器

  1. docker exec postgres ifconfig
    

在此处输入图像描述

  1. docker exec postgres cat /etc/hosts
    

在此处输入图像描述

  1. docker exec postgres ip a

在此处输入图像描述

  1. 使用 Powershell

    docker 检查 postgres | 选择字符串'ipaddress'

在此处输入图像描述

于 2022-02-04T04:09:50.040 回答
-1

docker inspect <container id> | grep -i "ipaddress"

于 2018-05-03T18:32:59.163 回答
-6
for containerId in $(sudo docker ps -a | cut -f1 -d' ' | grep -v CONTAINER); do
    echo " ContainerId - $containerId >>  $(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $containerId) "
done
于 2016-02-10T09:30:46.563 回答