Docker网络
理解docker0
首先清空所有镜像,保证干净环境。
docker rmi -f $(docker images -a -q)
lo: #本机回环地址
eth0: #本机网卡地址
docker0:docker0地址
docker是如何处理容器网络访问的?
测试
docker run -d -P --name tomcat01 tomcat
查看容器内部的网络地址
docker exec -it tomcat01 ip addr
[root@localhost ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]#
发现容器启动的时候会得到一个docker分配的eth0@if5 网卡。
linux宿主机能不能ping通容器内的IP地址?
测试
结果:linux主机可以ping通容器内部
容器内是否可以ping通linux主机?
测试
结果:容器内否可以ping通linux主机。
docker0相当于家庭中的路由器,负责给网段内的主机分配IP地址。
docker0原理
1.我们每启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker, 就会有一个网卡docker 0 ,采用桥接模式, 使用的技术是ev th-pair技术!
2.启动容器再次测试ipaddr,发现多了一个网卡。
结论:启动一个容器linux宿主机会多出1个对应的网卡。
3.容器内和容器外网卡是相互绑定的。
容器内:
容器外:
4.再启动一个容器进行测试。
结论:启动N个容器linux宿主机会多出N个对应的网卡。
#我们发现这个容器带来网卡,都是相互绑定的。
#veth-pair就是一对的虚拟设备接口, 他们都是相互绑定出现的, 一段连着协议, 一段彼此相连
#正因为有这个特性, veth-pair充当一个桥梁, 连接各种虚拟网络设备的
#OpenStak,Docker容器之间的连接,ovS的连接,都是使用veth-pair技术.
容器间通信
测试容器之间是否可以互相通信?
tomcat01
tomcat02
测试ping
都能互相ping通。
知识:
可以不进入容器来ping。
docker exec -it tomcat02 ping 172.17.0.2
结论:容器和容器间是可以互相ping通的!
Docker0网络模型图:
结论:Docker使用的是Linux的桥接, 宿主机中是一个Dokcer容器的网桥docker0。
虚拟网卡,Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高! (内网传递文件!)
移除容器查看网卡
移除容器后网卡自动消失
测试
注:只要删除容器,对应的网卡就会删除!
--link
场景:容器IP变更,不影响通信,以docker容器名称进行ping通信。
启动容器tomcat01和tomcat02
测试:用容器名称ping测试通信。
docker exec -it tomcat01 ping tomcat02
解决容器名称互通
如何可以解决?
再启动一个容器tomcat03,增加--link参数,测试通信。
docker run -d -P --name tomcat03 --link tomcat02 tomcat
测试用容器名称ping
docker exec -it tomcat03 ping tomcat02
反向ping测试
[坑]反向ping测试
docker network究竟
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
查看docker0 bridge网卡详细信息
docker0网卡
docker network inspect 991190b12345
容器分配的地址信息
查看容器tomcat03的详细信息
docker inspect fc39850d8b31
拓展:
docker inspect conID|grep tomcat03 -n
查看tomcat03容器的hosts文件
docker exec -it fc39850d8b31 cat /etc/hosts
本质探究:--link就是我们在hosts配置文件中增加了1个tomcat02的映射。
不建议使用--link,因为--link需要相互绑定才能互相通信。
docker0问题:不支持容器名互相连接访问!