虚拟机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访问到了虚拟机内搭建的网页。
主机IDEA连接到虚拟机
虚拟机先安装ssh
https://blog.csdn.net/qq_16102655/article/details/85340432
apt-get install openssh-server
查看是否开启
ps -ef | grep ssh
开启服务
service ssh start
/etc/init.d/ssh start
#注释: start 开启; restart 重启; stop 停止
修改配置
vim /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes
说明
PermitRootLogin yes #允许root用户以任何认证方式登录
PermitRootLogin without-password #只允许root用public key认证方式登录
PermitRootLogin no #不允许root用户以任何认证方式登录
然后重启一下
service ssh restart
/etc/init.d/ssh restart
idea连接虚拟机
参考网址:https://blog.csdn.net/jenrey/article/details/80054585
1、idea上面点击如下菜单:Tools—Deployment—Configuration
2、新增一台虚机,输入名称,选择SFTP协议,点击OK
3、输入IP地址、代码路径、账号密码,点击OK
3.1、点击Mappings,然后修改local path和deployment path on server的地址,上面的是宿主机,下面的是虚拟机的,然后就可以右键文件,deployment一下
4、点击Tools—Deployment—Browse RemoteHost
5、右侧会出现对应的代码路径,修改完代码之后,可以点击右上角的upload图标,将代码上传到虚拟机。
6、点击Tools—Start SSH session…可以打开远程界面
主机vscode连接到虚拟机
https://blog.csdn.net/Novak_li/article/details/105035575
vscode免密登录
https://blog.csdn.net/qq_34846662/article/details/99051947
在本机的gitbash下运行,如果本地有ssh的可以跳过
ssh-keygen -t rsa -C "szx741"
虚拟机上也运行同样的命令
ssh-keygen -t rsa -C "szx741"
拷贝公钥到远程服务器上
本地ssh的公钥(id_rsa.pub)拷贝到远程服务器的root目录下,然后
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
Remote Development配置
点击VSCode侧边栏的小屏幕标志再点击齿轮配置你的远程信息
Host 显示在连接选项中的名字,
HostName 你的ssh服务器的地址
User 你登录ssh时的用户名




