Docker之网络:容器通信的模式与技术

Docker的网络基础:

默认网络模式,特殊的几种网络模式,容器和宿主机的通信方式,容器与外部主机的通信方式。

一:Docker默认的原生网络:bridge桥接

在bridge模式下,容器没有一个公有IP,只有宿主机可以直接访问。外部主机是不可见的。
容器通过宿主机的NAT规则,才可以访问外网。

yum install -y bridge-utils 下载查看桥接的指令工具

在这里插入图片描述

在这里插入图片描述

这两个例子都是在告诉我们,容器的原生网络,在没有指定模式时,默认是会出现在桥接上,通过docker0这个桥接,与外部进行通信。我们使用ip a查看宿主机的网络设定:可以看到有生成docker0这个桥接:而它的网络IP,是一个私有网段。
在这里插入图片描述

宿主机与容器的通信:通过桥接。
在这里插入图片描述

二:host模式:

host模式同样使用的是原生网桥,通过docker0这个桥接与外部和宿主机进行通信。不同的是,host模式会使用宿主机的主机名。另外,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少了隔离性。

在这里插入图片描述

在这里插入图片描述


三:none模式:

none模式是一种无网络模式,即程序本身不需要与外部通信,只需要自己运行即可。

在这里插入图片描述
使用docker inspect v1 v1为我拉起的这个容器名,来查看容器的配置参数。

在这里插入图片描述


四:Docker以容器名通信:joined模式

容器之间除了使用ip通信外,还可以使用容器名称通信。

joined模式为一种较为特殊的网络模式: 处于joined模式的容器,相当于共用网络。

处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

在这里插入图片描述

在这里插入图片描述


五:link模式:链接容器

link模式主要用于链接两个容器,让其可以一直处于能被互相联系到的状态。

格式: --link :alias
name和id为源容器的name和id,alias为源容器再link下的别名

在这里插入图片描述

link的主要功能不止于此,他还是动态的!

当前的解析:
在这里插入图片描述

在这里插入图片描述
新的解析:
在这里插入图片描述

link动态解析,链接后相当于永久保持联系方式,无论双方怎样变化,联系方式依旧会有。


六:Docker自定义网络:bridge

docker提供了三种自定义网络驱动:

bridge、overlay、macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能。
overlay和macvlan是用于创建跨主机网络的

自定义网络:特点:内含DNS解析,并且可以指定IP地址。原始网桥不可以指定IP

下面为bridge,类似于原生网络的bridge
在这里插入图片描述
在宿主机上使用ip a可以看到:my_net1生成了新的一个虚拟网络设备,所有添加到这个网络中的容器都会连接到这个接口。

在这里插入图片描述
自定义网络是可以为其指定IP的,从而不必跟着网段递增原则。

指定网段和IP:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

桥接到不同网桥上的容器,彼此是不同通信的。docker在设计上就是要隔离不同的network。

理一下:
my_net1:172.18.0.x网段:v1:172.18.0.2:v2:172.18.0.3
my_net2:172.20.0.x网段:v3:172.20.0.2:v4:172.20.0.3在这里插入图片描述
那么如果想让v1和v3,v4也通信,即实现在不同网桥的容器通信:

就需要添加网卡,采用双网卡结构进行通信。

在这里插入图片描述

  docker network connect 网卡 要添加的容器

在这里插入图片描述


七:外网访问容器:端口映射:

一条指令就学会:

  docker run -d --name nginx -p 80:80 nginx.latest
  #-d 代表后台运行 --name为给容器命名 -p为端口映射,冒号前面为宿主机端口,冒号后面为容器端口

外网访问容器用到了docker-proxy和iptables DNAT:
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

先看下方线路的箭头:
外部信息发送到宿主机网卡设备上,docker-proxy识别到请求的是docker容器,于是将请求信息发送给docker桥接docker0,通过docker0宿主机就可以把请求信息发送至docker容器,从而由容器去处理请求。

返回来看上方箭头:

docker容器如果要返回信息到外网时,一定要先通过docker0这个桥接与宿主机进行通信,宿主机通过NAT的方式,将请求发送给自己的网卡,然后传到外部的网络。

要始终铭记一点:docker容器是和宿主机共享内核的,是寄托在宿主机上的。


八:跨主机、容器通信:

跨主机网络解决方案主要有以下:
docker原生的overlay和macvlan
第三方的flannel、weave、calico

macvlan网络方案实现:

它是linux kernel提供的一种网卡虚拟化技术。不需要使用linux bridge,直接使用物理接口即可。

macvlan网络在二层上是隔离的,所以不同马层vlan网络的容器无法通信【不在同一网段】,可在三层上通过网关将macvlan网络连通【路由器】。

实现:两台宿主机都需要双网卡,并且开启网卡混杂模式,docker容器ip需要在同一网段:

 主机1:
 ip link set eth0 promisc on  #开启混杂模式
 ip link set up eth0   #启用网卡【我虚拟网卡是新加的,没有启用,已经启用则不需要这一步】
 ##这里我双网卡新开的一块为eth0,根据自己情况选择。但是macvlan方式会独占网卡。
 ##两台要通信的docker容器所在宿主机都要开启混杂模式
 
 docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o  parent=eth0 mac_net1
 #创建macvlan网络,网段可以任意,我就选择了20段,因为我docker0是17段的。
 #要指定父级网卡,会占用该网卡【eth0】
 #我命名该网络为mac_net1  ,命名无要求,方便识别即可。
 
 docker run -it --name v1 --network mac_net1 --ip 172.20.0.10 ubuntu
 #运行一个使用该网络的容器,指定IP  【因为这是自定义网络】

在这里插入图片描述
主机2:
在这里插入图片描述

在这里插入图片描述

macvlan网络结构:

在这里插入图片描述

在这里插入图片描述
容器接口直接与宿主机网卡连接,不需要在网桥上再添加接口,不需要NAT或者端口映射。所以有一个明显缺点,会占用网卡

但是该技术提供了一种解决办法:使用vlan子接口实现多macvlan网络。
vlan可以将物理二层网络划分4094个逻辑网络,彼此隔离,vlan id取1-4094

在这里插入图片描述


              大大的小小阳
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值