如何获取正在运行的Docker容器的IP地址

129

我正在使用Docker for Mac,运行一个基于Node.js的微服务在Docker容器中。我想通过浏览器测试Node微服务。如何获取正在运行的Docker容器的IP地址?


3
这回答解决了您的问题吗?如何从主机获取Docker容器的IP地址? - sanyassh
9个回答

157

如果您不想将主机端口映射到容器中,则可以直接访问容器的Docker IP范围。默认情况下,此范围仅从主机访问。您可以执行以下操作来检查容器网络数据:

docker inspect <containerNameOrId>

最好进行筛选:

docker inspect <containerNameOrId> | grep '"IPAddress"' | head -n 1

通常,Docker的默认IP范围是172.17.0.0/16。如果一切正常且您没有指定任何特殊的网络选项,则您的主机应该是172.17.0.1,而您的第一个容器应该是172.17.0.2

编辑另一种更优雅的方法是使用Docker功能而不是“bash tricking”:

docker inspect -f "{{ .NetworkSettings.IPAddress }}" <containerNameOrId>

编辑2 对于现代的Docker引擎,现在是这样的(感谢评论者!):

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <containerNameOrId>

9
你在谈论内部IP,这与手头的问题无关。你的回答只会让读者更加困惑。因为该IP是Docker运行的机器的IP,而这个IP就是localhost :) - David Gatti
你错了。OP 没有指定微服务必须从外部访问。他只是说“通过浏览器测试节点微服务”,这可以使用我的建议方法在主机上使用 http://172.17.0.2:anyPort 完成。当然,如果你想使用主机上的 localhost 访问它,你必须映射端口。我们将看看 OP 想要什么。 - OscarAkaElvis
4
你的意思是说你可以从宿主机访问容器内部的内部IP地址?这是不可能的,因为它们处于完全不同的网络中。我刚刚检查了一下,我无法访问我的Docker容器的172.17.0.7地址,如果我用网络扫描器扫描我的主机,那么我应该能够看到所有的Docker容器,但事实并非如此。我知道这应该行不通,我测试了你说的方法(谁也说不准呢),但它不起作用。所以也许你的解释缺少一个关键部分? - David Gatti
2
我无法在容器中访问Web应用程序,除非使用-p映射端口。 - bilal.haider
1
格式选项已经过时,不再适用于更新的Docker引擎,请查看Nima Ghoroubi的答案。 - Jesus H
显示剩余8条评论

28

使用--format选项,仅获取IP地址而不是整个容器信息:

sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID>

4
在Windows主机上,使用双引号而不是单引号。 例如:sudo docker inspect --format "{{ .NetworkSettings.IPAddress }}" <容器ID或名称> 参考链接:链接 - Vineet Sajwan
1
关于容器的新信息格式,请参见此处 - Igor

24

对于现代的Docker引擎,请使用以下命令:

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

对于旧版引擎,请使用:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

正如@sanyash在原始OP区域中的评论中所提到并链接的那样。 - Jesse Chisholm
模板解析错误:模板::1:命令中出现意外未关闭的操作 - GML-VS

10

如果您想在容器内正确获取它,可以尝试

ip a | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | grep 172.17

6
你可以使用标志-P启动容器。这将为您的镜像暴露端口“分配”一个随机端口。
使用docker port <container id>命令,您可以查看随机选择的端口。然后可以通过localhost:port访问该端口。

2

0
如果要查看运行容器内的IP地址,/etc/hosts文件是一个很好的查看位置。为了在hosts文件中唯一地标识条目,最好使用-h选项运行容器。以下是示例命令:
  1. 使用设置了 -h 的命令运行容器:

docker run -td -h guju <image name>

  1. 登录到正在运行的容器并查看 /etc/hosts 文件。它将显示以下条目:

172.17.0.5 guju


-1

这将列出所有容器的IP地址

while read ctr;do
    sudo docker inspect --format "$ctr "'{{.Name}}{{ .NetworkSettings.IPAddress }}' $ctr
done < <(docker ps -a --filter status=running --format '{{.ID}}')

代码转储不是好的答案。您应该解释如何为什么这解决了他们的问题。我建议阅读“如何撰写好答案?”。这可以帮助未来的用户学习并最终将该知识应用于自己的代码中。当代码被解释时,您还可能会得到积极的反馈/赞同。 - John Conde

-4
你无法从主机外访问docker的IP地址。如果您的浏览器在另一台机器上,则最好通过传递-p 8080:8080运行命令来将主机端口映射到容器端口。
通过传递-p,您可以将主机端口映射到容器端口,并设置代理以将所有流量转发到指定的容器端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接