创建新容器后,是否可以运行命令以从主机获取容器的IP地址?
基本上,一旦Docker创建了容器,我就想推出自己的代码部署和容器配置脚本。
创建新容器后,是否可以运行命令以从主机获取容器的IP地址?
基本上,一旦Docker创建了容器,我就想推出自己的代码部署和容器配置脚本。
Answers:
该--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上,请在花括号周围使用双引号"
而不是单引号'
。
<no value>
使用Fig / Boot2Docker在Mac上获得响应
<no value>
如果尝试对未运行的容器运行此命令,则会得到提示。在执行此操作之前,请确保您的容器正在运行。
{{ .NetworkSettings.Networks.$network.IPAddress }}
。默认似乎是桥接,但是在docker-compose下,这将是一个特定的名称,这取决于您的应用程序的名称(我认为是从--project-name标志开始的,尽管这也将取决于哪种类型的网络配置您已设置)。我在此处的答案中写了完整的答案stackoverflow.com/questions/17157721/…–
您可以使用docker inspect <container id>
。
例如:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
,它可以正常工作:)
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'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
是新语法。-format
不推荐使用,则变为--format
。
首先获取容器ID:
docker ps
(第一列是容器ID)
使用容器ID运行:
docker inspect <container ID>
在底部的“网络设置”下,您可以找到“ IP地址”
或只是做:
docker inspect <container id> | grep "IPAddress"
docker run -it MYCONTAINER /bin/bash
)上,的输出inspect
没有section NetworkSettings
!
docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
解决方案,而不是获取IP所需的所有格式细节。+1
docker run -it MYIMAGE
(不是容器名称);如果这样做,docker inspect MYIMAGE
您将获得有关图像的静态信息。您需要找到正在运行的容器的名称(或使用其他容器的ID)。在我的系统上,从该映像创建的第一个此类容器默认为name MYIMAGE_1
,因此docker inspect MYIMAGE_1
NetworkSettings 也是如此。
docker inspect CONTAINER_ID | grep "IPAddress"
您可以添加-i
到grep来忽略大小写,那么即使是以下情况也可以使用:
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
仅通过一个命令即可获取所有容器名称及其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
{{.NetworkSettings.IPAddress }}
改为{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
。该sed(1)
删除空线的容器存在,但不具有IP地址。
将此shell脚本添加到您的~/.bashrc
文件或相关文件中:
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
在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
对于Windows:
docker exec [container-id or container-name] ipconfig
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
从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 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
“ 172.17.0.2”
根据我喜欢的一些答案,我决定将它们合并为一个函数,以获取所有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
我编写了以下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
}
您应该将变量网络更改为您自己的网络名称。
这是一个快速的工作答案:
获取您的容器名称或ID:
docker container ls
然后获取IP:
docker inspect <container_ID Or container_name> |grep 'IPAddress'
获取端口:
docker inspect <container_ID Or container_name> |grep 'Port'
Docker是用Go编写的,它也使用Go语法进行查询。
要检查特定容器的IP地址,您需要运行命令(-f
对于“格式”):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
对于容器ID或名称,可以运行以下命令
docker container ls
它将列出每个正在运行的容器。
这是我今天在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
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}'
为了扩展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
只是为了摆脱第一行(表头),仍然是必需的。不过,我可以使用--format
:docker 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。
docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
要获取容器的IP地址和主机端口:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
输出:
"HostPort": "4200"
"HostPort": "4200"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
注意!!!用于Docker Compose的用法:
由于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文件:
运行带有--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'])
有关更多信息,请参见“ 获取Docker容器IP地址的10种方法 ”。
这将列出主机上的所有容器IP:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
仅出于完整性考虑:
我真的很喜欢这个--format
选项,但是起初我并不了解它,所以我使用了一个简单的Python单行代码来获得相同的结果:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
将先前的答案与基于Docker映像名称查找容器ID相结合:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
采用:
docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
$ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
172.17.0.2
对于Windows容器使用
docker exec <container> ipconfig
容器<container>
的名称或ID在哪里。
您可以使用docker ps
查找容器的ID。
如果您忘记了容器ID或不想使用Shell命令进行操作,最好使用类似于Portainer的UI。
$ 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的所有信息。