狂神说Java -- Docker网络

文章目录

  • 1.理解 Docker0
  • 2.`--link`
  • 3.自定义网络
    • 3.1 测试自定义网络
  • 4.网络连通

1.理解 Docker0

狂神说Java -- Docker网络_第1张图片
问题:Docker是如何处理容器网络访问的??

docker run -d -P --name tomcat01 tomcat

查看容器的内部网络地址 ip addr,发现容器启动的时候会得到一个 28: eth0@if29 ip地址,docker分配的!!

docker exec -it tomcat01 ip addr
狂神说Java -- Docker网络_第2张图片

思考:Linux能不能ping通docker容器内部??

ping 172.17.0.2
狂神说Java -- Docker网络_第3张图片

Linux可以ping通docker容器内部。。。

原理:

  1. 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker就会有一个docker0网卡;
    桥接模式,使用的技术是 veth-pair 技术;
    再次执行 ip addr 发现多了一对网卡:
    狂神说Java -- Docker网络_第4张图片
  2. 再启动一个容器试一试

docker run -d -P --name tomcat02 tomcat
狂神说Java -- Docker网络_第5张图片
发现,这个容器生成的网卡,都是一对一对的;
veth-pair 就是一对的虚拟设备口,都是成对出现的,一段连接着协议,一段彼此相连;
正因为这个特性,veth-pair 充当一个桥梁,连接各种虚拟网络设备;
openstack、Docker容器之间的连接,OVS的连接都是使用了 veth-pair 技术;

  1. 测试tomcat01和tomcat02是否可以ping通
    狂神说Java -- Docker网络_第6张图片
    结论:容器与容器之间是可以相互ping通的!!
    容器之间网络模型:
    狂神说Java -- Docker网络_第7张图片
    结论:tomcat01 和 tomcat02 是公用一个路由器,即 Docker0 !
    所有的容器不指定网络的情况下,都是使用的Docker0路由的,docker 会给容器分配一个默认的可用ip;

小结:
Docker使用的是Linux的桥接技术,宿主机是一个Docker容器的网桥 Docker0
狂神说Java -- Docker网络_第8张图片
注意:Docker中所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件)
只要容器一删除,对应的一对网桥就没有了!

2.--link

思考一个场景:一个微服务,database url = ip ,项目不重启,数据库ip换掉了,希望可以处理这个问题,可以通过名字来访问容器?

tomcat02 想通过直接 ping 容器名(即"tomcat01")来ping通,而不是ip,发现失败了

docker exec -it tomcat02 ping tomcat01
在这里插入图片描述

如何解决这个问题呢? 通过 --link 就可以解决这个网络联通问题了!!!
发现新建的tomcat03可以ping通tomcat02

docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
狂神说Java -- Docker网络_第9张图片

反向能ping通吗? 发现tomcat02不能oing通tomcat03
狂神说Java -- Docker网络_第10张图片
探究:inspect
狂神说Java -- Docker网络_第11张图片
狂神说Java -- Docker网络_第12张图片
其实这个tomcat03就是在本地配置了到tomcat02的映射:
查看hosts 配置,在这里发现原理!
狂神说Java -- Docker网络_第13张图片
本质探究: --link 就是我们在hosts 配置中增加了一个 172.17.0.3 tomcat02 04301beb7fd7(三条信 息都是tomcat02 的) 现在玩Docker已经不建议使用 --link 了!!!
自定义网络,不使用docker0!
docker0问题:不支持容器名连接访问!

3.自定义网络

查看所有的docker网络:

docker network ls
狂神说Java -- Docker网络_第14张图片

网络模式 描述
bridge 桥接(docker默认,自己创建也使用bridge模式)
none 不配置网络
host 和宿主机共享网络
container 容器网络连通,容器直接互联(用的少,局限很大)

3.1 测试自定义网络

之前直接启动的命令 (默认是使用 --net bridge,可省),这个bridge就是我们的docker0,下面两句作用等价:

docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

docker0(即bridge)默认不支持域名访问!--link 可以打通连接,即支持域名访问!

可以自定义一个网络:

--driver bridge				网络模式定义为:桥接
--subnet 192.168.0.0/16		定义子网,范围为:192.168.0.2~192.168.255.255
--gateway 192.168.0.1		子网网关设为:192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
狂神说Java -- Docker网络_第15张图片

查看自定义网络mynet:

docker network inspect mynet
狂神说Java -- Docker网络_第16张图片

新建容器:

docker run -d -P --name tomcat-mynet-01 --net mynet tomcat
docker run -d -P --name tomcat-mynet-02 --net mynet tomcat
在这里插入图片描述

查看网络mynet:
狂神说Java -- Docker网络_第17张图片

ping测试,现在不使用 --link,也可以ping 名字了 :
狂神说Java -- Docker网络_第18张图片
注:在使用自定义的网络时,docker都已经维护好了对应关系,推荐使用这样的网络!

4.网络连通

docker exec -it tomcat01 ping tomcat-mynet-01
在这里插入图片描述

测试打通 tomcat01 – mynet网络:

docker network connect mynet tomcat01

连通之后就是将 tomcat01 放到 mynet 网络下,这就使 tomcat01 容器产生了两个ip地址!
狂神说Java -- Docker网络_第19张图片

tomcat01 容器连通 mynet 网络成功!tomcat02 容器无法 ping 通 mynet 网络!
狂神说Java -- Docker网络_第20张图片
结论:假设要跨网络操作,就需要使用 docker network connect [OPTIONS] NETWORK CONTAINER 连通

你可能感兴趣的:(Docker,Docker)