【问题标题】:How to visit a docker service by ip address如何通过 ip 地址访问 docker 服务
【发布时间】:2019-12-30 01:43:02
【问题描述】:

我是 docker 的新手,我可能遗漏了很多东西,尽管我浏览了基本文档并且我正在尝试部署一个简单的 Spring Boot API

我已将我的 API 部署为 docker-spring-boot .jar 文件,然后我安装了 docker 并使用以下命令推送它:

  • sudo docker login
  • sudo docker tag docker-spring-boot phillalexakis/myfirstapi:01
  • sudo docker push phillalexakis/myfirstapi:01

然后我使用 docker run 命令启动 API

sudo docker run -p 7777:8085 phillalexakis/myfirstapi:01

当我访问 localhost:7777/hello 时,我得到了所需的响应

这是我的Dockerfile

FROM openjdk:8
ADD target/docker-spring-boot.jar docker-spring-boot.jar
EXPOSE 8085
ENTRYPOINT ["java","-jar","docker-spring-boot.jar"]

基于这个answered post这个命令得到ip address

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

所以,我用container_name_or_id = phillalexakis/myfirstapi:01 运行它,我得到了这个错误

Template parsing error: template: :1:24: executing "" at <.NetworkSettings.Networks>: map has no entry for key "NetworkSettings"

如果我设法获得IP,我是否能够访问它并获得相同的回复

这就是我的想法:ip:7777/hello

【问题讨论】:

    标签: spring-boot docker


    【解决方案1】:

    您永远不需要查找该 IP 地址,而且它通常没有用处。

    如果您尝试从 Docker 空间外部调用该服务,那么您做对了:使用 docker run -p 选项将其端口发布到主机,并使用主机名来访问它。如果您尝试从另一个容器create a network 调用它,请确保使用指向该网络的--net 选项运行两个容器,并且它们可以使用另一个容器的--name 作为主机名来访问其他容器,并且其他服务正在侦听的容器内部端口(@98​​7654326@ 选项无效且不是必需的)。

    Docker 内部 IP 地址在各种常见情况下都不起作用。如果您在其他主机上,它将无法访问。如果您的本地 Docker 设置使用虚拟机(Docker Machine、Docker for Mac、minikube 等),您无法直接从主机访问 IP 地址。即使它确实有效,当您删除并重新创建容器时,它也可能会发生变化。如您所见,查找它还需要额外的(特权)操作,docker run -p 路径可以避免这种操作。


    您对matches the docker inspect documentation 的调用(正如@DanielHilgarth 所说,请确保在容器 而不是图像 上运行它)。在它可以工作的特定情况下(您与容器位于同一本机 Linux 主机上),您将需要使用未映射的端口,例如http://172.17.0.2:8085/hello

    【讨论】:

    • 正确,从我的容器返回的 IP172.17.0.2 ,所以 http://172.17.0.2:8085/hello 可以完美地工作,正如 @DanielHilgarth 也指出的那样,谢谢
    • 如果我推送另一个版本并重新启动容器,它仍然可以通过172.17.0.2 访问吗?
    • 不一定,不。
    • 所以我需要像我做的那样查找IP,对吗?
    • 您需要 docker run -p 选项,并通过主机的 DNS 名称或 IP 地址(可能更稳定)和发布的端口访问服务。
    【解决方案2】:

    您使用的是 image 名称,而不是 container 名称。
    通过执行docker ps获取容器名称。
    容器 ID 是第一列中的值,容器名称是最后一列中的值。你可以同时使用。

    然后,当您拥有 IP 后,您将能够通过 IP:8085/hello 访问您的 API,而不是 IP:7777/hello

    7777 端口在 Docker 主机上可用,并映射到容器上的 8085 端口。如果您直接访问容器——当你使用它的 IP 地址时——你需要使用容器公开的端口。


    还有另一种选择:
    您可以在启动容器时通过指定--name 参数为容器命名:

    sudo docker run -p 7777:8085 --name spring_api phillalexakis/myfirstapi:01
    

    现在,您可以从您的 Docker 主机使用该名称访问您的 API:spring_api:8085/hello

    【讨论】:

    • 好吧,我得到了IP,正如您正确指出的那样。虽然我无法在IP:8085/hello 连接
    • @PhillAlexakis:您是否尝试从您的 Docker 主机连接?
    • 我怎样才能找到它?我想我是从客户端访问它,我的浏览器
    • 那行不通。容器的 IP 地址仅可从 Docker 主机获得,即从您执行 docker run 的机器获得。如果你想让它在互联网上可用,你需要以某种方式将流量从互联网路由到容器。如果 Docker 主机可以通过 Internet 访问,一种选择是使用它的 Internet 地址和端口 7777(不要忘记在防火墙中打开它)。
    • 不,这行不通。 Docker 网络用于 Docker 内部组织目的。
    猜你喜欢
    • 2019-01-12
    • 2022-05-08
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多