【问题标题】:Identify Docker container's IP Address and connect to port识别 Docker 容器的 IP 地址并连接到端口
【发布时间】:2020-12-30 01:59:44
【问题描述】:

在我的windows 笔记本电脑上,我创建了一个Play 应用程序,如果我直接执行它的脚本,它运行良好。在本地机器上,我使用localhost:9000 URL 访问应用程序。

我现在已经创建了应用程序的Docker 图像并暴露了端口9000

#this docker file copies prod specific files to container, eg logback_prod.xml and application_prod.conf

    FROM openjdk:8
    #ENV APP_NAME      myapp
    #ENV APP_VERSION   1.0-SNAPSHOT
...
    #entrypoint is deploy/....
    EXPOSE 9000
    ENTRYPOINT ...

但我无法访问localhost:9000 上的应用程序。我怀疑该映像可能在 docker 自己创建的其他 IP 上运行。

我说的对吗?如何通过容器访问我的应用程序?我不需要Kubernetes Services 等,因为我已经在另一台机器上进行了该设置。我的具体问题是如何直接访问docker 容器。

更新 我还尝试使用--network="host" 运行docker image 但这也不起作用

更新 2

根据以下建议,我执行了以下命令,但仍然无法访问应用程序。

docker run -p 9000:9000 --env-file env.txt imagename

我看到了痕迹

[debug] a.i.TcpListener - Successfully bound to /0.0.0.0:9000
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0.0.0.0:9000

docker ps -a 显示应用程序已通过端口绑定 0.0.0.0:9000->9000/tcp 启动

docker inspect 显示IP - "IPAddress": "172.17.0.2"

但是http://172.17.0.2:9000/ 上的Chrome 不起作用This site can’t be reached172.17.0.2

netstat -ab on cmd 显示 TCP 0.0.0.0:9000 LAPTOP-788I0GL1:0 LISTENING [com.docker.backend.exe]

【问题讨论】:

  • 你是如何启动容器的?您应该能够连接到docker run -p 端口号;仅在 Dockerfile 中使用 EXPOSE 是不够的。容器专用 IP 地址是一个内部 Docker 实现细节,在许多常见情况下不起作用(来自不同的主机,如果 Docker 在 VM 中,在 MacOS 或 Windows 平台上),我不建议查找它。
  • 最近,我做了docker run -p 9000:9000 --env-file env.txt manuchadha25/mydockerimage。当我看到 docker ps -a 时,我可以看到 0.0.0.0:9000->9000/tcp
  • 应用程序是否监听 127.0.0.1:9000(“仅限本地主机”)、0.0.0.0:9000(“所有接口”)或其他? (应该是 0.0.0.0 变种,并且端口号需要匹配第二个-p 端口。)你在使用 Docker Toolbox 吗? (这需要一个特殊的docker-machine ip 地址,可能是192.168.99.100,而不是localhost。)
  • Listening for HTTP on /0.0.0.0:9000

标签: docker


【解决方案1】:

识别容器的 IP 地址

使用正在运行的容器尝试这些选项。 <docker> 指容器的名称或 id

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

//WINDOWS ONLY
docker inspect --format "{{ .NetworkSettings.IPAddress }}" <docker>

docker inspect <docker> | grep "IPAddress"

Grep 在 Windows 上不可用*


docker network inspect bridge

最后一个将输出在 bridge 网络中分配的所有正在运行的容器的信息(默认)。确定后,检查容器的 IPv4Address 字段。


暴露端口

为了能够连接到容器的端口,您可以公开它。 请注意,在这种情况下不需要上一步:

docker run -p 9000:9000 --env-file env.txt manuchadha25/mydockerimage

默认情况下,docker 将绑定/监听到主机上的所有接口。 -p 9000:9000 选项暴露了端口,结果你得到:0.0.0.0:9000-&gt;9000/tcp

现在 localhost:9000 已成功连接到您的 docker 进程。

【讨论】:

  • 谢谢。这样做了,但它没有显示任何东西。只是一个空输出
  • 我看到“IPAddress”:“”。当我运行inspect 时。这很奇怪吗?另外,我在 Windows 上,所以没有Grep 适合我
  • 抱歉,之前的错误是我使用--network="host" 运行。我删除了它,只做了docker run。我现在可以看到 IP "IPAddress": "172.17.0.2" 但我仍然无法使用 172.17.0.2:9000 访问应用程序
  • 那是因为在运行容器时必须将端口“暴露”给主机。尝试语法 docker run (...) -p 9200:9200 (...) ---> forums.docker.com/t/how-to-expose-port-on-running-container/…
  • 做了docker run -p 9000:9000 --env-file env.txt manuchadha25/mydockerimage,但没有爱。我敢肯定这是某个地方的一些愚蠢的错误,因为这并不难。当我看到docker ps -a 时,我可以看到0.0.0.0:9000-&gt;9000/tcp
【解决方案2】:

你可以试试命令docker inspect:

docker inspect <containerid>

列出可以运行命令的容器ID:

docker ps

为了获得 ipAddress 信息,您应该查看节点:

"IPAddress": "172.23.0.2"

在生成的 json 输出中。

这是docker inspect command 的文档。

【讨论】:

  • 我看到“IPAddress”:“”。当我运行inspect 时。这很奇怪吗?
  • 发现该问题的答案已被接受,也许这就是您的情况:stackoverflow.com/questions/43803849/…
  • 谢谢。会检查。抱歉,之前的错误是我使用 --network="host" 运行。我删除了它,只做了 docker run。我现在可以看到 IP "IPAddress": "172.17.0.2" 但我仍然无法使用 172.17.0.2:9000 访问该应用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多