README:从这里开始涉及到《计算机网络》相关知识
1、理解docker0
# 查看网络
ip addr
2、我们启动一个tomcat:8.0容器,并获取容器内部的ip地址(建议使用tomcat:8.0版本,因为其他的镜像内部的命令可能安装的不全)
现在我们回到我们的服务器重新获取ip地址;会发现多了一行ip,并且与刚刚启动的容器内部的ip相似(图内16 与 17位置相反)
现在我们再来执行一个tomcat:8.0容器;获取ip
回到服务器,发现由多了一行
# 执行完上述操作,可以发现每启动一个新容器都会带来网卡,并且一对对的
# veth-pair 就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
# 因为这个特性,veth-pair 充当一个桥梁,连接各种虚拟网络设备
# OpenStac,Docker容器之间的连接,ovs的连接,都是使用 veth-pair 技术
3、现在尝试从tomcat01 ping tomcat02
# 结论:容器之间可以ping通
容器之间是不能直接通讯的;之所以能ping通,是利用了veth-pair技术虚拟了一个网卡
里面有两种机制:一种是使用路由,将容器地址注册到路由里统一转发,一种是广播
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
Docker 中所有的网络接口都是虚拟的,虚拟的转发效率高!
4、现在我们停止(删掉)一个容器tomcat02
可以看到之前tomcat02的ip删掉了
重启之前停止的tomcat02容器,ip并没有回来,而是生成一个新的虚拟网络接口;
—— --Link
5、现在我想在ping容器的时候不使用它的IP地址,而是容器名
发现ping不通
在新建容器时使用 --link 命令连通其他容器
可以ping通
反向可以ping通吗
ping不通,因为没有配置
tomcat03 能 ping 通 tomcat02 的原因,是因为03在本地配置了一个02的同一网段的IP;就是一个host映射
不建议使用--link;每增加一个容器你都要重新--link一下
建议自定义网络;不建议使用docker0
docker0问题:不支持容器名连接访问
——自定义网络
查看当前docker网络
docker network ls
1、网络模式
bridge :桥接 docker 搭桥(默认)
none :不配置网络
host :和宿主机共享网络
container :容器网络连通(用的少,局限性大)
2、新建一个docker网络,配置这个网段的路由地址
3、使用自定义网络
现在尝试让tomcat01 ping tomcat02
ip和容器名字都能ping通(比--link方便)
创建新的docker网络
# -d 参数指定Docker网络类型,有bridge overlay。其中overlay网络类型用于Swarm mode
docker network create -d bridge my-net
在创建容器时如果不指定网络,默认走docker0网络
容器连接网络(创建容器时就指定自定义网络)
#启动容器 --network 连接自定义网络
docker run -it --rm --name tomcat01 --network my-net tomcat:8.0启动两个容器同时连接同一个网络,进入容器互相ping
通过 connect 将两个独立的网络建立连接
可以看到直接 ping 是不通的,因为两者使用了不同的网段
将tomcat01 与 mynet 网络建立连接,现在tomcat01 可以 ping通 mynet上的任意容器;
但是与 tomcat01 同网络的 tomcat02 却无法ping通 mynet 上的容器
docker network connect my-net tomcat01
结果:一个容器两个IP