理解Docker0

三个网络:
在这里插入图片描述

问题: docker是如何处理容器网络访问的?

在这里插入图片描述
启动一个tomcat容器

docker run -d -P --name tomcat01 tomcat

查看容器的内部网络地址ip addr,发现容 器启动的时候会得到一个 eth0@if114 ip地址, docker分配的!

docker exec -it tomcat01 ip addr

在这里插入图片描述
思考:liunx能不能ping通容器内部?
在这里插入图片描述
可见linux可以Ping通容器内部

原理:
1、我们每启动一个docker容器, docker就会给docker容器分配一个ip ,我们只要安装了docker ,就会有一个网卡docker0。
桥接模式,使用的技术是evth-pair技术!
再次测试Linux的 ip addr
在这里插入图片描述
2.再启动一个容器测试,发现又多了一对网卡
在这里插入图片描述
在这里插入图片描述

我们发现这个容器带来网卡,都是一对对的
evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,evth-pair充当一个桥梁,连接各种虛拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术

3.我们来测试下tomcat01和tomcat02是否可以ping通

在这里插入图片描述
结论:容器和容器之间也是可以相互ping通的
网络模型图:
在这里插入图片描述
结论: tomcat01 和tomcat02公用的一个路由器, docker0。
所有的容器不指定网络的情况下,都是docker0路由的, docker会给我们的容器分配一个默认的可用IP
在这里插入图片描述
Docker使用的是Linux的桥接,宿主机中是一一个Dokcer容器的网桥docker0。
只要容器删除,对应网桥一对就没了!

–link

思考:我们是否可以使用容器名来进行访问?
在这里插入图片描述
可见,直接使用容器名,容器间是不能ping通的

解决:通过–link可以解决网络连通问题

docker run -d -P --name tomcat03 --link tomcat02 tomcat

在这里插入图片描述
存在问题:反向不能Ping通
在这里插入图片描述
查看docekr网络:
在这里插入图片描述
进入bridge内部:

docker network inspect b099380675b1

在这里插入图片描述
查看tomcat03 的hosts配置,

docker exec -it tomcat03 cat /etc/hosts

在这里插入图片描述
本质探究: --link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02
我们现在玩Docker已经不建议使用-link 了!|

自定义网络!不适用docker0 !
docker0问题:他不支持容器名连接访问!

自定义网络

查看所有网络

docker network ls

在这里插入图片描述
网络模式
bridge :桥接docker (默认,自己创建也使用bridge模式)
none:不配置网络
host :和宿主机共享网络
container :容器网络连通! ( 用的少!局限很大)

测试

先将容器全部清除

我们直接启动的命令 - -net bridge(默认), 而这个就是我们的docker0
以下两条命令相等:

docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

docker0特点:默认, 域名不能访问,–1ink可 以打通连接!

我们可以自定义一个网络:

查看命令:
在这里插入图片描述
在这里插入图片描述
自定义一个网络:
–driver bridge
–subnet 192.168. 0.0/16
–gateway 192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

在这里插入图片描述
查看网络信息:

docker network inspect mynet

在这里插入图片描述
现在我们的网络已经创建好了,
使用我们自己创建的网络来启动容器:

docker run -d -P --name tomcat-net-01 --net mynet tomcat

docker run -d -P --name tomcat-net-02 --net mynet tomcat

再次查看网络信息
在这里插入图片描述

使用我们自定义的网络创建的容器之间可以通过容器名字相互ping通

docker exec -it tomcat-net-01 ping tomcat-net-02

在这里插入图片描述

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
redis -不同的集群使用不同的网络,保证集群是安全和健康的
mysql -不同的集群使用不同的网络,保证集群是安全和健康的

网络连通

再创建两个默认网络下的容器 tomcat01和tomcat02
在这里插入图片描述
问题:默认docker0网络下的容器与我们自己创建的网络下的容器之间能否ping通?
在这里插入图片描述
可见不同网络下的容器之间是不能ping通的

我们可以将容器与网络之间进行连通
命令:

docker network connect

在这里插入图片描述
测试打通tomcat01 一mynet

docker network connect mynet tomcat01

在这里插入图片描述
在这里插入图片描述

可见连通之后就是将tomcat01 放到了mynet 网络下,然后就可以ping通了
在这里插入图片描述

一个容器两个ip地址!
类似于阿里云服务:中的公网ip和私网ip
结论:假设要跨网络操作别人,就需要使用docker network connect连通!。。。。|

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