关于虚拟机使用docker踩的坑
Win与docker容器网络不通
在家码代码,已读不回的求职环境,本来就闹心,结果放个水回来电脑莫名其妙重启了(虚拟机没挂起),虚拟机重启,docker容器可以正常启动,但发现IDEA启动项目失败,各种连接不通。
——烦
使用下面命令尝试:
ping IP
telent/telnet IP port
虚拟机 IP:192.169.0.111
测试容器ES IP:172.19.0.2 PORT:9200
Win <=≠=> docker
Windows可以ping通192.169.0.111 ,但访问192.169.0.111:9200不通
CentOs <===> docker
虚拟机telnet 172.19.0.2 9200可以,且容器直接互通
问题出在192.169.0.111(宿主机) =≠=> 172.19.0.2(docker容器)
连夜狂补了一下docker和Linux网络
1 docker容器网络
我们在使用docker创建容器,不指定networks,默认使用的是docker0网卡,网桥为bridge。
通过
docker network create mydevnet
或者 docker-compose 中定义
version: '2.2'
services:
elasticsearch:
image: elasticsearch:7.17.7
container_name: elasticsearch
networks:
- mydevnet
...
networks:
mydevnet:
external: true
# 注意这里,也有可能出问题
创建的自定义网桥,网桥默认bridge。查看命令
docker network ls
docker network inspect mydevnet
查看自定义mydevnet
[
{
"Name": "mydevnet",
...
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
...
"Containers": {
"*********id********": {
"Name": "elasticsearch",
"EndpointID": "******id********",
"MacAddress": "*:*:ac:*:*:*",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
...
}
]
! ! 注意这里网关以及IP
2 网络路由
网卡之间或容器之间,再或容器和外界之间,如果想互通,使用的是路由表。路由表就是串联不同网络的关键。如果路由表清空,那么路由表管理的网络之间就无法通信了。主机都有一个本地路由表,所以宿主机通过这个路由表可以处理宿主机上的多个网卡之间的流量的转发。从路由转发角度看,宿主机还是一个路由器。(引自docker容器网络不通的深度大分析)
route -n
命令查看路由表
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-123456789
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
到这里我发现问题了,我的路由表因为电脑重启可能的未知原因,导致172.19.0.0的目的网络已经没有了。所以无论怎么尝试重装容器还是重启docker都没有用。
——解决
1 重新建立关联
docker network disconnect mydevnet elasticsearch
docker network connect newnet elasticsearch
建新子网,重新关联容器,重启容器
2 修改路由表
理论应该是可以修改,但因为route change 命令不懂,尝试了一下,并没有成功,有成功的同学记得踢一下。
另外在这期间各种试错后,执行 systemctl restart network 重置虚拟机网络之后,虚拟机连不到外网了,这里是根据解决ContOS7 开启桥接模式后无法联网 解决的
——意外状况
解决完问题,挂起虚拟机,查找上述为什么路由表自定义网卡没有的原因,结果再次打开虚拟机容器又连不上,route -n 之后,发现路由表除了docker0网卡之外,自定义的 br- 开头的全都不在了,查了半天,发现有两种解决办法:
1 修改NetworkManager(待)
#
vim /etc/NetworkManager/NetworkManager.conf
# 添加
[keyfile]
unmanaged-devices=interface-name:docker*;interface-name:veth*;interface-name:br-*;interface-name:vmnet*;interface-name:vboxnet*
# 重启NetworkManager
systemctl restart NetworkManager
这种是参考Can’t connect to docker after resuming VM的,试了一下确实管用,网上还有说是直接把NetworkManager服务给关了,但还是疑惑,总觉得还会出问题或者出现其他的问题,所以决定重置docker网络。
2 重置docker0 网络
#停止docker服务
systemctl stop docker
#删除docker0
ip link set dev docker0 down
brctl delbr docker0
#重启docker服务
systmectl start docker
或
# kill进程
pkill docker
# 清除iptables nat表规则
iptables -t nat -F
ifconfig docker0 down
## 删除docker0 网卡
brctl delbr docker0
docker -d
systemctl restart docker
重置之后,一切都好了,连之前消失的 br- 也都出现了。。。
一 切 都 好 了。。。
关于一些命令
# 服务器当前的内存使用情况
free -h
# Docker容器占用的存储空间
docker system df
# 看到正在使用的容器或镜像数量
docker system df -v
#清理不再使用的镜像、容器和数据卷,达到释放空间的效果(正式服慎用),其中-a是清理所有未使用到的资源,–volumes是可以清除未使用到的数据卷
docker system prune -a --volumes
#批量启动全部容器
docker start $(docker ps -a | awk '{ print $1 }' | tail -n +2)
#批量启动 如 redis_ms-redis-**集群
docker start $(docker ps -aq --filter "name=redis_ms-redis")
因为是自己开发环境,防火墙是关闭的,后期需要了解firewall管理下的docker的防火墙规则理解。