当前位置: 首页 > article >正文

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 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得 应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单

虚拟化实现方式

应用程序执行环境分层

在这里插入图片描述

  • 硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
  • 操作系统层 :提供系统调用接口,管理硬件资源
  • 程序库层:提供数据结构定义及函数调用接口

虚拟化常见类别

  1. 虚拟机: 存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口
  2. 容器:存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口
  3. JVM 之类的虚拟机:存在于函数库层和应用程序之间的虚拟化技术

常见虚拟化实现

主机虚拟化(虚拟机)实现

主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可 以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为两种类型

在这之前要知道一个东西:Hypervisor,那么这个东西是什么呢?

Hypervisor

Hypervisor 又称虚拟机监视器(VMM),是一种可以创建和管理虚拟环境的软件或硬件技术。

主要功能

  1. 资源隔离 - 它能够将物理硬件资源(如 CPU、内存、存储和网络接口等)进行划分和隔离,使多个虚拟机(VM)可以在同一台物理主机上独立运行,互不干扰。每个虚拟机都认为自己独占了整个物理系统资源。 - 例如,一个物理服务器上运行着多个虚拟机,其中一个虚拟机的崩溃不会影响其他虚拟机的正常运行。
  2. 资源分配 - Hypervisor 负责为每个虚拟机分配适当的资源,如 CPU 时间、内存大小和磁盘空间等。可以根据不同虚拟机的需求动态调整资源分配,以提高资源利用率。 - 比如,对于需要大量计算资源的虚拟机,可以分配更多的 CPU 核心和内存;而对于资源需求较低的虚拟机,则可以减少分配,从而使物理资源得到更有效的利用。
  3. 虚拟机管理 - 提供虚拟机的创建、启动、停止、暂停、恢复和删除等操作。用户可以通过 Hypervisor 的管理界面方便地管理多个虚拟机。 - 例如,管理员可以在不中断物理服务器运行的情况下,快速创建新的虚拟机以满足业务增长的需求,或者停止不再需要的虚拟机以节省资源。

再回到虚拟化的两种类型

  • 类型一: 类型一的Hypervisor是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主 机上单独工作,直接运行在硬件之上,没有宿主机操作系统,Hypervisor 直接控制硬件资源和客户机。
  • 类型二:类型二的 Hypervisor 运行在一个宿主机操作系统之上或者系统里面,Hypervisor 作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操作系统上的一个进程

容器虚拟化实现

容器虚拟化实现原理

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

容器虚拟化基础之 NameSpace

namespace 是 Linux 内核用来隔离内核资源的方式。通过 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.4.19
UserCLONE_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 优先挂载过去

不共享用户空间,这里相当于创建了一个子进程

在这里插入图片描述

另起一个会话

在这里插入图片描述

退出启动的子进程后,又回到宿主机的命名空间

在这里插入图片描述


http://www.kler.cn/news/315500.html

相关文章:

  • 新能源汽车知识点集萃
  • Python办公自动化教程(003):PDF的加密
  • HarmonyOS Next开发----使用XComponent自定义绘制
  • 【乐企-工具篇】有关乐企发票文件生成- OFD和PDF文件生成
  • 四、JVM原理-4.1、JVM介绍
  • vue中 <template> 与 <template lang=“jade“>的对比,哪个性能好
  • 数据结构之希尔排序
  • 轻代码的概念学习笔记
  • http和https的区别及get和post请求的区别
  • Vue3新组件transition(动画过渡)
  • Java API 之集合框架进阶
  • 软件测试面试题(5)——二面(游戏测试)
  • 【PLW003】设备器材云端管理平台v1.0(SpringBoot+Mybatis+NodeJS+MySQL前后端分离)
  • LeetCode题练习与总结:回文链表--234
  • [JavaEE]———进程、进程的数据结构、进程的调度
  • 【优选算法之二分查找】No.5--- 经典二分查找算法
  • Linux之实战命令03:stat应用实例(三十七)
  • 如何使用 maxwell 同步到 redis?
  • 如何在 CentOS 中管理用户、组和服务状态
  • git pull的merge和rebase模式
  • Spring解决循环依赖的原理
  • RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案
  • Spring 源码分析
  • C++独立开发开源大数计算库 CBigNum
  • MySQL之内置函数
  • 【笔记】第三节 组织与性能
  • 搜维尔科技:Unity中的A.R.T.测量工具
  • 金仓数据库 KingbaseES参考手册 (8. 函数(九))
  • C++标准库容器类——string类
  • KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用