docker0网络详解
1,理解docker0
2,启动tomcat容器:
[root@CentOs ~]# docker run -d -P --name tomcat01 tomcat
14d77b1819d72094eb584d07be1f70499ca8ca9aa5dc75aebb22d0af5400ad40
[root@CentOs ~]#
3,查看容器的内网网络地址:
docker exec -it tomcat01 ip addr
如果报错:
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown
请参考此链接:https://www.cnblogs.com/zypdbk/p/16046636.html
之后会显示下列内容,发现容器启动时会得到一个 eth0@if65 这样的IP地址,这个是docker给自动分配的
[root@CentOs ~]# 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
64: eth0@if65: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defa
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@CentOs ~]#
思考一个问题:linux能不能ping通容器?
答案是可以ping通!
原理:
(1),我们每启动一个docker容器,docker就会给容器分配一个ip,我只要安装了docker,就会有一个网卡docker0。
docker0使用的是桥接模式,使用的技术是veth-pair技术!
再次测试:ip addr
(2)再启动一个容器测试,发现又多了一对网卡
我们发现发现这个容器带来的网卡,都是一对对的,这就是veth-pair技术!
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
正因为有了这个技术,我们把它当做桥梁,连接各种虚拟网络设备
OpenStack、docker容器之间的连接、OVS的连接,都是使用的veth-pair技术
(3)我们测试一下tomcat01和tomcat02是否可以ping通!
如果还是报错:OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
进入容器内部手动安装命令:apt-get install inetutils-ping,之后就可ping通了
结论:容器与容器之间是可以ping通的
绘制一个网络模型图:
网络图小结:tomcat01和tomcat02是共用一个路由器:docker0!
所有容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
5,小结:
docker使用的是Linux的桥接,宿主机中有一个docker容器的网桥:docker0!
docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!
只要删除容器,对应的网桥也就没了!