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 数据库
尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误