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

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

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

首先获取容器ID:

docker ps 

(第一列是容器ID)

使用容器ID运行:

 docker inspect <container ID> 

在“NetworkSettings”的底部,你可以find“IPAddress”

检查的--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地址。

你可以使用docker inspect <container id>

例:

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

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

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

显示所有容器IP地址:

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

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

input正在运行的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 

执行:

 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 

使用CONTAINER ID值:

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

“172.17.0.2”

从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" } } ] 

参考容器名称:

 docker run ... --name pg-master 

然后按名称获取IP地址:

 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 } 

您应该将variablesnetworking更改为您自己的networking名称。

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

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

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

以下是我今天在Python中开发的解决scheme,使用“docker inspect container”JSON输出作为数据源。

我有很多容器和基础设施,我必须检查,我需要从任何容器中以快速和漂亮的方式获得基本的networking信息。 这就是我写这个剧本的原因。

重要提示:自1.9版本以来,Docker允许您创build多个networking并将其附加到容器。

 #!/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 

欲了解更多信息,我有一个Gist的,还有一些其他的细节和意见。

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

如果将容器部署到默认桥接networking,上述工作。

但是,如果使用自定义网桥或覆盖networking,我发现下面的工作更好:

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

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

  1. select容器
  2. 点击设置
  3. 点击Ports选项卡。

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

由于Docker Compose为每个集群创build一个独立的networking,下面的方法不适用于docker-compose


最优雅和简单的方法是定义一个shell函数作为最受赞赏的答案@ WouterD's :

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

Docker可以将容器标识符写入像Linux程序这样的文件中:

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

Docker运行PID等价节

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

使用PID文件

  1. 使用--cidfile参数运行容器, app.cid文件内容如下所示:

a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909

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

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

  2. 提取容器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


更人性化的forms

 #!/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地址的select。

只是为了完整:

我真的很喜欢–format选项,但起初我并没有意识到这个select,所以我用一个简单的Python单行来得到相同的结果:

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

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

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

输出:

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

将之前的答案与基于Docker镜像名称的容器ID进行合并。

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

对于那些来自Google的人来说,从terminal(而不是脚本)寻找命令执行的解决scheme, jid (一种交互式的JSON向下钻取具有自动完成和build议的util)使您可以用较less的input实现相同的function。

 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" 

检查没有为我工作。 也许正如我使用networking-net host和一些命名空间。

无论如何,我发现这很好地工作:

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

使用:

 docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1 
 docker inspect <container id> | grep -i ip 

例如:

 docker inspect 2b0c4b617a8c | grep -i ip 

docker inspect <container id> | grep "IPAddress"

如果您想要快速查看所有Docker IP地址,或者不input实例名称,可以将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的build议: https : //github.com/docker/docker/issues/8786

我不得不通过docker容器名称提取docker container 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脚本中可能会很方便,这个bash脚本会将my_container_name作为一个参数。

对于Windows 10:

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

对于Windows容器使用

 docker exec <container> ipconfig 

其中<container><container>名称ID

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

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

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

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

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