在学Docker网络之前,我们先来看一下一个安装了Docker的linux服务器中的网卡有哪些
[root@iZbp1csuqi4s80m3g73awpZ ~]# ip addr
- 这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,当然也会遇到没有 IP 地址的情况。
一、什么是Docker0
Docker启动的时候会在主机上自动创建一个docker0网桥,实际上是一个Linux网桥,所有容器的启动如果在docker run的时候没有指定网络模式(-net这个参数)的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。
也就是说,我们只要安装了docker,就会有一个叫 docker0虚拟网卡,我们每启动一个docker容器, docker就会给容器分配一个ip,然后容器内如果要互相通讯,都需要通过Docker0这个网桥。
二、验证
(1)验证宿主机能ping通容器吗
现在我们来启动一个tomcat。
docker run -it --name tomcat01 tomcat
可以看到多了一个217的虚拟网卡
这里如果提示
OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown
进入容器执行 下载ip命令所需依赖
apt-get update & apt-get install -y iproute2
进入容器查看该容器的ip地址为172.17.0.2。
然后通过宿主机ping 172.17.0.2这个内网地址,发现是可以ping通的,因为在宿主机有个217的虚拟网卡,容器内部有个216的虚拟网卡,而216和217又是绑定的,所以他两能互相访问,所使用的技术veth-pair
简单的介绍一下:veth-pair
它其实就是一对虚拟机设备接口,它们是成对出现的,通过一种协议彼此相连,正因为有这个特性,它可以充当一个桥梁,连接各种虚拟网络设备
(2)验证容器与容器能否ping通
再次启动一个tomcat
docker run -it --name tomcat02 tomcat
宿主机执行ip addr ,发现多了一个虚拟网卡
查看tomcat02的ip
然后进入tomcat01,ping tomcat02,发现是可以ping通的
通过上图也可以发现Docker0其实充当了一个路由的存在,Tomcat01和Tomcat02是共用这个路由器,所有容器在不指定网络的情况下,都是通过docker0路由
三、总结
当Docker进程启动之后,它会配置一个虚拟的网桥叫docker0在宿主机上。这个接口允许Docker去分配虚拟的子网给即将启动的容器们。这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点。Docker容器启动后,将创建一个新的虚拟接口并分配一个网桥子网内的IP地址。这个IP地址嵌在容器内网络中,用于提供容器网络到宿主机docker0网桥上的一个通道,这样就能相互访问了