Docker_基础初识
文章目录
- 初识Docker
- 什么是虚拟化、容器化
- 为什么要虚拟化、容器化?
- 虚拟化实现方式
- 应用程序执行环境分层
- 虚拟化常见类别
- 常见虚拟化实现
- 主机虚拟化(虚拟机)实现
- Hypervisor
- 容器虚拟化实现
- namespace隔离实操
- 基础知识
- dd命令
- 语法
- 参数
- mkfs 命令
- 语法
- 参数
- df 命令
- 语法
- 参数
- mount 命令
- 语法
- 参数
- unshare 命令
- 语法
- 参数
初识Docker
什么是虚拟化、容器化
- 物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
- 虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
- 容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。
通俗一点的例子:
-
物理机就像一个庄园,独立占用了一块土地,花园都是自己的,其他人无法共享使用。
-
虚拟机相当于开发商的一个楼盘,一栋楼一套房子一户人家,共享一块宅基地,共享小区的设施。
-
小区的花园,共享小区的游乐设施。容器相当于在 1 个房子里面,开辟出来一个又一个的胶囊公寓,共享这套房子的卫生
间、共享厨房、共享 WiFi,只有衣服、电脑等私人物品是你自己的。
为什么要虚拟化、容器化?
- 资源利用率高:比如我们在某云上买了一个1核2G的服务器,另一个人买了一个2核4G的服务器,它并不是真的是给你买了一个真实的电脑放在那里,而是一个很大的服务器,直接切出来,1核2G给我,2核4G给他,当这些资源不用了,还能收回来。
- 环境标准化:一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常 见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境, 确保了应用运行环境一致性
- 资源弹性伸缩:根据业务情况,动态调整计算、存储、网络等硬件及软件资源。比如遇到双 11 了,把服务扩容
- 差异化环境提供:比如我的服务一个依赖 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
- 沙箱安全:为避免不安全或不稳定软件对系统安全性,稳定性造成影响,可使用虚拟化技术构建 虚拟执行环境
- 容器对比虚拟机更轻量,启动更快: 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了
- 维护和扩展容易:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得 应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单
虚拟化实现方式
应用程序执行环境分层
- 硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
- 操作系统层 :提供系统调用接口,管理硬件资源
- 程序库层:提供数据结构定义及函数调用接口
虚拟化常见类别
- 虚拟机: 存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口
- 容器:存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口
- JVM 之类的虚拟机:存在于函数库层和应用程序之间的虚拟化技术
常见虚拟化实现
主机虚拟化(虚拟机)实现
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可 以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为两种类型
在这之前要知道一个东西:Hypervisor,那么这个东西是什么呢?
Hypervisor
Hypervisor 又称虚拟机监视器(VMM),是一种可以创建和管理虚拟环境的软件或硬件技术。
主要功能
- 资源隔离 - 它能够将物理硬件资源(如 CPU、内存、存储和网络接口等)进行划分和隔离,使多个虚拟机(VM)可以在同一台物理主机上独立运行,互不干扰。每个虚拟机都认为自己独占了整个物理系统资源。 - 例如,一个物理服务器上运行着多个虚拟机,其中一个虚拟机的崩溃不会影响其他虚拟机的正常运行。
- 资源分配 - Hypervisor 负责为每个虚拟机分配适当的资源,如 CPU 时间、内存大小和磁盘空间等。可以根据不同虚拟机的需求动态调整资源分配,以提高资源利用率。 - 比如,对于需要大量计算资源的虚拟机,可以分配更多的 CPU 核心和内存;而对于资源需求较低的虚拟机,则可以减少分配,从而使物理资源得到更有效的利用。
- 虚拟机管理 - 提供虚拟机的创建、启动、停止、暂停、恢复和删除等操作。用户可以通过 Hypervisor 的管理界面方便地管理多个虚拟机。 - 例如,管理员可以在不中断物理服务器运行的情况下,快速创建新的虚拟机以满足业务增长的需求,或者停止不再需要的虚拟机以节省资源。
再回到虚拟化的两种类型
- 类型一: 类型一的Hypervisor是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主 机上单独工作,直接运行在硬件之上,没有宿主机操作系统,Hypervisor 直接控制硬件资源和客户机。
- 类型二:类型二的 Hypervisor 运行在一个宿主机操作系统之上或者系统里面,Hypervisor 作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操作系统上的一个进程
容器虚拟化实现
容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化
容器虚拟化基础之 NameSpace
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。
namespace | 系统调用参数 | 被隔离的全局系统资源 | 引入内核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 ,进程间通信 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 文件系统挂载点 | 2.4.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
namespace隔离实操
基础知识
dd命令
Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设 备或标准输出。
语法
dd OPTION
参数
- if=文件名:输入文件名,默认为标准输入。即指定源文件。
- of=文件名:输出文件名,默认为标准输出。即指定目的文件。
- ibs=bytes:一次读入 bytes 个字节,即指定一个块大小为 bytes 个字节。
- obs=bytes:一次输出 bytes 个字节,即指定一个块大小为 bytes 个字节。
- bs=bytes:同时设置读入/输出的块大小为 bytes 个字节。
- cbs=bytes:一次转换 bytes 个字节,即指定转换缓冲区大小。
- skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制。
- seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制。
- count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
- conv=<关键字>,关键字可以有以下 11 种
- conversion:用指定的参数转换文件。
- ascii:转换 ebcdic 为 ascii
- ebcdic:转换 ascii 为 ebcdic
- ibm:转换 ascii 为 alternate ebcdic
- block:把每一行转换为长度为 cbs,不足部分用空格填充
- unblock:使每一行的长度都为 cbs,不足部分用空格填充
- lcase:把大写字符转换为小写字符
- ucase:把小写字符转换为大写字符
- swap:交换输入的每对字节
- noerror:出错时不停止
- notrunc:不截短输出文件
- sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐。
创建一个指定大小的空文件
小写转大写
mkfs 命令
用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。
语法
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
参数
-t fstype:指定要建立何种文件系统;如 ext3,ext4
filesys :指定要创建的文件系统对应的设备文件名;
blocks:指定文件系统的磁盘块数。
-V : 详细显示模式
fs-options:传递给具体的文件系统的参数
例如 格式化镜像文件为 ext4
df 命令
Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
语法
df [OPTION]... [FILE]...
参数
常见参数
- -a, --all 包含所有的具有 0 Blocks 的文件系统
- -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的…)
- -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024
- -t, --type=TYPE 限制列出文件系统的 TYPE
- -T, --print-type 显示文件系统的形式
mount 命令
mount 命令用于加载文件系统到指定的加载点。此命令的也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用Linux mount 命令来手动完成挂载。
Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)
不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备挂载的实质是为磁盘添加入口(挂载点)。
语法
mount [-l]
mount [-t vfstype] [-o options] device dir
参数
-l:显示已加载的文件系统列表;
-t: 加载文件系统类型支持常见系统类型的 ext3,ext4,iso9660,tmpfs,xfs 等,大部分情况可以不指定,mount 可以自己识别
-o options 主要用来描述设备或档案的挂接方式。
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
device: 要挂接(mount)的设备。
dir: 挂载点的目录
unshare 命令
unshare 主要能力是使用与父程序不共享的名称空间运行程序。
语法
unshare [options] program [arguments]
参数
参数 | 含义 |
---|---|
-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 优先挂载过去 |
不共享用户空间,这里相当于创建了一个子进程
另起一个会话
退出启动的子进程后,又回到宿主机的命名空间