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 连通! ** 
                
                
                
        
    
 
 |