创建新容器后,是否可以运行命令从主机获取容器的IP地址?
基本上,一旦Docker创建了容器,我就想滚动我自己的代码部署和容器配置脚本。
创建新容器后,是否可以运行命令从主机获取容器的IP地址?
基本上,一旦Docker创建了容器,我就想滚动我自己的代码部署和容器配置脚本。
当前回答
这将列出主机上的所有容器IP:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
其他回答
docker inspect <container id> | grep -i ip
例如:
docker inspect 2b0c4b617a8c | grep -i ip
只需一个命令即可获取所有容器名称及其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 container inspect \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' \
$container_id_or_name
这使用docker容器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地址的情况下访问应用程序。
这是我今天用Python开发的一个解决方案,使用docker inspect容器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 Python API。Docker API获取IP地址的解决方案相当简单。
*基于NIX的操作系统:dockerapi3.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"]
OS不可知:dockerapi4.0.x(由于评论中的pds而添加)
import docker
client = docker.from_env()
container = client.containers.get(container_name)
vars( container )["attrs"]["NetworkSettings"]["Networks"]["<NETWORK_NAME>"]["IPAddress"]
不太难找到,但很有用。此外,这可以很容易地修改,以查找分配给各种网络上的容器的所有IP。