理解Docker0
准备工作:清空所有的容器,清空所有的镜像
docker rm -f $(docker ps -a -q) # 删除所有容器
docker rmi -f $(docker images -qa) # 删除全部镜像
测试获取当前的 IP 地址
查看本地IP ip addr
lo # 本机回环地址
eth0 # 阿里云的私有IP
docker0 # docker网桥
安装Kibana的问题:Kibana得指定ES的地址!或者我们 实际场景中,我们开发了很多微服务项目,那些微服务项目都要连接数据库,需要指定数据库的url地 址,通过ip。但是我们用Docker管理的话,假设数据库出问题了,我们重新启动运行一个,这个时候数 据库的地址就会发生变化,docker会给每个容器都分配一个ip,且容器和容器之间是可以互相访问的。 我们可以测试下容器之间能不能ping通
启动tomcat01
docker run -d -P --name tomcat01 tomcat
查看 tomcat01 的 ip 地址,docker 会给每个容器都分配一个 ip
docker exec -it tomcat01 ip addr
linux 服务器是否可以 ping 通容器内的 tomcat
ping 172.17.0.2
可以 ping 通!
原理
每一个安装了 Docker 的 linux 主机都有一个 docker0 的虚拟网卡。这是个桥接网卡,使用了 veth-pair 技术
1、再次查看主机的 ip addr
本来有三个网络,我们在启动了个 tomcat 容器之后,多了一个 “11” 的网络!
2、每启动一个容器,linux主机就会多了一个虚拟网卡
启动了一个tomcat01,主机的ip地址多了一个 11: veth9dc8b7f@if10
在tomcat01容器中查看容器的ip是 10: eth0@if11
再启动一个tomcat02观察
docker run -d -P --name tomcat02 tomcat
发现linux主机上又多了一个网卡 13: veth9c3d925@if12
下tomcat02的容器内ip地址是 12: eth0@if13
观察现象:
tomcat --- linux主机 veth9dc8b7f@if10 ---- 容器内 eth0@if11
tomcat --- linux主机 veth9c3d925@if12 ---- 容器内 eth0@if13
只要启动一个容器,就有一对网卡
- veth-pair 就是一对的虚拟设备接口,它都是成对出现的。
- 一端连着协议栈,一端彼此相连着。
- 正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。
- “Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络 结构,比如 OpenStack Neutron。
3、来测试下 tomcat01 和 tomcat02 容器间是否可以互相 ping 通
docker exec -it tomcat02 ping 172.17.0.3
结论:容器和容器之间是可以互相访问的
4、网络模型图
结论:
- tomcat1 和 tomcat2共用一个路由器。他们使用就是docker0。
- 任何一个容器启动 默认都是docker0网络。
- docker 默认会给容器分配一个可用 IP。
小结
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据 Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并 让他们彼此联通(这样一对接口叫veth pair)
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中 进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容 器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。