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

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


当前回答

公认的答案很好地涵盖了要键入的内容,但这里有一个小的改进:

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地址的情况下访问应用程序。

其他回答

注意!!!Docker Compose用法:

由于Docker Compose为每个集群创建了一个独立的网络,因此下面的方法不适用于Docker Compos。


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

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

Docker可以像Linux程序一样将容器ID写入文件:

使用--cidfile=filename运行时,Docker将容器的ID转储为“filename”。

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

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

使用PID文件:

运行带有--cidfile参数的容器时,app.cid文件内容如下:2009年12月29日您可以使用文件内容检查Docker容器:blog-v4git:(开发)✗ 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地址。

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

下面是一个快速有效的答案:

获取您的容器名称或ID:

docker container ls

然后获取IP:

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

获取端口:

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

还没有人提出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。

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