centos 实现docker 容器和宿主机同网段主机互相连通

本文介绍了如何在CentOS 7.7上配置Docker容器,使其与Windows 10主机在同一网段下实现网络互通。通过删除宿主机物理网卡的IP配置,创建桥接网络,再将物理网卡加入到桥接网络中,最后配置容器网络,成功实现了宿主机与容器的网络连通。

需求

有两台实体机,一台是windows10,另一台是centos7.7。centos7.7这台作为docker 容器的宿主机,该机器下的容器需要和windows10 实现网络互通。

实现

找了很多的方法,大多数都是说在win10和centos上加上路由就可以实现,尝试下来加路由只能实现win10与宿主机的docker 虚拟网卡互通,无法实现win10与docker内的容器互通。

最终通过网络桥接重定向的方法实现。

基本思路如下:

1、删除宿主机物理网卡IP,MASK,GATEWAY等配置

2、创建桥接网络,brctl show查看

3、给创建的桥接网络配置成之前删除ip配置的宿主物理网卡相同的ip mask,gateway等配置

4、将之前删除ip配置的宿主物理网卡加入到创建的桥接网络中

实际操作命令如下:

1、ifconfig查看当前宿主机的物理网卡情况,比如我这里的是eno2,当前配置的ip是192.168.14.3/24

2、启动docker 服务

systemctl start docker

启动之后docker会默认创建一个docker0的网桥,这里我们不用这个网桥,因为使用这个默认的网桥不能给docker设置指定ip

2、创建桥接网络

docker network create --subnet=192.168.14.0/24 --gateway=192.168.14.1  docker-br0

默认以bridge方式创建,创建好后,docker会自动给docker-bro网桥配置192.168.14.1,但这个ip不是我们的要的,我们要的是和之前物理网卡上相同的ip配置,即192.168.14.3.

当你在 **虚拟机中的 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" ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值