理解daoker0
清空所有环境(即清除所有容器及镜像)
使用ip addr查看ip地址
问题:docker是如何处理容器网络访问的?
启动一个tomcat容器
docker run -d -P --name tomcat01 tomcat
查看容器内部网络地址ip addr
docker exec -it tomcat01 ip addr
发现 容器启动的时候会得到一个eth0@if77 的ip地址,这就是docker分配的!
我们此时再容器外ping下这个容器的ip地址,发现是可以ping的通的
说明linux可以ping通容器内部!
原理:
- 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的是evth-pair技术!
再次测试ip addr
会发现此处的77,76与上面的容器内部网络的76,77是一致的 - 再启动一个容器测试,发现又多了一对网卡
我们发现这个容器带来的网卡,都是一对一对的
evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为这个特性,evth-pair充当一个桥梁,连接着各种虚拟网络设备
OpenStack,Docker容器之间的连接,OVS的连接,都是使用的evth-pair技术
- 我们来测试下tomcat02和tomcat03是否可以ping通
结论:容器和容器之间也是可以互相ping通的
结论:tomcat01和tomcat02是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用ip
小结:
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥Docker0
只要容器删除,对应网桥一对就没了
–link
思考一个问题:
当我们的一个微服务重启后,其ip地址变了,服务名未变,此时我们使用之前的ip地址将两个容器之间进行通信需要手动设置修改ip地址,这样很麻烦并且不符合高可用的原则,我们是否可以通过服务名来ping呢?
我们测试一下:
结论是不可以的
我们使用–link命令重新启动一个tomcat04并pingtomcat03,会发现此时ping通了
此时反向是ping不通的,我们查看本地的网卡
docker network ls
这就是docker0,通过docker network inspect 网卡id查看详情
我们再通过docker inspect tomcat04查看其内详情
发现容器内部Links属性中的值,通过这个,从而可以通过04访问03
不过现在已经不建议使用–link了,而使用自定义网络