资料详情

基于Docker net的不同容器之间的通信实验报告

头像

理工论文

编号:11175

实验报告

目录

一、 课堂练习

do

二、 课后作业

2. cgroups资源限制练习

4. 描述4种网络模式各自的特点

Host模式

Container模式

None模式

5. docker run容器网络类型练习

一、 课堂练习

代码:

vi eatcpu.sh

#! /bin/bash

i=0;

while true

do

i=i+1;

done

运行截图:

代码:

chmod +x eatcpu.sh

./eatcpu.sh

运行截图:

代码:

top

运行截图:

代码:

yum install libcgroup-tools

运行截图:

代码:

cgcreate -g cpu:/mylimit

ls /sys/fs/cgroup/cpu/mylimit/

cat /sys/fs/cgroup/cpu/mylimit/cpu.cfs_period_us

cat /sys/fs/cgroup/cpu/mylimit/cpu.cfs_quota_us

echo 50000 > /sys/fs/cgroup/cpu/mylimit/cpu.cfs_quota_us

cat /sys/fs/cgroup/cpu/mylimit/cpu.cfs_quota_us

运行截图:

代码:

echo 3022 >/sys/fs/cgroup/cpu/mylimit/tasks

运行截图:

代码:

cgdelete -g cpu:/mylimit

运行截图:

代码:

ps -ef | grep docker

运行截图:

代码:

docker run --net=none -it busybox sh

/ # ip a

运行截图:

二、 课后作业

题目:

1. 修改hpe_app_image的源文件,增加一个index2.html,构建后运行访问网页,验证结果。

过程:

1、查看hpe_app_image的id

2、进入该容器

3、找到存放html的位置并新建一个html文件

4、写一个简单的网页index2.html,保存并退出

5、在浏览器中输入网址localhost:8080/app/index2.html,即可得到之前写的网站。

题目:

2. cgroups资源限制练习

Ø 启动两个脚本进程,将两个脚本进程的ID都写入同一个cgroup的tasks里会是什么结果?

Ø 容器的CPU使用被限制为100m( millicores千分之一)=100/1000=0.1核心

Ø 限制容器只能使用128Mi内存

过程:

第1问:

1、写两个死循环进程

2、启动两个进程,可以看到它们的pid

3、将两个进程id都写入tasks中,结果也很好预见:对于该tasks的操作将同时对这两个进程操作,这两个进程均分同一个核,比如这里总数是10w,限制为1w,故两个进程cpu占用总数为1w。

第2问:

4、将容器的CPU使用被限制为100m,可以看到cpu占用率显著下降

第3问:

5、在memory中新建一个mylimit文件夹

6、将两个进程加入到tasks中去

7、限制内存为128M

题目:

3. 查找资料,在docker run的参数设置容器只能使用0.5Core CPU

过程:

题目:

4. 描述4种网络模式各自的特点

解答:

Host模式

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

None模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

Birdge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

题目:

5. docker run容器网络类型练习

Ø host模式:使用--net=host指定,查看容器的IP地址

Ø container模式:使用--net=container:mysql指定连接到mysql容器,查看容器的IP地址

过程:

第1问:

第二问:

1、开启MySQL

2、连接并查看ip

题目:

6. 用docker network命令,列出虚机上默认安装的几个docker网络 ,并解释这些网络

过程:

解释:

Ø 57ab1d84f3ff:以bridge方式连接webserver1,mysql,在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,从而获得网络连接

Ø 8a790fc2c2c1:启动容器的时候使用host模式,此处并没有容器以此方法连接网络

Ø 88f018179554:Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。

题目:

7. 创建一个名为mynet的network,创建一个名为mybox的busybox容器,先用ifconfig查看此容器的网口,然后新开一个SHELL,运行命令将mybox容器接入mynet的网络里,查看容器网口的变化并说明

过程:

1、创建名为mynet的network

2、创建名为mybox的busybox容器

3、查看网关

4、连接mybox到mynet

5、查看网关,发现多了一个eth1,网关地址为mynet的地址

题目:

8. 创建名为mybox2的容器,也连接到mynet的网络里,试试运行ping mybox,是否能ping通,并解释返回的结果

过程:

1、创建mybox2

2、连接至mynet

3、进入mybox容器ping mybox2发现可以ping通

解释:

由于两个busybox在都在mynet下,所以可以相互ping通。

题目:

9. 创建第三个名为mybox3的容器。第四个名为mybox4的容器,

确保mybox3可以跟mybox1互通,不能跟mybox2 与mybox4互通,

同时mybox2与mybox4互通。

最后阐述你对docker network的理解和感受

过程:

1、创建mybox4

2、创建一个mybox3到mybox1的桥

3、通过mybox3to1连接mybox3和mybox1

4、将mybox4加入mynet

5、查看现在的容器情况

6、进入mybox3,发现能ping通的只有mybox1

7、进入mybox4发现只有mybox3无法ping通,其余情况也是一样,实验完成,符合要求。

理解和感受:

Docker net是一个非常实用的工具,它能实现不同容器之间的通信需求。对于一些公开的容器,可以加入到共同的net中去,对于一些独立的连接则可以通过自定义bridge来进行。