docker - 如何从 docker-compose 创建的 docker 容器内部连接到本地计算机?
问题描述
我有一个使用 docker-compose 创建的 docker 容器。这是 yml 文件。
version: "3"
services:
redis:
image: "redis"
web:
image: "myimage"
ports:
- "8000:8000"
environment:
REDIS_HOST: redis
volumes:
- .:/usr/src/app
depends_on:
- "redis"
command: ["npm", "start"]
我的 web 应用程序需要从这个容器连接到本地机器,因为我的本地机器正在运行另一个 web 应用程序,我的 docker 容器的 web 应用程序需要访问该 web 应用程序。我该怎么做呢?localhost 的 webapp 托管在不同的端口 (7777) 上。
我已经看到从 Docker 容器内部,如何连接到机器的本地主机?,并且我使用“extra_hosts”选项让它工作,但我想知道是否有另一种方法可以做到这一点?
解决方案
Docker compose 只是一个用于启动多个 Docker 容器的实用程序。因此,几乎所有适用于启动容器的事情对于以 . 开头的容器docker run
都是相同的docker-compose
。
特别是,由于您在 MAC 上,因此容器内有一个特殊的 DNS 名称解析到主机。
根据您拥有的 docker 版本,DNS 可能会略有不同。
对于 Docker 18.03 及更高版本,您可以使用host.docker.internal
对于 Docker 17.06 及以上版本使用docker.for.mac.host.internal
17.06以下使用docker.for.mac.localhost
因此,您可以使用连接到机器上的网络应用程序<dns-name>:7777
更新:
为避免对代码中的值进行硬编码,请将此 DNS 名称作为环境变量传递给容器。
environment:
REDIS_HOST: redis
WEB_APP: host.docker.internal
在应用程序内部,获取WEB_APP
环境变量并使用它进行连接
推荐阅读
- android - 类型不匹配:推断类型为
但是回调 !预计 - javascript - 当我刷新页面时,Jquery 代码无法完成
- javascript - 由 javascript 设置的 HTML 视频无法在 iOS 上播放
- mysql - 选择 3 列或更多列重复的表的 ID
- ruby-on-rails - 为什么追随者计数大于0会导致堆栈级别太深?
- python - 根据其他列 id 值创建一个新列 - Pandas
- android - ViewModel 防止重新获取数据
- angular - 如何在选择用户默认值的情况下实现 ngModel
- javascript - 将此 JS 片段转换为 React
- api - 用于外部访问的 API