Docker之Docker网络讲解

查看虚拟机的网络地址情况:

ip addr

在这里插入图片描述
docker是如何处理容器网络访问:
先启动一个容器:

docker run -d -P --name=tomcat01 tomcat:8.5

在这里插入图片描述
查看容器的网络情况:

docker exec -it tomcat01 ip addr

在这里插入图片描述
先记录 152:eth0if153 地址为172.17.0.2/16

宿主机ping docker容器网络:
在这里插入图片描述
能ping通。

docker内部网络ping宿主机
在这里插入图片描述
能ping通

查看宿主机的网络变化:
在这里插入图片描述
多了153:vethbc3dcd8@if152 虚拟网络。

再启动一个docker容器,tomcat02再看他的网卡情况。
在这里插入图片描述
网卡信息为154: eth0@if155 ip为172.17.0.3

查看宿主机网络。
在这里插入图片描述
新增的网卡信息为:155: veth960899c@if154

容器之间通信:
在这里插入图片描述
能通信。

为什么会出现上述的现象呢,宿主机与docker容器之间的网络是怎样通信的呢?

  1. 我们安装docker时,就会在宿主机上安装一个虚拟网络docker0,用于桥接docker容器与宿主机、docker容器与docker容器之间的通信。docker0相当于一个路由器,使用的技术是evth-pair技术。
  2. 我们每创建一个docker容器,docker就会给docker容器分配一个ip,每创建一个容器,生成的虚拟网卡都是一对的,比如上面的docker容器的 152:eth0if153 和 宿主机的153:vethbc3dcd8@if152是一对网卡。
  3. evth-pair技术就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟设备,OpenStack、docker都是使用evth-pair技术。

在这里插入图片描述
容器直接的通信时以docker0为桥,先把数据发送到docker0,然后docker0有类似与路由表的东西,比如from 152:eth0if153 to vethbc3dcd8@if154 ,然后通过路由表转发到tomcat02.

在这里插入图片描述

自带的网卡docker0的弊端:
有一种情况,我们希望使用容器的名字进行网络的连接,避免ip的更换和ip的难记导致的不方便,比如

docker exec -it tomcat01 ping tomcat02

在这里插入图片描述
tomcat01 ping tomcat02 和 tomcat02 ping tomcat01都ping不通,原因是解析容器名到ip的映射失败。

可以在容器创建时使用–link参数添加容器名到ip的映射。

##--link 容器名
docker run -d -P --name=tomcat03 --link tomcat02  tomcat:8.5

在这里插入图片描述
注意:–link实际上做的是在容器的/etc/hosts文件里面添加了一行记录 ip 容器名 容器id的映射。

弊端:

  • 如果容器间要相互通信,就要在每个容器都要使用–link添加映射,否则单向添加就只能单向通信。
  • 如果容器的数量多了起来,将会是一个映射维护噩梦。

所以现在不推荐使用–link来做映射,我们需要自定义网络,自定义的网络默认就会有容器名映射功能。

自定义网络

查看docker网络列表:

docker network ls

在这里插入图片描述
NETWORK ID:网络的id。
NAME :网络名
DRIVER:网络的模式。
SCOPE:网络的范围。

网络的模式有:主要还是用bridge。

  • bridge:桥接网络,docker默认使用的网络模式。
  • none:不配置网络。
  • host:和宿主机共享网络。
  • container:容器网络连通,用得少,局限性大。
docker run -d -P --name=tomcat01 tomcat:8.5

docker run -d -P --name=tomcat01 -net bridge tomcat:8.5

#上面两个命令效果是一样的,这个就是docker默认使用的网络模式bridge,默认使用docker0网络。

我们可以自定义一个网络,不使用docker0。

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#命令说明
#--driver bridge 设置网络模式为桥接。
#--subnet 192.168.0.0/16 设置子网类型,这是使用/16位,也就是可以拥有接近255*255个子网ip,192.168.0.2 到 192.168.255.255
#--gateway 192.168.0.1  设置网关路由的ip
#mynet  网络名称

在这里插入图片描述
使用该网络创建两个容器:

docker run -d -P --name=tomcat-mynet-01 --net mynet tomcat:8.5

#--net 网络名 : 创建容器时指定使用的网络 

在这里插入图片描述
在这里插入图片描述
自定义的网络已经自动帮我们维护好了映射的关系,建议平时使用。
使用下面命令查看网络的信息。

docker network inspect mynet

在这里插入图片描述
自定义网络的好处:

  1. 我们不用再手动维护容器与ip的映射。
  2. 多个自定义网络之间是隔离的,不同的集群使用不同的网络,保证集群的安全和健康。
网络连通

测试下tomcat01和tomcat-mynet-01之间使用容器名之间是否连通。

在这里插入图片描述

双向ping,失败时必然的,因为mynet的映射表中并没有tomcat01。

使用connect命令进行连接。

#下面命令实际上就是把tomcat01也使用mynet网络。
docker network connect mynet tomcat01

在这里插入图片描述
添加后,正反都能ping成功。

查看mynet信息:
在这里插入图片描述

tomcat01多了一个网卡。
在这里插入图片描述
在这里插入图片描述
宿主机也多了个网卡,这玩意儿总是成对出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值