容器的共享网络模型

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在本实验介绍Docker中的共享网络模型

容器的共享网络模型

1. 创建相关实验资源。

  1. 在体验实验室,单击创建资源。
  2. (可选)在实验室⻚⾯左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、⽤户信息等)。 说明:资源创建过程需要1~3分钟。


2. Host网络模型简介

在上一个实验中我们学习了docker中的bridge网络模式。在bridge网络模式下,容器和宿主机网络隔离。不同网络下的容器具有不同的网络地址,这种网络模式的优点是架构比较清晰,资源具有必要的隔离。

但是这种架构的缺点是容器和容器,容器和宿主机之间的网络通讯的数据包需要在不同的虚拟网卡之间传输。这种传输需要通过操作系统的底层驱动,在网络数据量大的时候会对系统资源造成消耗。同时在当容器和外网互相访问时,需要使用NAT/DNAT修改网络数据包的地址字段。这也会对系统资源造成消耗,并且对容器的网络吞吐造成影响。

因此当我们需要在容器中部署对外网网络吞吐量很大,或者对网络延迟比较敏感的服务时,采用Bridge模式并不是最好的选择,这种情况下我们可以选择Host网络模式

  1. Host网络模式

首先我们来看Docker中的Host网络模式的架构。在Host网络模式下,容器在创建之时,并不会创建虚拟网卡。而是共享使用宿主机的默认网卡,因此Host模式下,容器网卡的网络地址和宿主机网卡的网络地址一致。

在了解了Host网络模式之后,我们来看如何创建Host模式的容器。在上一个实验中我们学过可以通过docker network ls命令查看Docker网络。细心的同学可能会观察到,在Docker的默认网络中就包含一个host网络。这个网络的驱动使用的就是host。

因此当我们创建创建容器时,只需要使用--network=host参数,加入这个网络容器就会设置成Host网络模式。

docker network ls -f 'name=host'
docker run -itd --name host1 --network=host busybox
  1. 获得宿主机网卡信息

接下来我们来验证Host网络模式中的容器和宿主机的网络设置。我们首先再宿主机中使用ip addr命令查看网卡IP。在宿主机中我们可以找到默认网卡eth0,和docker默认Bridge网络docker0

ip addr

  1. 获得容器网卡配置

接下来我们通过docker exec在容器中执行ip addr。我们会发现容器和宿主机的网卡完全一致。我们尝试ping docker0网卡,发现也可以ping通。这也就验证了Host网络模式下,容器的网卡和宿主机属于共享状态。

docker exec host1 ip addr
ping [docker0 IP] -c1


3. Host模型的python案例

在上一个小节中我们学习了Host网络模型的基本用法,在本小节中我们来看一个Host共享网络的案例。我们创建一个Python容器并启动一个Http服务。然后将容器连接到Host网络。然后再上一个小节中创建的host1容器中访问Python服务。

  1. 创建Host容器

Host网络模型和Bridge模型一样,支持多个容器接入。我们创建一个接入Host网络的Python容器host2,并在创建容器的时候通过bash -c "python -m http.server 端口号"启动python内置http服务的命令。

docker run -itd --name host2 --network=host python \
bash -c "python -m http.server 8000"

  1. 查询网络端口

在Host网络模型中,为了保证网络传输效率,宿主机和所有的容器都使用了相同的网卡配置。因此在Host模型中,无论是在宿主机中或是容器中启动的服务绑定了端口。端口占用会对宿主机和所有容器生效。

接下来我们在宿主机中也启动一个python内置的http服务,服务绑定端口8001。然后再容器和宿主机中通过netstat命令查看端口占用情况。会发现无论是宿主机还是容器host1,端口8000和8001都被占用了。

nohup python3 -m http.server 8001 &
netstat -tunple | grep 800
docker exec host1 netstat -tunple | grep 800

  1. 访问容器服务

由于容器和宿主机都绑定了相同的网卡,因此即使是在服务中启动的服务,也不需要端口映射就可以在宿主机中访问。Host模式的这种设计简化了容器服务的发布流程,同时也提高了网络吞吐的效率。不过需要注意的是,由于容器和宿主机共享了网卡。因此我们要小心的分配宿主机和容器中服务的端口,以避免端口绑定冲突。

curl 127.0.0.1:8000 | head -n1


4. Container网络模型

在上面两个小节中我们接了Docker中的一种共享网络模型Host。这种模式主要用于灵活的在宿主机网卡上发布应用,或者提高网络吞吐效率。除了这种共享网络模式之外,Docker还提供了另一种共享网络模式Container。接下来我们来学习这种网络模式的特点和用法。

  1. 创建容器

Host网络模式下,新创建的容器共享使用宿主机的网卡。而在Container网络模式和Host模式类似,只不过新创建的容器,共享的是另一个容器的网卡

