关于虚拟机使用docker踩的坑

本文讲述了作者在Windows和CentOS环境下使用Docker时遇到的网络问题,涉及默认网络桥接、容器网络配置、路由表管理和意外状况修复,包括重新建立关联、修改路由表、以及重置docker0网络以解决容器间的通信问题。
摘要由CSDN通过智能技术生成

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的防火墙规则理解

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值