docker容器连接到我的本地主机,因此它可以向在我本地运行的应用程序发送http请求[重复]

Posted

技术标签:

【中文标题】docker容器连接到我的本地主机,因此它可以向在我本地运行的应用程序发送http请求[重复]【英文标题】:docker container connect to my localhost so it can send a http request to app running in my local [duplicate] 【发布时间】:2021-12-02 07:20:59 【问题描述】:

我在不同的 docker composes 中有两个应用程序(微服务)

app1.yml
version: "3.4"

services:
  app1:
    image: flask-app1
    environment:
      - APP2_URL=http://localhost:8000
    ports:
      - 5000:8000
    volumes:
      - "../:/app/"
    depends_on:
      - db_backend1
    restart: on-failure

  db_backend1:
    ...
app2.yml
version: "3.4"

services:
  app2:
    image: flask-app2
    ports:
      - 8000:8000
    volumes:
      - "..:/app"
    restart: on-failure

当然,它们还有其他依赖项(数据库服务器等) 我需要在本地运行它们,它们每个都可以在本地运行良好,但是在这种情况下,app1需要通过发送http get请求从app2获取数据,所以我设置了app2 url(http://localhost:8000)作为环境变量(仅用于开发目的)。但总是得到请求异常错误,说连接结束已关闭。

所以,如果有人知道如何解决它,那就太好了。

【问题讨论】:

主机名在容器内解析,即localhost是容器,不是主机。我们可以使用host.docker.internal(参见this question)或者在同一个网络中启动它们,这样它们就可以通过内部dns名称访问(就像我们通过主机名db_backend而不是localhost连接到数据库一样) . 我建议将一个文件的 Compose default 网络设置为指向另一个文件,然后您可以使用普通的 Docker 网络从一个文件到另一个文件(app1 和 @987654330 @ 将是普通主机名),但我也将其与@Turing85 提到的有关访问主机系统的规范问题联系起来。 【参考方案1】:

容器是一个“设备”,所以它有自己的“本地主机”,所以当你按原样设置 url 时,它在内部被调用,这不是你想要的。 解决方案是在 compose 之间创建一个网络,以便您可以将特定容器称为“containerName:port”。 你可以参考: Communication between multiple docker-compose projects

【讨论】:

谢谢,host.docker.internal 修改修复了它

以上是关于docker容器连接到我的本地主机,因此它可以向在我本地运行的应用程序发送http请求[重复]的主要内容,如果未能解决你的问题,请参考以下文章

允许 docker 容器连接到本地/主机 postgres 数据库

从 docker 容器连接到主机 mongodb

尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误

如何从 Docker 容器连接到本地 Redis 服务器?

无法从本地主机连接到 Docker 中的 MySQL(Docker for Mac beta)

从主机连接到 docker 容器中的 mysql