如何将Docker容器接入Vagrant虚拟机所在的同网段网络
看起来你在尝试让Docker容器和Vagrant虚拟机共享同一网段时踩了几个常见的网络配置坑,我来帮你拆解问题并给出可行的解决办法:
你之前操作的核心错误
网关IP冲突
Vagrant默认的host-only网络(vboxnet0)中,主机侧的vboxnet0接口地址通常就是192.168.33.1,而你创建Docker网桥时也指定了这个IP作为网关——这会导致主机上两个虚拟接口争抢同一个IP地址,直接破坏了网络通信路径,所以虚拟机无法ping通33.1。错误接入vboxnet0到Docker网桥
Docker的bridge网桥是Docker独立管理的虚拟网络,不能直接将VirtualBox的vboxnet0接口接入其中。这种操作会打乱VirtualBox host-only网络的原生路由规则,不仅会影响容器通信,还可能导致虚拟机和主机的原有SSH连接出现异常(你能通过NAT的10.X网段连接,正是因为host-only网络的通信已经被破坏了)。
正确的解决方案:使用Macvlan网络
Macvlan是Docker支持的一种网络驱动,它可以让容器直接接入物理/虚拟网络(这里就是vboxnet0所在的192.168.33.0/24网段),让容器和虚拟机处于同一个广播域,完美满足你共享.env配置、让Gearman Workers互通的需求。
步骤1:创建Macvlan网络
先在主机上确认vboxnet0的接口名称(用ip addr命令查看,通常就是vboxnet0),然后执行以下命令创建Macvlan网络:
docker network create --driver macvlan \ --subnet 192.168.33.0/24 \ --gateway 192.168.33.1 \ -o parent=vboxnet0 vagrant-shared-network
步骤2:启动容器并接入该网络
运行你的Redis测试容器(或其他应用容器)时,指定这个Macvlan网络和你想要的固定IP:
docker run -d --name redis-test \ --network vagrant-shared-network \ --ip 192.168.33.101 \ redis
验证通信
现在登录到Vagrant虚拟机,尝试ping192.168.33.101,应该能直接连通;容器也能访问虚拟机的192.168.33.33地址,完全满足你共享.env配置的需求。
补充说明
- Macvlan网络的一个特性:主机本身无法直接ping通容器的IP(因为Macvlan隔离了主机与容器的直接通信),但这对你的场景没有影响——你需要的是虚拟机和容器互通,这个需求已经被满足。如果后续主机需要访问容器,可以通过虚拟机转发,或者创建Macvlan的子接口来实现。
- 如果你坚持要用Docker Bridge网络,需要调整网桥的网关IP为
192.168.33.0/24网段中未被占用的地址(比如192.168.33.254),然后在虚拟机中添加静态路由,指向主机的vboxnet0地址,但这种配置比Macvlan复杂得多,不推荐。
内容的提问来源于stack exchange,提问作者Graffiti

