docker基础前置
一.虚拟化和容器化
1.简介
物理机: 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理
机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
**虚拟化:**是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上
同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都
可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
**容器化:**容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level
virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例
(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运
行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户
来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。
docker 是现今容器技术的事实标准。
2虚拟化和容器化的理由
资源利用率高
将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务,降低 IT 支出和运维管理成本。环境标准化
一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。资源弹性伸缩
根据业务情况,动态调整计算、存储、网络等硬件及软件资源。比如遇到双 11 了,把服务扩容 100 个,双 11 过去了, 把扩容的 100 个收回去。差异化环境提供
同时提供多套差异化的执行环境,限制环境使用资源。比如我的服务一个以来 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。沙箱安全
比特就业课为避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建虚拟执行环境。比如我在容器里面执行 rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序使用。容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了。维护和扩展容易
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。比如 docker hub 提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可以自己定制镜像分享给各个产品
二.虚拟化实现方式
1.应用程序执行环境分层
硬件层: 提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
操作系统层 : 提供系统调用接口,管理硬件资源
程序库层: 提供数据结构定义及函数调用接口
2.虚拟化常见类别
虚拟机
存在于硬件层和操作系统层间的虚拟化技术。 虚拟机通过“伪造”一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台电脑打开 Android 系统上的应用。容器
存在于操作系统层和函数库层之间的虚拟化技术。 容器通过“伪造”操作系统的接口,将函数库层以上的功能置于操作系统上。以 Docker 为例,其就是一个基于 Linux 操作系统的 Namespace 和 Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。简单来说,如果虚拟机是把整个操作系统封装隔离,从而实现跨平台应用的话,那么容器则是把一个个应用单独封装隔离,从而实现跨平台应用。所以容器体积比虚拟机小很多,理论上占用资源更少。容器化就是应用程序级别的虚拟化技术。容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容器共享一个内核(操作系统),它安装在硬件上。JVM 之类的虚拟机
存在于函数库层和应用程序之间的虚拟化技术。 Java 虚拟机同样具有跨平台特性,所谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库的, JVM 就是在应用层与函数库层之间建立一个抽象层,对下通过不同的版本适应不同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调用不同操作系统的函数库。
3.常见虚拟化实现
主机虚拟化(虚拟机)实现
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为 Type1 和 Type2.
Type1 类的Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主机上单独工作,因此, Hypervisor 也称为虚拟机管理器。 )直接运行在硬件之上,没有宿主机操作系统, Hypervisor 直接控制硬件资源和客户机。典型框架为 Xen、 VmwareESX。
4.容器虚拟化实现
容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。
容器虚拟化基础之 NameSpace
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。
具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前namespace 里的进程,对其他 namespace 中的进程没有影响。
Linux 提供了多个 API 用来操作 namespace,它们是 clone()、 setns() 和 unshare() 函数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些调用参数: CLONE_NEWIPC、 CLONE_NEWNET、 CLONE_NEWNS、CLONE_NEWPID、 CLONE_NEWUSER、CLONE_NEWUTS 和CLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合这些参数。
三.NameSpace 隔离实战
1.dd
演示:
2.mkfs
用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化
演示:
3.df
Linux df(英文全拼: disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使
用情况统计
演示:
4.mount
mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中, Linux 并不会自动挂载,必须使用Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。
挂载的实质是为磁盘添加入口(挂载点)
演示:
5.unshare
unshare 主要能力是使用与父程序不共享的名称空间运行程序
参数 + 含义
演示:
四.cgroups
1.简介
cgroups(Control Groups) 是 linux 内核提供的一种机制, 这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
简单说, cgroups 可以限制、记录任务组所使用的物理资源。本质上来说, cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
2.用途
Resource limitation: 限制资源使用,例:内存使用上限/cpu 的使用限制
Prioritization: 优先级控制,例: CPU 利用/磁盘 IO 吞吐
Accounting: 一些审计或一些统计
Control: 挂起进程/恢复执行进程
3.使用
1.pidstat
pidstat 是 sysstat 的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备IO 等系统资源的占用情况。 Pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
2.stress
stress 是 Linux 的一个压力测试工具,可以对 CPU、 Memory、 IO、磁盘进行压力测试。
3.cgroups
cgroups 版本查看:
cgroups 子系统查看:
cgroups 挂载信息查看:
五.容器虚拟化基础之 LXC
1.LXC
LXC(LinuX Containers) Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。
透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案LXC 虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。
其隔离性也没有虚拟机那么强大。后来就出现了 docker,所以从一定程度上来说, docker 就是 LXC 的增强版
2.基础知识
lxc-checkconfig
检查系统环境是否满足容器使用要求;
格式: lxc-checkconfig
lxc-create
创建 lxc 容器;
格式: lxc-create -n NAME -t TEMPLATE_NAME [-- template-options]
lxc-start
启动容器;
格式: lxc-start -n NAME -d
lxc-ls
列出所有容器,-f 表示打印常用的信息 ;
格式: lxc-ls -f
lxc-info
查看容器相关的信息;
格式: lxc-info -n NAME
lxc-attach
进入容器执行命令;
格式: lxc-attach --name=NAME [-- COMMAND]lxc-stop
lxc-stop
停止容器;
格式: lxc-stop -n NAME
lxc-destory
删除处于停机状态的容器;
格式: lxc-destory -n NAME
安装:
1、安装
lxc 主程序包
lxc-templates lxc 的配置模板
bridge-utils 网桥管理工具
apt install lxc lxc-templates bridge-utils -y
2、检查服务是否正常运行
systemctl status lxc
删除:
1、检查是否安装。清理资源
systemctl status lxc
lxc-stop -n xxx # lxc-ls -f 遍历所有容器,停止运行的容器
lxc-destroy -n xxx # 删除对应的容器
2、 卸载软件
apt-get purge --auto-remove lxc lxc-templates
3、 检查服务已经没有该服务了
systemctl status lxc
3.实操
检查 lxc 是否运行
检查 lxc 的功能支持情况
查看 lxc 提供的容器模板
创建一个 lxc 虚拟主机,这个命令就会下载安装指定环境下的软件包,创建新容器。整个过程需要时间较长,与容器的类型有关
下载安装完所有软件包后, LXC 容器镜像就创建完成了,你可以看到默认的登录界面。容器被放到 /var/lib/lxc/<容器名> 这个目录下,容器的根文件系统放在/var/lib/lxc/<容器名>/rootfs 目录下。创建过程中下载的软件包保存在 /var/cache/lxc 目录下面,当你想另外建一个一样的容器时,可以省去很多下载时间。
查看创建的容器信息
启动容器,我们可以看到容器状态为运行中
查看容器的详细信息
容器 ip 为 10.0.3.248, 我们通过 ssh 进入容器,查看 ip 地址,磁盘挂载信息,目录信息和宿主机都不一样
在容器外面执行命令
停止容器
删除容器