【摘要】 虚拟机ping不通主机|外网IP连不上虚拟机
参考网址:https://www.lullabot.com/articles/fixing-docker-and-vpn-ip-address-conflicts
问题:虚拟机有个web服务,开启了3000端口监听,VMware已经设置了NAT IP映射,将虚拟机IP:3000映射到宿主机的8888端口,浏览器能够通过l…
虚拟机ping不通主机|外网IP连不上虚拟机
参考网址:https://www.lullabot.com/articles/fixing-docker-and-vpn-ip-address-conflicts
问题:虚拟机有个web服务,开启了3000端口监听,VMware已经设置了NAT IP映射,将虚拟机IP:3000映射到宿主机的8888端口,浏览器能够通过localhost:8888
打开网页,但是不能通过ip:8888
打开网站,并且发现虚拟机不能够ping通主机,折腾了一天,终于发现了问题并解决了。
宿主机的IP为172.21.XX.XX。
虚拟机的IP为192.168.100.128。
1、查看虚拟网卡
首先先用ifconfig
或者ip addr
来查看所有虚拟网卡
6: br-08e37aab0021: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:40:a3:a0:63 brd ff:ff:ff:ff:ff:ff inet 172.21.0.1/16 brd 172.21.255.255 scope global br-08e37aab0021 valid_lft forever preferred_lft forever
8: br-70d04f7b2a8c: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:35:bb:bc:eb brd ff:ff:ff:ff:ff:ff inet 172.19.0.1/16 brd 172.19.255.255 scope global br-70d04f7b2a8c valid_lft forever preferred_lft forever
9: br-86768d2533cf: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:71:49:8e:d7 brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-86768d2533cf valid_lft forever preferred_lft forever
10: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:a0:61:83:8f brd ff:ff:ff:ff:ff:ff inet 172.240.0.1/24 brd 172.240.0.255 scope global docker0 valid_lft forever preferred_lft forever
发现172.21.XX.XX
被ubuntu创建的虚拟网卡给占用了,所以ping宿主机会ping不通。
因此关掉这一个虚拟网卡就行了。
ifconfig xxx down
这样子虚拟机就能够ping主机了。
但这种方法治标不治本,因为下次重启的时候还会有虚拟网卡占用位置,需要解决根本问题。
2、查找根源
经过我的推理,发现docker0是从172.17
开始的,然后一群br-
打头的是在docker0按序排列的,因此怀疑是docker的容器问题,通过后续的验证,确实是这个问题。
查看所有docker的网络。
docker network ls
NETWORK ID NAME DRIVER SCOPE
5a2ae899ce99 bridge bridge local
08e37aab0021 ca bridge local
.......
会发现network id正好和上面br-08e37aab0021
相对应!
通过下面的语句来查看网络声明了哪些子网。
docker network inspect 08e37aab0021
可以看到下面的输出,因此确实是docker的其中一个容器使用了这些网络
"Subnet": "172.21.0.0/24",
"Gateway": "172.21.0.1"
找到这里,已经发现了根源,因此只需要解决问题就行了。
3、解决问题
要解决此问题,我们可以修改docker使用的默认daemon.json文件。
$ vi /etc/docker/daemon.json
{
"default-address-pools" : [ { "base" : "172.240.0.0/16", "size" : 24 }
]
}
上面配置意思:docker所有的服务在地址池 172.240.0.0/16
网段范围划分,每个子网掩码划分为 255.255.255.0
。
因此docker0的地址会是172.240.0.XX
下一个br-
的地址会是172.240.1.XX
以此类推。
4、重启docker
停止所有的容器。
docker stop $(docker ps -a -q)
重启docker服务
systemctl restart docker
删除所有未使用的网络
docker network prune
到这里你再查看所有虚拟网卡
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.32.0.1 netmask 255.255.0.0 broadcast 172.32.255.255 ether 02:42:0c:b7:b6:ef txqueuelen 0 (以太网) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
会发现docker会按照你之前给定的ip开始,如果开启新的docker容器,也是按照地址池的范围来进行设置。
到这里我们就解决了问题,可以互相ping通了,并且浏览器也能通过ip访问到了虚拟机内搭建的网页。
文章来源: blog.csdn.net,作者:晓凹凸曼,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_41109085/article/details/116671530