我有一个类似的问题讨论无法在docker中连接到MongoDB。
- Windows 主机
- Docker Toolbox,因此它使用 VirtualBox
我曾经docker run --name mongo2 -p 127.0.0.1:27017:27017 mongo
创建过 MongoDB 容器。
当我连接到容器(docker -it mongo2 /bin/bash
)时,我可以通过连接到 Mongo mongo localhost:27017
。
我也检查过网络状态Mongo 正在监听0.0.0.0:27017,不仅仅是本地主机。
但是,我还是无法从 Windows 主机连接到容器。我甚至尝试禁用 Windows 防火墙,但仍然没有结果:
rs@ausus:~$ telnet localhost 27017
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
有任何想法吗?
答案1
实际上,答案是在第一条评论中提供的(并且它为我解决了同样的问题),但是在答案部分中更容易找到它。
答案假设您正在使用 Docker Toolbox。
而不是运行:
docker run --name mongo2 -p 127.0.0.1:27017:27017 mongo
应运行以下命令:
docker run --name mongo2 -p <ip of boot2docker VM>:27017:27017 mongo
要获取<ip of boot2docker VM>
虚拟机:
- 转到 VirtualBox --> 选择“默认”VM --> 单击“显示”按钮。
- 运行命令:
docker-machine env
。 - VM 的 IP 将会出现在输出中。
答案2
就像 Docker 文档中说的https://hub.docker.com/_/mongo/:“这意味着无法运行将数据目录映射到主机的 MongoDB 容器”
最后,我编写了一个.bat
脚本,定义我的 Win10 IP 并将其映射到变量。我直接在 Win10 上运行 MongoDB,然后使用 IP 访问它。这不是我想要的,但它有效。
启动.bat:
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set DOCKERHOST=%ip:~1%
docker-compose up
docker-compose.yml:
environment:
- MONGO_HOST=${DOCKERHOST}
答案3
用这个:
host.docker.internal:27017
该功能已在 Windows 版 Docker Desktop 的最新版本上启用。
为了测试,您还可以 ping Docker 网络接口:
C:\>ping host.docker.internal
Pinging host.docker.internal [192.168.0.2] with 32 bytes of data:
Reply from 192.168.0.2: bytes=32 time<1ms TTL=128
引自文档:
主机具有不断变化的 IP 地址(如果您没有网络访问权限,则没有)。我们建议您连接到特殊的 DNS 名称 host.docker.internal,该名称解析为主机使用的内部 IP 地址。这用于开发目的,不适用于 Docker Desktop for Windows 之外的生产环境。
“在生产环境中无法工作”听起来像是一个很大的缺点,但是如果这个基于 Linux 的容器在 Linux 下部署到云端,那么 DNS 名称无论如何都会改变,所以这是一个没有实际意义的观点。