在学Docker网络之前,我们先来看一下一个安装了Docker的linux服务器中的网卡有哪些

[root@iZbp1csuqi4s80m3g73awpZ ~]# ip addr

  • 这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,当然也会遇到没有 IP 地址的情况。

docker 实例mac地址 docker0 ip_docker


一、什么是Docker0

Docker启动的时候会在主机上自动创建一个docker0网桥,实际上是一个Linux网桥,所有容器的启动如果在docker run的时候没有指定网络模式(-net这个参数)的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。

也就是说,我们只要安装了docker,就会有一个叫 docker0虚拟网卡,我们每启动一个docker容器, docker就会给容器分配一个ip,然后容器内如果要互相通讯,都需要通过Docker0这个网桥。

二、验证

(1)验证宿主机能ping通容器吗

现在我们来启动一个tomcat。

docker run -it --name tomcat01 tomcat

docker 实例mac地址 docker0 ip_linux_02

可以看到多了一个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

docker 实例mac地址 docker0 ip_tomcat_03

进入容器查看该容器的ip地址为172.17.0.2。

docker 实例mac地址 docker0 ip_docker_04

  然后通过宿主机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 ,发现多了一个虚拟网卡

docker 实例mac地址 docker0 ip_linux_05

查看tomcat02的ip

docker 实例mac地址 docker0 ip_centos_06

然后进入tomcat01,ping tomcat02,发现是可以ping通的

docker 实例mac地址 docker0 ip_docker 实例mac地址_07

docker 实例mac地址 docker0 ip_centos_08

 通过上图也可以发现Docker0其实充当了一个路由的存在,Tomcat01和Tomcat02是共用这个路由器,所有容器在不指定网络的情况下,都是通过docker0路由

三、总结

    当Docker进程启动之后,它会配置一个虚拟的网桥叫docker0在宿主机上。这个接口允许Docker去分配虚拟的子网给即将启动的容器们。这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点。Docker容器启动后,将创建一个新的虚拟接口并分配一个网桥子网内的IP地址。这个IP地址嵌在容器内网络中,用于提供容器网络到宿主机docker0网桥上的一个通道,这样就能相互访问了