理解docker0

首先清空所有镜像,保证干净环境。

  1. docker rmi -f $(docker images -a -q)

lo: #本机回环地址

eth0: #本机网卡地址

docker0:docker0地址
image.png
docker是如何处理容器网络访问的?

测试

  1. docker run -d -P --name tomcat01 tomcat

image.png
查看容器内部的网络地址

  1. docker exec -it tomcat01 ip addr
  1. [root@localhost ~]# docker exec -it tomcat01 ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  8. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  9. valid_lft forever preferred_lft forever
  10. [root@localhost ~]#

发现容器启动的时候会得到一个docker分配的eth0@if5 网卡。
image.png
linux宿主机能不能ping通容器内的IP地址?

测试

结果:linux主机可以ping通容器内部
image.png
容器内是否可以ping通linux主机?

测试

结果:容器内否可以ping通linux主机。
image.png
docker0相当于家庭中的路由器,负责给网段内的主机分配IP地址。

docker0原理

1.我们每启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker, 就会有一个网卡docker 0 ,采用桥接模式, 使用的技术是ev th-pair技术!
image.png
2.启动容器再次测试ipaddr,发现多了一个网卡。

结论:启动一个容器linux宿主机会多出1个对应的网卡。
image.png
3.容器内和容器外网卡是相互绑定的。

容器内:
image.png
容器外:
image.png
4.再启动一个容器进行测试。
image.png
结论:启动N个容器linux宿主机会多出N个对应的网卡。

  1. #我们发现这个容器带来网卡,都是相互绑定的。
  2. #veth-pair就是一对的虚拟设备接口, 他们都是相互绑定出现的, 一段连着协议, 一段彼此相连
  3. #正因为有这个特性, veth-pair充当一个桥梁, 连接各种虚拟网络设备的
  4. #OpenStak,Docker容器之间的连接,ovS的连接,都是使用veth-pair技术.

容器间通信

测试容器之间是否可以互相通信?

tomcat01
image.png
tomcat02
image.png
测试ping
image.pngimage.png
都能互相ping通。

知识:

可以不进入容器来ping。

  1. docker exec -it tomcat02 ping 172.17.0.2

image.png
结论:容器和容器间是可以互相ping通的!

Docker0网络模型图:
image.png
结论:Docker使用的是Linux的桥接, 宿主机中是一个Dokcer容器的网桥docker0。
image.png
虚拟网卡,Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高! (内网传递文件!)

移除容器查看网卡

移除容器后网卡自动消失

测试
image.png
注:只要删除容器,对应的网卡就会删除!

—link

场景:容器IP变更,不影响通信,以docker容器名称进行ping通信。

启动容器tomcat01和tomcat02
image.png
测试:用容器名称ping测试通信。

  1. docker exec -it tomcat01 ping tomcat02

image.png

解决容器名称互通

如何可以解决?

再启动一个容器tomcat03,增加—link参数,测试通信。

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

image.png
测试用容器名称ping

  1. docker exec -it tomcat03 ping tomcat02

image.png

反向ping测试

[坑]反向ping测试
image.png

docker network究竟

  1. [root@localhost ~]# docker network --help
  2. Usage: docker network COMMAND
  3. Manage networks
  4. Commands:
  5. connect Connect a container to a network
  6. create Create a network
  7. disconnect Disconnect a container from a network
  8. inspect Display detailed information on one or more networks
  9. ls List networks
  10. prune Remove all unused networks
  11. rm Remove one or more networks

image.png
查看docker0 bridge网卡详细信息

docker0网卡

  1. docker network inspect 991190b12345

image.png
容器分配的地址信息
image.png
查看容器tomcat03的详细信息
image.png

docker inspect fc39850d8b31

image.png
拓展:

docker inspect conID|grep tomcat03 -n

image.png
查看tomcat03容器的hosts文件

docker exec -it fc39850d8b31 cat /etc/hosts

image.png
本质探究:—link就是我们在hosts配置文件中增加了1个tomcat02的映射。

不建议使用—link,因为—link需要相互绑定才能互相通信。

docker0问题:不支持容器名互相连接访问!