Docker0网络及原理探究
本篇收录至Docker专栏,持续更新,欢迎访问😊
个人观点:Docker网络通信在容器编排、集群部署中具有举足轻重的地位,(玩docker不懂docker0那就……玩不透哇👀)本篇分析Docker网络,并通过启动几个容器来探究Docker网络及容器通信,帮助读者理解一下😊。
1、Docker0
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。
2、清空所有镜像
如果是初学者,还不是很了解docker0的情况下,建议清空所有镜像,创造一个比较干净的容器网络环境,更加清晰,有助于学习docker0😃
| 1 | # 1. 查看运行的容器 | 
3、查看网卡信息
- 先了解一下ip addr命令
| 1 | ip addr | 
- 获取当前网卡ip地址和mac地址
| 1 | [root@--- ~]# ip addr | 
下面通过docker启动几个容器来探究一下Docker网络👇
4、运行容器之后,再次查看网卡信息
安装Docker时,它会自动创建三个网络,默认bridge网桥(创建容器默认连接到此网络)、 none 、host
4.1、运行mysql01, centos01, centos02容器
- 启动时,docker默认的bridge网桥,docker0给容器服务自动分配ip
| 1 | docker run -it --name mysql01 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7 | 
4.2、查看ip、mac地址信息
- 可以看到上面启动的三个容器服务的mac信息
| 1 | $ ip addr | 
4.3、查看docker网络
| 1 | [root@--- ~]# docker network ls | 
4.4、查看默认bridge网桥(docker0)
| 1 | [root@--- ~]# docker network inspect feafa30d4051 | 
4.5、测试容器通信
此时,进入
centos01容器,pingmysql容器的ip可以ping通,但是ping不通容器名 ❗
| 1 | docker exec -it cb1922b95b93 /bin/bash | 
如下图👇
5、容器通信原理
- 只要我们安装了docker,就会有一个网卡docker0(相当于一个路由器),每启动一个docker容器,docker都会给docker容器分配一个ip(连接路由器的终端,同一网段下终端可以互相通信), 
- 通过 - evth-pair技术实现,- evth-pair就是一对虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连,- evth-pair充当一个桥梁,连接各种虚拟网络设备。
- Docker网络使用的是 - Linux桥接,宿主机是docker容器的网桥,docker0,最多分配65535个
- 删除容器之后,虚拟网卡就自动消失了。(虚拟网卡传递效率高!) 
启动容器不设置网络,容器ip由docker0自动分配情况下,容器间的通信,要经过evth-pair技术实现,并不是直连的。(跟计算机网络通信类似,分层模型,TCP/IP协议数据报封装解封装)
5.1、结论
- tomcat01,- tomcat02是共用的一个路由器,docker0
- 所有的容器启动时,如果不指定网络的情况下,都是docker0路由的。65535 
最后
上面docker0不支持容器名连接访问,容器通信只可以通过容器ip通信,docker也无法保证容器重启后的IP地址不变,所以更好的方式是通过别名进行互联,下篇继续讲解怎么通过别名进行容器通信,😊😊。
🌹 持续更文,关注我,你会发现一个踏实努力的宝藏前端😊,让我们一起学习,共同成长吧。
🎉 喜欢的小伙伴记得点赞关注收藏哟,回看不迷路 😉
🎁 欢迎大家评论交流, 蟹蟹😊




