Docker 网络

75 阅读3分钟

理解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是在内核中 进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容 器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。