开发者学堂课程【现代应用容器技术快速入门第一课时:容器技术基础(1)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/830/detail/13950
容器技术基础(1)
课程简介
• 由阿里云、Linux 开源软件学园和马哥教育联合推出
– “CNCF x Alibaba 云原生技术公开课”的前置课程
– CKAD/CKA/CKS 认证的配套课程
• 内容涵盖
– 手把手实践Kubernetes 云原生操作系统
– 阿里云Kubernetes 托管服务ACK
1.容器技术基础
1.1应用部署及运行
• 应用部署环境
– 主机
– 虚拟机
– 容器
2.现代操作系统的内核空间与用户空间
1.命现代操作系统在内存中有两个不同的、分离的区域,称为用户空间和内核空间;、
2.内核充当用户空间和硬件的中间层,负责进程调度、内存管理、中断处理等,对系统资源具有完全控制权3.用户空间通过“系统调用”与内核通信,系统调用通过API向应用程序提供系统级服务
3.虚拟化技术
• 通过专用软件模拟或/和虚拟技术,将主机硬件虚拟为独立、完整且隔离的不同单元,每个单元可作为一个主机使用
– 这个专用软件称为VMM,即虚拟机监视程序
– 根据VMM 运行的位置,可将虚拟化技术划分为两种类型
• 直接运行于硬件之上:类型1
• 运行于操作系统之上:类型2
– 每个虚拟机直接暴露硬件接口
• 有独立的内核空间和用户空间
• 跨虚拟机的进程之间完全隔离
• 资源开销较大,半虚拟化技术有助于降低开销
4.容器技术
• 借助于称之为“容器运行时”的软件技术,在同一个内核之上生成多个彼此隔离的用户空间
– ·各用户空间可独立管理运行其内部进程
– 每个用户空间“自以为”独占该内核及硬件资源
• 需要将内核级的共享资源进行隔离
– 依赖于内核中称为“名称空间”的技术进行
• 名称空间是Linux内核特性,用于隔离部分系统资源,从而使得进程仅可访问同一名称空间中的相应资源;
– 资源限制则依赖于由Google贡献的“CGroups”
5.Linux内核支持的名称空间
目前,内核(5.13)支持8种名称空间
备注:
monotonic time:单调递增时钟,自系统开机后开始累加计时,但系统休眠时间不计入;
boot time:类似于monotonic time,不同之处是,boot time 会计入系统休眠时间;
6.名称空间和Chroot
• 1979年,chroot()系统调用被添加到Unix系统中,用于为开发人员提供一个独立于根文件系统的测试平台;
– 借助于chroot(),开发人员可以更改进程及其子进程的根目录
– 如图,文件系统被分成两个部分,它们互不影响
• Linux 引入了新的子系统和系统调用来改进进程隔离机制
– 名称空间的概念最早出现在2002年的Kernel 2.4.19中.当时唯一支持的名称空间是Mount,该名称空间的Flag 甚至就名为CLONE_NEWNS
7.隔离进程及标识的PID 名称空间
• PID 名称空间能够支持多个完全独立的进程树
– Linux 系统在用户空间启动的PID 号为1的进程,作为进程树的“根”
– PID 名称空间允许用户创建具有1号PID的单独分支
• 新树中的进程永远不会同父进程交互,也不会看到它
• 父进程可以访问所有的子进程树
• 带有CLONE_NEWPID 标志的clone()系统调用可用于创建新的命名空间PID
8.隔离文件系统的Mount 名称空间
• Mount 名称空i间能够创建同无关进程完全独立的文件系统,其可靠性远大于chroot();
– 子进程首先“看到”与父进程相同的挂载点
– —旦子进程被移至一个单独的名称空间,住何文件系统都可以挂载到该名称之间之上,并且父进程或其他命名空间都无法访问到它
9.名称空间API
• Linux 内核中,与namespace 相关的API有4个
– clone():创建子进程,并将其隔离至新建的名称空间之中;
• 负责创建一个子进程,若同时使用了CLONE_NEW*相关的标志,则为每个标志创建出名称空间,并将该进程置于该名称空间中;
– setns():将进程加入到指定的现有名称空间中;
• 通过操作进程相关的/proc/[pid]/ns/目录完成
– setns():将进程加入到指定的现有名称空间中;
• 通过操作进程相关的/proc/[pid]/ns/目录完成
– unshare():将进程隔离至新建的名称空间中;
• 与clone()类似,但不同之处在于,unshare()在当前进程中创建名称空间,一旦调用完成,当前进程即位于新的名称空间中;
– ioctl():获取名称空间的相关信息
10.容器运行时
• 容器并非Linux 内核中的“一等公民”,它从根本上来说就是由名称空间、cGroups 和LSM(Linux 内核安全模块)等几个内核原语组成;
– 借助于这些内核原语即可设置安全、隔离的进程运行环境,但这也意味着每次创建都得手动执行相关的操作;
• “容器运行时”便是一组简化该类操作的工具集
– “运行时”是进程的生命周期管理工具,容器运行时是一种特指运行和管理容器所需要的软件
– 用于帮助用户轻松、高效、安全地部署容器,而且是容器管理的关键组件
• 2007年,CGroups 引入到Linux 内核之后,便出现了一些容器运行时项目,例如LXC 和LMCTFY(Google)等
11.Linux 容器和LXC 项目
• LXC,全称LinuX Containers,一个知名的Linux 容器管理项目,由一组工具、模板和库组成;
但是
– LXC 仅提供了单机的命令行工具,且这些命令非常底层,用户理解起来较为困难
– LXC 没有daemon 进程,无法提供基于Socket 的API,也难以实现跨主机的容器迁移
– LXD 项目提供了这部分缺失的功能
12.Docker 容器
• dotCloud 公司的Docker 项目最初也是建立在LXC之上,以促进容器技术对开发人员和用户更加友好;
– 不久之后,Docker便使用了自行研发的libcontainer 取代了LXC
– 在Docker 项目声名大噪之后,dotCloud公司也更名为Docker
• 最终,Docker 于2013年发布,解决于开发人员在端到端到行窗口时遇到的许多问题
• 容器镜像格式
• 构建容器镜像:Dockerfile、docker build
• 容器镜像管理:docker image、docker rmi
• 容器实例管理: docker ps、docker rm、……
• 共享容器镜像:docker push/pull
• 运行容器镜像的方式:docker run