第二章-Docker基础

容器技术发展历史

细节的信息大家可以查找以下链接。

https://baijiahao.baidu.com/s?id=1666722958911645867&wfr=spider&for=pc

虚拟化容器化概念

物理服务器:实际的机器或计算机系统。相对于虚拟机而言,指的是实体计算机。物理服务器为虚拟机提供硬件基础,有时也被称为“主机”或“宿主”。

虚拟化:采用虚拟技术将一台计算机分割成多台逻辑计算机的过程。在单一计算机上同时运行多个逻辑计算机,每个逻辑计算机可以运行不同操作系统,并且各应用程序在相互隔离的环境中运行,互不干扰,从而显著提升计算效率。

容器化:容器化是一种虚拟技术,也称为操作系统层虚拟化。该技术虚拟化操作系统内核,允许将用户空间软件实例分割为多个独立单元,在操作系统内核中运行。这些独立实例被称为容器。对实例的所有者和用户而言,他们使用的服务器程序看起来像是专属的。容器技术是虚拟化的一种,docker 目前是广泛使用的容器技术标准。

为什么需要虚拟化容器化

https://baijiahao.baidu.com/s?id=1755166300139325821&wfr=spider&for=pc

容器虚拟化实现

容器虚拟化实现原理

容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。容器虚拟化是通过namespace进行个进程的隔离,加上cgroups进行资源的控制,以此来进行虚拟化。

这样更轻量级,因为只是操作系统里面的隔离,就是公用内核的。

如果是虚拟机,那就是全部东西都虚拟一个出来,那样是很占资源的。

Namespace

Namespace可以隔离的一些资源如下。

Namespace系统调用参数被隔离的全局系统资源引入内核版本
UTSCLONE_NEWUTS主机和域名2.6.19
IPCCLONE_NEWIPC信号量、消息队列和共享内存、进程间通信2.6.19
PIDCLONE_NEWPID进程编号2.6.24
NetworkCLONE_NEWNET网络设备、网络栈、端口等2.6.29
MountCLONE_NEWNS文件系统挂载点2.6.19
UserCLONE_NEWUSER用户和用户组3.8

Namespace空间隔离实战

dd命令

Linux dd 命令用于读取、转换并输出数据dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

参数

可以用它来生成一个指定大小的空白文件

/dev/zero是操作系统的一个特殊文件,可以产生连续不断的空白字符流

这里就可以产生一个8M的文件。

也可以用来做一个大小写转换

先创建一个test.txt然后里面写Hello World!

mkfs命令

用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。

参数

我们可以把刚才dd命令生成的test.img格式化成一个磁盘。

df命令

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

参数

案例

mount命令

mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们 可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。

Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的, 可以自由组合(通过挂载)

不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。 挂载的实质是为磁盘添加入口(挂载点)。

什么是挂载?

比如U盘插进电脑之后,在某个目录下弹出来,这个目录就是挂载点。就是给这个U盘添加入口。

参数

unshare命令

unshare 主要能力是使用与父程序不共享的名称空间运行程序。

参数

参数含义
-i, --ipc不共享 IPC 空间
-m, --mount不共享 Mount 空间
-n, --net不共享 Net 空间
-p, --pid不共享 PID 空间
-u, --uts不共享 UTS 空间
-U, --user不共享用户
-V, --version版本查看
--fork执行 unshare 的进程 fork 一个新的子进程,
在子进程里执行 unshare 传入的参数
--mount-proc执行子进程前,将 proc 优先挂载过去

这幅图里面,一开始unshare创建了一个子进程,隔离的进程是bash

所以unshare下面我去修改hostname,是修改这个子进程的hostname,然后exit也是退出这个子进程而已,不会影响外面的hostname。

进程隔离实战操作(PID隔离)

我们会发现,直接报错。

为什么会报这个错呢?

因为如果直接-p去隔离PID信息,会导致新的进程看不见原来父进程(bash)的信息,会导致他后续会有问题。

也就是说这个新进程,不知道自己的父进程是谁了,这是不允许的。所以。

我们再打开另一个bash,然后ps -ef查看一下进程信息。

发现是一样的,并没有完成隔离。

这是为什么呢,这是因为我们/proc目录下本来就有很多进程,大家都看得到的。

因此要采用另一个参数。

此时再次ps -ef查看进程。

此时已经看不到什么进程了,我们完成进程隔离了。

mount隔离(文件系统隔离)

第一步:打开第一个 shell 窗口 A,执行命令,df -h,查看主机默认命名空间的磁盘挂载情况。

第二步:打开一个新的shell窗口,执行Mount隔离命令

第三步:在窗口 B 中添加新的磁盘挂载

格式化这个文件。

挂载到当前的一个目录下。

我们发现,在这个bash下面是可以看到这个挂载点的。

但是,外面的bash是看不到的!

因此我们成功完成了一次挂载点的隔离!

现在无论我们在testmymount2这个文件夹里面去添加,或者修改任何文件,外面都是找不到的!

因此,在当前的进程中,是有文件隔离的!!

Cgroups

什么是cgroups

cgroups(Control Groups)是 linux 内核提供的一种机制,这种机制可以根据需求把系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

cgroups的用途

cgroups可以控制的子系统

https://blog.csdn.net/taoxicun/article/details/127268136

pidstat命令

pidstat是 sysstat 的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备1O 等系统资源的占用情况。Pidstat 第一次采样显示自系统启动开始的各项统计信息后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

stress

stress 是 Linux 的一个压力测试工具,可以对 CPU、Memory、IO、磁盘进行压力测试。

实操。

我们在打开另一个shell,对cpu进行一个监控

这里的意思是,监控stress这个命令相关的所有进程的cpu使用情况,2s输出一次,一共输出10000次。

在另一个shell中启动stress。

此时我们可以通过shell查看发现,此时cpu已经打满了。

测试一下-i选项。

测试一下-m选项

测试一下-d选项。

然后监控读写信息。

测试一下-t选项

cgroups版本信息查看

如果看到 cgroup2,表示支持 cgroup v2。

cgroups子系统查看

cgroups挂载信息查看

查看一个进程上的cgroup限制

以当前 shell 进程为例,查看进程的 cgroup。

LXC

LXC (LinuX Containers) Linux容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器 (Container)内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境使得 Linux 用户可以容易的创建和管理系统或应用容器。

LXC 是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案

LXC 虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。

后来就出现了 docker,所以从一定程度上来说,docker就是 LXC 的增强版。

lxc-checkconfig

检查系统环境是否满足容器使用要求。

lxc-create

创建lxc容器

lxc-start

lxc-ls

lxc-info

lxc-attach

进入容器

lxc-stop

lxc-destroy

lxc的安装

https://www.mryunwei.com/294151.html

lxc容器实战

检查lxc运行状态。

检查系统环境是否满足容器使用要求。

查看lxc提供的容器模版。

都有这么一些模版。

创建一个ubuntu的容器。

安装好之后,lxc-ls

启动这个容器。

查看这个容器的信息。

我们有了这个IP地址之后,可以通过ssh的方法,或者lxc-attach的方法连接这个容器。

此时发现,我们的bash已经发生了变化!这里面就是一个容器!!!

通过第二种方式:lxc-attach的方式。

这种方式也是可以的。

停止这个容器。

删除这个容器。