三个网络:
启动一个tomcat容器
docker run -d -P --name tomcat01 tomcat
查看容器的内部网络地址ip addr,发现容 器启动的时候会得到一个 eth0@if114 ip地址, docker分配的!
docker exec -it tomcat01 ip addr
思考:liunx能不能ping通容器内部?
可见linux可以Ping通容器内部
原理:
1、我们每启动一个docker容器, docker就会给docker容器分配一个ip ,我们只要安装了docker ,就会有一个网卡docker0。
桥接模式,使用的技术是evth-pair技术!
再次测试Linux的 ip addr
2.再启动一个容器测试,发现又多了一对网卡
我们发现这个容器带来网卡,都是一对对的
evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,evth-pair充当一个桥梁,连接各种虛拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术
3.我们来测试下tomcat01和tomcat02是否可以ping通
结论:容器和容器之间也是可以相互ping通的
网络模型图:
结论: tomcat01 和tomcat02公用的一个路由器, docker0。
所有的容器不指定网络的情况下,都是docker0路由的, docker会给我们的容器分配一个默认的可用IP
Docker使用的是Linux的桥接,宿主机中是一一个Dokcer容器的网桥docker0。
只要容器删除,对应网桥一对就没了!
思考:我们是否可以使用容器名来进行访问?
可见,直接使用容器名,容器间是不能ping通的
解决:通过–link可以解决网络连通问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat
存在问题:反向不能Ping通
查看docekr网络:
进入bridge内部:
docker network inspect b099380675b1
查看tomcat03 的hosts配置,
docker exec -it tomcat03 cat /etc/hosts
本质探究: --link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02
我们现在玩Docker已经不建议使用-link 了!|
自定义网络!不适用docker0 !
docker0问题:他不支持容器名连接访问!
查看所有网络
docker network ls
网络模式
bridge :桥接docker (默认,自己创建也使用bridge模式)
none:不配置网络
host :和宿主机共享网络
container :容器网络连通! ( 用的少!局限很大)
测试
先将容器全部清除
我们直接启动的命令 - -net bridge(默认), 而这个就是我们的docker0
以下两条命令相等:
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
docker0特点:默认, 域名不能访问,–1ink可 以打通连接!
我们可以自定义一个网络:
查看命令:
自定义一个网络:
–driver bridge
–subnet 192.168. 0.0/16
–gateway 192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
查看网络信息:
docker network inspect mynet
现在我们的网络已经创建好了,
使用我们自己创建的网络来启动容器:
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
再次查看网络信息
使用我们自定义的网络创建的容器之间可以通过容器名字相互ping通
docker exec -it tomcat-net-01 ping tomcat-net-02
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
redis -不同的集群使用不同的网络,保证集群是安全和健康的
mysql -不同的集群使用不同的网络,保证集群是安全和健康的
再创建两个默认网络下的容器 tomcat01和tomcat02
问题:默认docker0网络下的容器与我们自己创建的网络下的容器之间能否ping通?
可见不同网络下的容器之间是不能ping通的
我们可以将容器与网络之间进行连通
命令:
docker network connect
测试打通tomcat01 一mynet
docker network connect mynet tomcat01
可见连通之后就是将tomcat01 放到了mynet 网络下,然后就可以ping通了
一个容器两个ip地址!
类似于阿里云服务:中的公网ip和私网ip
结论:假设要跨网络操作别人,就需要使用docker network connect连通!。。。。|