理解docker0
1、问题:docker是如何处理容器网络访问的?
首先,我们随便找一个已经运行容器的地址
再通过Linux去ping一下
我们发现是可以ping通的,说明Linux是可以访问到自己运行的容器的
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只需要安装docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术。
我们去查询Linux所有网卡的时候,发现除了三个上面讲到的,还有两个网卡,这是因为我在这个Linux上运行了两个docker容器,我们每运行一个docker容器,容器内部会有一个对外连接的通道,Linux上会产生一个连接这个通道的网卡,就实现了Linux与容器的连接。
这就是evth-pair ,就是一对的虚拟设备接口,他们都是成对出现的,一端连接这协议,一端彼此连接,evth-pair充当一个桥梁,连接各种虚拟网络设备。
通过这个机制,我们的docker容器之间,就可以相互的访问了。
2、问题:如何通过容器名去连通这个容器
前面我们讲了,每个容器都有一个自己的虚拟网卡,通过这个网卡的ip可以ping通这个容器,那么问题又来了,那没重启一次容器,这个ip都会变化,我们去配置的时候就是否麻烦,每次都要重新更新新的ip去连接这个容器,我们能不能通过容器的名称去连接这个容器呢?
我们只需要在启动的时候,通过link来连通两个容器,那么两个容器之间就可以通过容器名直接ping通了
当然了,这只是单向的,如果我们希望双方都可以相互访问,就需要在两个容器启动时,都需要去link对方。
那这是怎么做到的呢,我们去容器内的cat/etc/hosts看看,发现下面有一个配置,当我们访问Tomcat02的时候,他就会对应的去访问172.18.0.3。所以,这也是为什么当我们要双向访问的时候两个容器都要配置了。
3、自定义网络
查看所有网络
网络模式
bridge:桥接模式 docker(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少!局限很大)
默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少!局限很大)
测试
我们直接启动的命令 其实默认的加了一个–net bridge,就是我们的桥接模式,而这个桥就是docker0.
docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 --net bridge tomcat //这两条命令其实是一样的
docker0特点:默认,域名不能访问,–link可以打通连接。
那我们能不能配置一个自己的docker0来使用
创建一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet //创建一个桥
查看所有的网络
创建成功
当我们创建了自己的网络后,就修复了docker0的缺点,这时我们的容器之间就能直接ping通了