Administrator
发布于 2021-09-06 / 15 阅读
0
0

9、Docker网络

README:从这里开始涉及到《计算机网络》相关知识

参考文章:https://yeasy.gitbook.io/docker_practice/network/linking?__cf_chl_captcha_tk__=pmd_UlkzuURKsbIe5wQerbi_CMPTl3RKGJcNPFh7mM9uYAc-1630924012-0-gqNtZGzNAuWjcnBszQvl


  • 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


评论