Windows宿主机如何访问连接虚拟机中的Docker容器

本文介绍了如何在Windows环境下通过NAT网络模式,查看虚拟机IP,并设置路由转发,以访问运行在Docker容器内的flask项目。首先,通过`dockerinspect`获取容器IP,然后使用`ROUTEADD`命令在宿主机上添加路由,实现对Docker容器的访问。

Windows宿主机如何访问连接虚拟机中的Docker容器

在学习docker部署flask项目,发现在window本地不能访问docker

image-20230629155629458

1 图解

image-20230629164132038

2 查看虚拟机ip

虚拟机的通信可以使用多种方式,本文中使用了nat

image-20230629161628096
image-20230629163722545

3. 添加宿主机到Docker的路由

  1. 在虚拟机中运行以下命令来查看Docker容器的IP地址:

    docker inspect <容器名称或ID
当你在 **虚拟机中的 Docker 容器** 里运行了 MongoDB,但在 **宿主机(Host Machine)上连接不上**,这是一个非常常见的网络问题。下面我会详细分析可能的原因,并提供解决方案。 --- ## 🧩 场景还原 - 你有一台 **虚拟机(VM)**,比如使用 VMware、VirtualBox 或云服务器(如本地 VM 跑 Ubuntu)。 - 在这个虚拟机中,你用 Docker 启动了一个 MongoDB 容器: ```bash docker run -d --name mongodb -p 27017:27017 mongo:6 ``` - 你想从你的 **物理机(宿主机 / 本机电脑)** 使用 MongoDB 客户端(如 `mongosh`、Robo 3T、MongoDB Compass)连接到该 MongoDB。 - 但连接失败:`Connection refused` 或超时。 --- ## ✅ 正确的连接方式 你应该通过以下地址尝试连接: ``` mongodb://<虚拟机IP>:27017 ``` 例如: ```bash mongosh "mongodb://192.168.1.100:27017" ``` > ❌ 错误做法:使用 `localhost` 或 `127.0.0.1` 连接 —— 那是指你本机,不是虚拟机! --- ## 🔍 常见原因及解决方案 ### ✅ 1. 没有正确获取虚拟机IP 地址 #### 解决方法:查看虚拟机的真实局域网 IP虚拟机中执行: ```bash ip addr show # 或更简单 hostname -I # 或 ip route get 1 | awk '{print $7}' ``` 输出类似: ``` 192.168.1.100 ``` 然后你在宿主机上使用这个 IP连接: ```bash mongosh "mongodb://192.168.1.100:27017" ``` > ⚠️ 注意:不要用 `127.0.0.1` 或 `localhost`,那是虚拟机自己的回环地址。 --- ### ✅ 2. 虚拟机防火墙或安全组阻止了端口 27017 即使 Docker 映射了 `-p 27017:27017`,如果虚拟机操作系统防火墙没放行,外部仍无法访问。 #### 解决方法: ##### 对于 Ubuntu/Debian(使用 ufw): ```bash sudo ufw allow 27017 ``` ##### 对于 CentOS/RHEL(使用 firewalld): ```bash sudo firewall-cmd --permanent --add-port=27017/tcp sudo firewall-cmd --reload ``` ##### 如果是云服务器(阿里云、AWS、腾讯云等): 确保 **安全组规则** 允许入方向(Inbound)的 `27017` 端口开放(建议限制来源 IP)。 --- ### ✅ 3. Docker 容器未正确映射端口 检查是否真的做了端口映射: ```bash docker ps ``` 输出应包含: ``` CONTAINER ID IMAGE COMMAND PORTS NAMES ... mongo "docker-entrypoint.s&hellip;" 0.0.0.0:27017->27017/tcp mongodb ``` ✅ 必须看到 `0.0.0.0:27017->27017/tcp`,表示监听所有接口。 ❌ 如果只显示 `127.0.0.1:27017->27017/tcp`,则只能从虚拟机内部访问。 #### 修复命令(重新启动容器并正确映射): ```bash docker stop mongodb docker rm mongodb docker run -d --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ mongo:6 ``` > `-p 27017:27017` 默认绑定到 `0.0.0.0`,所以可以被外部访问。 --- ### ✅ 4. MongoDB 绑定到了 localhost(默认行为) 新版本 MongoDB 默认会绑定到 `127.0.0.1`,即仅允许本地连接。如果你没有显式配置,它不会接受来自外部的连接。 #### 解决方法:启动容器时指定绑定所有接口 修改启动命令,添加 `--bind_ip_all` 参数: ```bash docker run -d --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ mongo:6 --bind_ip_all ``` > 💡 `--bind_ip_all` 表示监听所有网络接口(等价于 `--bind_ip 0.0.0.0`) ⚠️ 不要使用 `--bind_ip 192.168.1.100`,因为这是宿主 IP,在容器内无效。 --- ### ✅ 5. 虚拟机网络模式问题(NAT vs Bridged) #### 常见情况: - **NAT 模式**:虚拟机宿主机不在同一网段,需要做端口转发。 - **桥接(Bridged)模式**:虚拟机获得局域网独立 IP,可以直接访问。 #### 推荐方案: 使用 **桥接模式(Bridged Networking)**,让虚拟机拥有一个局域网 IP(如 `192.168.1.x`),这样宿主机和其他设备可以直接访问。 如果你必须用 NAT,需配置端口转发: ##### VirtualBox 示例(NAT + 端口转发): 1. 设置 → 网络 → 高级 → 端口转发 2. 添加规则: - 名称:MongoDB - 协议:TCP - 主机IP:留空(或 127.0.0.1) - 主机端口:27017 - 子系统IP:留空 - 子系统端口:27017 然后你在宿主机连接: ```bash mongosh "mongodb://localhost:27017" ``` --- ### ✅ 6. MongoDB 用户权限不足或未启用认证 虽然不影响“连上”,但可能导致认证失败。 建议始终设置用户名密码: ```bash docker run -d --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ mongo:6 --bind_ip_all ``` 连接时带上认证信息: ```bash mongosh "mongodb://admin:password@192.168.1.100:27017/admin" ``` --- ## ✅ 测试连通性的小技巧 ### 在宿主机测试端口是否可达: ```bash telnet 192.168.1.100 27017 # 或 nc -zv 192.168.1.100 27017 ``` 如果提示 `Connection refused` 或超时,则说明网络不通。 --- ## ✅ 最终推荐完整启动命令 ```bash docker run -d --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ mongo:6 \ --bind_ip_all ``` 然后从宿主机连接: ```bash mongosh "mongodb://admin:password@192.168.1.100:27017/admin" ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值