当我们希望创建一个使用Container网络模式的容器时,我们需要在docker run中使用--network container:[已有容器名]的参数格式。

docker run -itd --name container1 busybox
docker run -itd --name container2 --network=container:container1 busybox

  1. 查看地址

Container网络模型的容器创建完毕后,我可以在两个容器中使用ip addr命令查看网卡信息,会发现两块网卡的信息完全一致

docker exec container1 ip addr
docker exec container2 ip addr

  1. 创建python服务

接下来我们再利用这块网卡创建一个名为python1的python容器,并在容器上启动一个python的http服务。由于docker run命令的参数较长,在此我们可以使用\分割符将命令分成几行输入。

docker run -itd --name container3 \
--network=container:container1 python \
bash -c "python -m http.server 8000"

  1. 访问服务

在服务启动后,由于三个容器使用了相同的网卡,因此我们在container1容器使用127.0.0.1网络地址就可以访问到另一个容器中的服务。

由于在busybox容器中没有curl命令,这种情况下我们可以使用nc命令来访问http服务。具体访问命令解释如下

  1. 首先我们使用exec命令进入容器的控制台。
  2. 在控制台中我们使用printf命令构建一个HTTP访问请求
  3. 然后通过|符号将请求发送给nc命令
  4. 在使用nc命令时,我们将IP和端口作为两个参数传入

执行后,命令返回了HTTP应答的全部信息。这也就验证了在container模型下,容器可以向访问本机服务一样,跨容器进行服务访问。

docker exec -it container1 sh
printf "GET / HTTP/1.1\r\n\r\n" | nc 127.0.0.1 8000

执行exit命令退出容器控制台。


5. Container模型的redis案例

上一个小节中我们学习了Container模式的基本用法。相比较DNS而言,使用这种方式网络地址管理会更加的方便,同时由于不同的容器共享了一块网卡,网络传输的效率也有明显的提升。

在容器的使用实践时,我们在一个容器中一般只部署一个组件。对于一些由多个组件构成的服务,我们一般会使用Container网络模式。将不同的组件发布到通一个网卡上。这样不同的组件就可以向部署在同一个系统上一样使用。

接下来我们来学习一个redis和Python两个组件组成的服务的部署案例。

  1. 启动redis容器

redis是一个上手容易,使用简单的内存存储服务组件。通常被用来当作web服务的缓存组件来使用。首先我们来创建一个名为redis1的redis容器。当容器创建之后,我们可以通过redis-cli命令进入redis的控制台。

docker run -d --name redis1 redis
docker exec -it redis1 redis-cli

  1. 初始化redis数据

在redis中数据的存储结构采用的是key/value结构,在控制台中我们可以通过set [key] [value]命令存储数据。数据存储后可以使用get [key]命令读取数据。

set name aliyun
set year 2000
get name
get year
exit

  1. 安装Python的redis工具

接下来我们再启动一个名为python1的python容器,并和redis1容器共享网卡。在容器创建成功后,我们在容器中使用pip install命令安装访问redis的工具。

docker run -itd --name python1 --network=container:redis1 python
docker exec python1 pip install redis

  1. 通过Python脚本调用redis

接下来我们在python1容器中执行python命令,进入命令行模式。在命令行模式中,我们可以一条一条的输入命令。并观察命令的执行结果。

首先我们使用import redis命令加载访问工具,加载完成后,使用redis.Redis()命令创建到redis服务的连接。在创建连接时虽然python服务和redis服务不在同一个容器中,但是由于我们共享了网卡,我们还是可以使用127.0.0.1的网络地址来访问不同容器的服务。

连接创建之后,我们就可以使用keys(*)命令列出redis中所有的key,然后我们继续使用get([key名字])的命令获得key对应的value。我们发现通过pyton容器获得数据和在redis-cli中获得的数据是一致的。

docker exec -it python1 python
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
print(r.keys('*'))
print(r.get('name'))
print(r.get('year'))
exit()

实验链接:https://developer.aliyun.com/adc/scenario/4e2e9b022d364acaa18aad01fcd750d8

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于BP神经网络的苦瓜生长含水量预测模型matlab仿真
本项目展示了基于BP神经网络的苦瓜生长含水量预测模型,通过温度(T)、风速(v)、模型厚度(h)等输入特征,预测苦瓜的含水量。采用Matlab2022a开发,核心代码附带中文注释及操作视频。模型利用BP神经网络的非线性映射能力,对试验数据进行训练,实现对未知样本含水量变化规律的预测,为干燥过程的理论研究提供支持。
|
11天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
36 2
|
12天前
|
运维 网络协议 算法
7 层 OSI 参考模型:详解网络通信的层次结构
7 层 OSI 参考模型:详解网络通信的层次结构
33 1
|
1月前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
1月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
75 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
23天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
28天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
22 3
|
1月前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
42 3
|
1月前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
下一篇
无影云桌面