通过别名获取docker容器IP



从主机环境中,是否有一种方法可以通过使用别名查询来获取容器及其属性,至少可以获取其IP地址?

为了清楚起见,我指的是你可以给特定网络上的容器提供的实际别名,请参阅这里的

目前,到目前为止,我的解决方案是通过其余的API在所有容器上迭代,看看别名是否与我想要的匹配。很明显,这并不理想,因为在主机上有许多容器的情况下,这不会很好地扩展。

理想情况下,我只想向docker的嵌入式DNS服务器发送一个DNS请求,但这似乎是不可能的。查看此问题/答案了解更多信息

有人知道更好的解决方案吗?

/更新

由于别名与网络相连,因此需要查询的别名附带其网络名称,例如"container alias.network name"。因此,我们必须枚举单个网络中的容器,但如果单个网络中有多个容器,即使这样也不能很好地扩展。

请注意,在dockerapi中可以根据网络名称过滤所有容器,从而允许对该api进行单个REST调用。但是,即使"Alias"键在REST结果中,它也从不包含任何值。(我不确定这可能是一个错误。(您必须先获取特定容器,即GET /v1.24/containers/container-uuid/json,然后才能查看其别名。

几乎可以肯定,有一种更整洁的方法可以做到这一点,甚至可以完全使用docker inspect,但如果您有jq可用,您可以尝试以下方法:

docker inspect -f '{{json .NetworkSettings.Networks}}' <container name/ID> | 
jq '.[] | select(.Aliases[] | contains("<alias on network>")) | .IPAddress'

请记住,在Docker空间之外,这些细节大多没有用处;除了在一个非常特定的配置上(在与容器相同的本地Linux主机上(,您不能直接访问容器特定的IP地址。

如果你可以运行docker命令,你就可以启动容器,这样你就可以间接访问Docker DNS系统。例如,让我们在非默认网络上启动一个具有别名的容器:

docker network create testnet
docker run 
--net testnet 
--name sleep 
--network-alias zzz 
-d 
busybox 
sleep 600

现在,我们可以在同一网络上运行另一个容器,并开始进行DNS查询。我们可以得到zzz的Docker内部IP地址,别名:

$ docker run --net testnet --rm giantswarm/tiny-tools dig +short zzz
172.18.0.2

然后我们可以反向解析该地址:

$ docker run --net testnet --rm giantswarm/tiny-tools dig +short -x 172.18.0.2
sleep.testnet.

该规范名称是容器名称和网络,如果您需要深入探究,现在可以使用docker inspect sleep

我认为你应该通过阅读docker ref 来知道你在做什么

然后,只需运行以下,就可以比以往任何时候都简单地抚摸docker

cat << EOF >> /etc/bash.bashrc
function docker(){
[[ "ip" == "$1" ]] && /usr/bin/docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $2 || /usr/bin/docker $@
}
EOF
source /etc/bash.bashrc
docker ip $INSTANCE_ID

最新更新