ip addr查看当前linux虚拟机的ip地址
此时有三个网络,docker是如何处理网络之间的访问的呢?
启动tomcat容器,查看其ip地址
当前linux主机可以ping通当前容器的内部
原理
1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker就会有一个网卡docker0
这里使用的是桥接模式,使用的是evth-pair技术
我们发现这个容器带来的网卡,都是一对出现的
evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备
创建tomcat01和tomcat02,测试发现两个容器之间可以相互ping通
结论:
tomcat01和tomcat02共用一个路由器docker0
所有的容器不指定网络的情况下,都是docker0做路由的
docker会给我们的容器分配一个默认的可用IP
小结
Docker使用的是Linux的桥接,宿主机中是docker容器的网桥docker0
Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥就没了
Docker --link :添加主机名和ip的映射
docker间常常需要互联或者说通信,比如后台程序访问数据库容器,一般是需要ip+端口的形式,然而ip是经常会变化的 ,docker中采用link来为容器起个名字 ,以后访问只要名字+端口就行了 ,这样减少了ip访问下,ip常发生变化而导致的问题
操作概述,在创建第二个容器时,将第一个容器link到第二个容器中,这样第二个容器访问第一个容器时利用名字就能访问
1.在第二个容器创建时添加一个link,如下面在创建了第一个容器test1之后创建第二个容器时:
docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600 ;done"
2.进入第二个容器内部
docker exec -it test2 /bin/sh
输入ping test1----->发现是可通的
但注意进入test1 ping test2是不行的,原因在于link 具有方向性 ,即左边的可以ping 右面的名字
本质: 在test2容器的/etc/hosts文件中添加了172.18.0.3 test1 ,即将ip映射到了test1这个域名上
现在–link已经不建议使用了
–link命令指定别名
上面–link没有为当前容器起一个名字,那么默认ip映射到test1这个容器名上,访问的时候是ping test1
docker run -d --name test --link mysql:db -p xxx:xxx test
其中mysql是指一个name为mysql的容器,db为为其指定的别名
然后在test容器中就可以使用db来代替ip来访问mysql了
自定义网络
查看所有的docker网络 — docker network ls
docker的网络模式
docker network --help 查看网络相关的命令
自定义网络
# 我们直接启动命令,有默认的参数,只是省略掉了 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
docker0的特点 :默认的,域名不能访问,–link可以打通连接
创建自定义网络命令:docker network create
docker network create --driver bridge --subnet 192.168.1.0/16 --gateway 192.168.1.0 mynet
解析:
--driver bridge 表示使用桥接模式
--subnet 192.168.1.0/16 表示子网ip 可以分配 192.168.1.2 到 192.168.255.255
--gateway 192.168.1.0 表示网关
mynet 表示网络名
查看自己定义的网络相关信息
使用自定义网络中的网桥创建容器
这里启动两个容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
再次使用 docker network inspect mynet 查看网络信息
测试ping IP及name是否都可以ping通:
测试结果如下:
使用自定义网络 ping 容器的 ip 地址和名称都能 ping 通(不使用–link也可以ping通名字)
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
如何打通不同网段,实现连接
打通的是容器和对应的网卡,而不是打通网卡和网卡
查看相关帮助
在不指定网络的情况下再次启动两个容器,即默认的docker0
在不打通的情况下进行测试
结果:发现ping不通
测试
测试tomcat01 连通 mynet
案例实践:docker network connect
[root@web ~]# docker network connect mynet tomcat01
[root@web ~]# docker inspect mynet
连通之后就是将tomcat01 放到了mynet网络下
官方:一个容器两个ip地址;与阿里云服务,公网ip 私网ip类似
tomcat01 连通 tomcat-net-01
**结论:假设要跨网络操作别人,就需要使用docker network connect 连通! **
|