内容正文:
课程名称
第5章 容器底层技术
计划学时
4学时
内容分析
本章主要介绍Docker基本架构、Namespace、Cgroups、Docker文件系统
教学目标
与教学要求
要求学生了解容器的底层技术、熟悉Namespace隔离机制、熟悉Cgroup资源控制原理、理解容器底层技术原理
教学重点
Namespace、Cgroups、Docker文件系统
教学难点
Namespace、Cgroups、Docker文件系统
教学方式
课堂讲解及ppt演示
教
学
过
程
第一课时
(Docker基本架构、Namespace)
回顾内容
1.介绍本书,引出本课时的主题
Docker容器能够在服务器中高效运行,离不开容器底层技术的支持。为了更好地理解容器的运行原理,本章将会以Linux宿主机为例,介绍容器的底层技术,包括容器的命名空间、控制组、联合文件系统等。
2.明确学习目标
(1) 能够了解服务端
(2) 能够了解客户端
(3) 能够掌握Namespace介绍
(4) 能够掌握Namespace的类型
(5) 能够深入理解Namespace
(6) 能够掌握Namespace的劣势
知识讲解
· 服务端
Docker服务端也就是Docker daemon,一般在宿主机后台运行,接收来自客户的请求、并处理这些请求。在设计上,Docker 服务端是一个模块化的架构,通过专门的Engine模块来分发、管理各个来自客户端的任务。
Docker服务端默认监听本地的unix:///var/run/Docker.sock套接字,只允许本地的root用户或Docker用户组成员访问,可以通过-H参数来修改监听的方式。
例如,让服务器监听本地的TCP连接1234端口,代码如下所示:
此外,Docker还支持通过HTTPS认证的方式来验证访问。
在Debian/Ubuntu14.04等使用upstart管理启动服务的系统中,Docker服务端的默认启动配置文件在/etc/default/Docker。在使用systemd管理启动服务的系统,配置文件在/etc/systemd/system/Docker.service.d/Docker.conf。
· 客户端
用户不能与服务端直接交互,Docker客户端为用户提供一系列可执行命令,用户通过这些命令与Docker服务端进行交互。
用户使用的Docker可执行命令就是客户端程序。与Docker服务端不同的是,客户端发送命令后,等待服务端返回信息,收到返回信息后,客户端立刻执行结束并退出。用户执行新的命令时,需要再次调用客户端命令。同样,客户端默认通过本地的unix:///var/run/Docker.sock套接字向服务端发送命令。如果服务端不在默认监听的地址,则需要用户在执行命令时指定服务端地址,如图所示。
· Namespace介绍
Linux操作系统中,容器用来实现“隔离”的技术称为Namespace(命名空间)。
Namespace技术实际上修改了应用进程看待整个计算机的“视图”,即应用进程的“视线”被操作系统做了限制,只能“看到”某些指定的内容,如图所示。
但对于宿主机来说,这些被进行“隔离”的进程跟其他进程并没有太大区别。
下面运行一个CentOS7容器,示例代码如下:
从以上示例中可以看到,bash是这个容器内部的第1号进程,即PID=1,而这个容器里一共只有两个进程在运行,这就意味着,前面执行的/bin/sh,以及刚刚执行的 ps,已经被Docker 隔离在一个与宿主机完全不同的空间当中。
理论上,每当在宿主机上运行一个/bin/sh程序,操作系统都会给它分配一个进程编号,例如,PID=100。这个编号是进程的唯一标识,就像员工的工号一样。所以,PID=100,可以粗略地理解为这个/bin/sh是公司里的第100号员工。
而现在,要通过Docker把/bin/sh运行在一个容器当中。这时,Docker就会在这个第100号员工入职时给他施一个“障眼法”让他永远看不到前面的其他99个员工,这样,他就会以为自己就是公司里的第1号员工。
· Namespace的类型
命名空间分为多种类型,对应用程序进行不同程度的隔离,下面一一讲解。
1.Mount namespace
Mount Namespace将一个文件系统的顶层目录与另一个文件系统的子目录关联起来,使其成为一个整体。该子目录称为挂载点,这个动作称为挂载。
2.UTS namespace
UTS(UNIX Time-sharing System,UNIX分时系统)Namespace提供主机名和域名的隔离,使子进程有独立的主机名和域名,这一特性在Docker容器技术中被运用,使Docke