【问题标题】:Unable to access local docker container with IP address无法使用 IP 地址访问本地 docker 容器
【发布时间】:2021-04-07 06:17:46
【问题描述】:

我在我的 Mac 系统上本地运行一个 docker 容器。我在这篇文章的底部粘贴了 Dockerfile 的内容。我在图像中暴露了端口 8888,我想使用 container-ip-address:8888 从我的主机浏览器访问 python 程序。但是,它没有连接。将其映射到本地主机上的端口是可行的,但我不想这样做。我该如何解决这个问题? (已经尝试创建一个 docker 网络并将容器作为新网络的一部分运行 - 没有骰子)。任何帮助将非常感激。 Dockerfile 内容 -

FROM python:latest

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app

EXPOSE 8888
RUN pip install tornado
CMD ["python", "./api.py" ]

【问题讨论】:

  • 在 MacOS(和任何非 Linux 主机)上,您别无选择,只能使用 docker run -p 发布的端口:您不能直接访问容器专用 IP 地址。 docker run -p 方法适用于所有主机操作系统(直到在 Docker Toolbox VM 中运行的 Docker),并且与在同一主机上运行的非 Docker 进程的工作方式相同。
  • 谢谢。但这对我来说是一个主要问题,因为我试图调用 Python 程序公开的 Rest API。我从在 Tomcat 上本地运行的简单 HTML 页面调用 API。当我尝试从上述 HTML 页面调用 Rest API 时,通过 localhost 连接到容器,浏览器(任何浏览器)由于交叉引用问题而不允许它:-(。那么我该如何测试呢?有什么想法吗?

标签: docker containers ip-address


【解决方案1】:

Expose 只是告诉 docker 这个容器将使用这个端口。它没有映射到任何地方。 https://docs.docker.com/engine/reference/builder/#expose

映射是运行容器的代码的任务。如果是本地机器,它是一个 docker。如果您不在docker run 中映射端口,则无法从 docker 网络外部访问容器。同时您的主机不在 docker 网络中。如果您手动创建 docker 网络,情况也是如此 - 您的机器无法访问它的内部部分。

换句话说,您必须选择自己的方式:

  • 在执行 docker run(本地开发)时使用 -p ....
  • 如果您使用 docker composer(主要是本地开发),或者在 docker compose 文件中定义它。当您在 docker 中运行多个通信系统时,这种方法非常有用。
  • 如果您使用解决方案(使用协调器/自动缩放器等进行生产)进入 kubernetes,或者通过生产环境中的 kubernetes yaml 定义文件执行此操作

【讨论】:

  • 谢谢。但这对我来说是一个主要问题,因为我试图调用 Python 程序公开的 Rest API。我从在 Tomcat 上本地运行的简单 HTML 页面调用 API。当我尝试从上述 HTML 页面调用 Rest API 时,通过 localhost 连接到容器,浏览器(任何浏览器)由于交叉引用问题而不允许它:-(。那么我该如何测试呢?有什么想法吗?
  • 您是在谈论错误access-control-allow-origin(即 CORS),这是由于您的 javascript 从主机(比如说端口 80)提供服务,而 api 在其他端口上提供的吗?如果是,那么这个问题很常见,可以通过在您的 api 响应中添加标题来轻松解决:Access-Control-Allow-Origin *Access-Control-Allow-Methods: * 这里是 doc:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 只是谷歌如何在您正在使用的 python api 上打开 CORS,或者最坏的情况可以通过带有这些标头的 nginx 代理来完成。
  • 再次感谢!我以前没有这样做过,我无法找到如何做到这一点的明确示例。如果我要编写一个在 HTML 页面中单击按钮时调用的 JS 函数,并且此 JS 函数使用 xmlhttprequest 或 fetch 调用其余 api,我将如何包含这些标头?示例代码会很棒!问候
  • CORS 由浏览器实现。基本上,当浏览器看到您的脚本向与脚本来源(nlding 协议和端口)不匹配的来源发出请求时 - 它以 OPTIONS 请求开始,您的 GET 请求将发送到目的地(在您的情况下,它是基于 python 的 API 从什么我理解)并读取响应标头。响应标头必须包含 Access-Control-Allow-... 标头,该标头定义了可以从中请求它的主机列表。如果这些标头的值为*,则意味着任何主机都可以对您的API 执行任何方法。这对于开发环境来说已经足够好了。
  • 您可以尝试使用类似 Postman 的工具向您的 API 发出请求,看看它是否返回 Access-Control-Allow 标头。因为如果您看到 CORS 错误,则意味着 Access-Control-Allow 不起作用。
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2022-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多