一、docker0网络演示
1、创建一个centos1容器宿主机网卡状况
docker run -d -it --name centos1 centos
2、 容器网卡状况
docker exec -it centos1 ip a
3、宿主机可以ping容器地址
4、 容器也可以ping宿主机
docker exec -it centos1 ping 172.19.186.130
原理说明:
我们每启动一个docker 容器,docker就会给 容器分配一个IP,只要安装了docker 就会有一个docker0桥接模式,生成一对网卡,例如宿主机是“146: veth134e4e5@if145”,容器中就是145: eth0@if146,使用的技术就是evth-pair技术,就是一对虚拟设备接口,都是成对出现,一段连着协议,一段彼此相连。充当一个桥梁连接各种虚拟网络设备(宿主机就相当于一个路由器起桥接作用)。
以下图为例,两个tomcat通信都需要经过宿主机做桥接访问
二、--link
1、新创建一个容器centos2,这时候通过直接ping centos1(容器名)是不通的
docker run -d -it --name centos2 centos
docker exec -it centos2 ping centos1
2、要想通过容器名的方式让容器互相ping通可以加一个参数--link "容器名"
docker run -d -it --name centos3 --link centos1 centos
docker exec -it centos3 ping centos1
3、那到底为什么可以通过--link可以直接访通容器呢,我们看下容器centos3的hosts列表就可以明白
docker exec -it centos3 cat /etc/hosts
---link就是我们在容器的hosts配置中增加一个hosts解析"容器名到容器ip"
三、自定义网络
1、docker network ls先查看本机的网络类型
上面几种网络说明
2、自定义个一个桥接网络mynet
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
3、创建容器使用我们自己的网络
docker run -d -it --name centos1 --net mynet centos
docker run -d -it --name centos2 --net mynet centos
4、 通过docker network inspect mynet来查看我们自定义的mynet网络情况,可以发现每个容器分配的容器地址是我们自定义网络时定义的网络地址--subnet 192.168.0.0/16
5、 通过我们自定义的网络mynet创建的容器都是能互相通信的
6、我们自定义网络的好处
(1)、不同的集群使用不同的网络,保证集群之间的安全和健康的
四、自定义网络mynet打通到其他网络容器
说明:我们新建的网络mynet和使用docker0网络的两个容器是无法连通的,需要我们使用docker network connect命令进行打通,
注意:两个docker网络之间是不能进行打通的只能网络跟容器进行打通
通过docker network inspect mynet查看详情
可以看到实际上mynet网络直接给centos10创建了一个mynet网络的IP地址,这样centos1、centos2、centos10名义上属于同一个网络,实现可以互相通信