【Docker 01】Docker 简介

🌈 一、虚拟化、容器化

⭐ 1. 什么是虚拟化、容器化

  • 物理机:真实存在的服务器 / 计算机,对于虚拟机来说,物理机为虚拟机提供了硬件环境。
  • 虚拟化:通过虚拟化技术将一台计算机虚拟为 1 ~ n 台逻辑计算机。在一台计算机中可以运行多个虚拟机,且每个虚拟机可以运行不同的 OS,在每台虚拟机中运行的应用程序相互独立。(平时买的 1 核 2 G、2 核 4 G 这些云服务器,就是从服务器上切割出这些资源来虚拟给用户的)。
  • 容器化:虚拟化技术中的一种,也被称为操作系统虚拟化。该技术能够将 OS 的内核虚拟化,可允许用户空间软件实例呗分割成几个独立的单元,来在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称作是一个容器。Docker 是现今容器技术的事实标准。

⭐ 2. 为什么需要虚拟化、容器化

1. 沙箱安全

  • 应用程序不会直接运行在服务器上。通常来说,一个公司的服务器上会跑很多的应用程序,一个应用挂掉了,还需要别的应用能够运行。如果服务器因为一个应用导致整个主机挂掉了(因为就一个 OS),那这个公司所有运行在该主机上的应用也会跟着挂掉,这是不被允许的。
  • 而使用了虚拟化、容器化技术之后,让每个应用程序都单独运行在各自的盒子中,即使一个虚拟环境中的系统被在它里面运行的程序搞挂掉了,也不会影响在其他虚拟环境中运行的程序。

2. 分离运行环境

  • 很多软件需要的依赖环境是不同的,有的软件在 A 环境上运行不了,而有的软件又只能用 B 环境。
  • 使用虚拟化、容器化技术就可以的为每个应用配置它们所需要的环境,不需要再用额外的手段来进行管理。

🌈 二、虚拟化的实现方式

⭐ 1. 应用程序的执行环境分层

层级 层名 示例 说明
4 应用程序层 抖音、Facebook、YouTube 等
3 函数库层 如 stdio.h 提供数据结构定义及函数调用接口
2 操作系统(OS)层 Linux、Windows、iOS 等 提供系统调用接口、管理硬件资源
1 硬件层 物理机 提供硬件抽象,其中包括指令集架构、硬件设备及硬件访问接口

⭐ 2. 虚拟化的常见分类

1. 虚拟机

  • 存在于硬件层和 OS 层之间的虚拟化技术。虚拟机通过 "伪造" 一个硬件抽象接口,将一个 OS 以及 OS 层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。
    • 例:在一台装着 Windows 系统的电脑上使用装着 Android 系统的虚拟机,就可以在这台电脑上打开只能在 Android 系统上才能打开的应用。

2. 容器

  • 存在于 OS 层和函数库层之间的虚拟化技术。容器通过 "伪造" OS 的接口,将函数库层以上的功能置于 OS 上。
    • 例:Docker 就是一个基于 Linux 的 Namespace 和 Cgroup 功能实现隔离容器,可以模拟操作系统的功能。
  • 如果虚拟机是通过将整个 OS 进行封装隔离,来实现跨平台应用的话,容器就是将一个个应用进行单独封装隔离,来实现跨平台应用。

3. JVM 之类的虚拟机

  • 存在于函数库层和应用程序层之间的虚拟化技术。通过伪造函数库层和应用程序层的接口。
  • 对于接口进行了差异,运行在 Windows 上的应用就调用 Windows 的接口,运行在其他 OS 上的则同理。

⭐ 3. 主机的虚拟化实现(虚拟机)

  • 通过在物理服务器上安装一个虚拟化层来实现主机的虚拟化。虚拟化层可以在物理服务器和客户操作系统之间来建立虚拟机,让它们可以独立运行。
  • 从软件框架的角度看,虚拟化可以分为 Type1(虚拟化层位于硬件上)和 Type2(虚拟化层位于 OS 上)两种。

0. Hypervisor 介绍

  • Hypervisor 是一种系统软件,充当着计算机和虚拟机之间的中介,负责有效的分配和利用由各个虚拟机使用的硬件资源,这些虚拟机会在物理机上单独工作,Hypervisor 也被称为虚拟机管理器。
    • 例1:假设虚拟机想要 2G 内存、2 核 CPU、50G 硬盘,和 Hypervisor 说了之后,就能为虚拟机将这些资源虚拟化(模拟)出来。
    • 例2:如果为虚拟机虚拟出了一个 Ubuntu 的操作系统,对于这个操作系统的启动、暂停、删除等管理操作也由 Hypervisor 来完成。

1. Type1 虚拟化

  • Type1 的 Hypervisor 直接在硬件上运行,没有宿主机操作系统。
  • Type1 的 Hypervisor 直接控制硬件资源和客户机,典型框架有 Xen、Vmware、ESX。

2. Type2 虚拟化

  • Type1 的 Hypervisor 运行在一个宿主机操作系统上(Vmware Workstation)或者系统里面。
  • Hypervisor 作为宿主机操作系统种的一个应用,客户机就是在宿主机操作系统上的一个进程。

⭐ 4. 容器的虚拟化实现

  • 容器虚拟化,是位于操作系统层的虚拟化。
  • 通过 namespace 进行各程序的隔离,再加上 cgroups 对资源进行控制,从而实现容器的虚拟化。

🌙 4.1 NameSpace

  • namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让进程只能看到和自己有关的那部分资源,而感知不到其他进程的存在。
namespace 系统调用参数 被隔离的全局系统资源 引入的内核版本 在容器环境下的隔离效果
UTS CLONE_NEWUTS 主机名和域名 2.6.19 每个容器能看到自己的 hostname,拥有独立的主机名和域名
IPC CLONE_NEWIPC 信号量、消息队列、共享内存 2.6.19 同一个 IPC namespace 的进程之间能互相通讯,不同的 IPC namespace 之间不能通信
PID CLONE_NEWPID 进程编号 2.6.24 每个 PID namespace 中的进程可以有其独立的 PID,每个容器可以有其 PID 为 1 的 root 进程
Network CLONE_NEWNET 网络设备、网络栈、端口等 2.6.29 每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号
Mount CLONE_NEWNS 文件系统挂载点 2.4.19 每个容器能看到不同的文件系统层次结构
User CLONE_NEWUSER 用户和用户组 3.8 每个容器可有有不同的 user 和 group id

🌙 4.2 cgroups

1. 什么是 cgroups

  • cgroups(Control Groups)是 Linux 内核提供的一种机制,这种机制可以根据需求将一系列系统任何及其子任务整合 / 分隔到按资源来划分等级的不同组内,从而为系统资源的管理提供一个统一的框架。

    • 说人话就是,将进程按照被限制的资源来进行分组。假设现在有一个 2G 内存组,被分到这个组内的进程就都只能占 2G 的内存。
  • cgroups 可以限制、记录任务组所使用的物理资源。

2. 为什么使用 cgroups

  • cgroups 可以对 CPU、内存等资源实现精细化的控制。
  • 轻量级容器 Docker 就使用率 cgroups 提供的资源限制能力来完成对 CPU、内存等部分的资源控制。
  • 例:在某个 8 核服务器上部署了一个 web 服务和一个后端计算模块,可以使用 cgroups 来让 web 服务使用 6 核,让后端计算模块使用 2 核。

🌙 4.3 Linux 容器 - LXX

  • LXC 是一种操作系统虚拟化技术,是 Linux 内核容器功能的一个用户空间接口。
  • LXC 可以将应用软件系统打包成一个软件容器(Container),该容器内包含了应用软件本身的代码,以及所需要的操作系统核心和库。
  • Docker 是 LXC 的增强版。

🌈 三、Docker 是什么

⭐ 1. Docker 的本质

  • Docker 本质上是 LXC 的增强版,它本身不是容器(容器是 Linux 内核中的技术),而是容器的易用工具。
  • Docker 的主要目标是通过对组件的封装、分发、部署、运行等生命周期的管理,使用户的应用及其运行环境可以做到一次封装、到处运行。

⭐ 2. Docker 和虚拟机的区别

传统虚拟机 Docker 容器
磁盘占用 几 GB ~ 几十 GB 几十 MB ~ 几百 MB
CPU 和内存占用 虚拟操作系统很占 CPU 和内存,需要通过虚拟层调用,占用率高 直接作用于硬件资源,占用少
启动速度 几分钟(从开机到运行项目) 几秒钟(从开启容器到运行项目)
安装管理 要专门的运维技术 安装、管理方便
应用部署 手动部署、速度慢 可以自动化部署、速度快
隔离性 系统级别 进程级别
封装程度 对整个操作系统进行打包 打包项目代码和项目所需要的部分操作系统
相关推荐
藥瓿亭2 分钟前
K8S认证|CKS题库+答案| 5.日志审计
linux·运维·docker·云原生·容器·kubernetes·cka
David爱编程17 分钟前
Docker 存储卷详解:数据持久化的正确打开方式
后端·docker·容器
家庭云计算专家42 分钟前
飞牛云一键设置动态域名+ipv6内网直通访问内网的ssh服务-家庭云计算专家
运维·云计算·ssh·nextcloud·ddns·动态域名解析
藥瓿锻1 小时前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
太阳之神aboluo1 小时前
压测软件-Jmeter
java·运维·jmeter
stormsha2 小时前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
新加坡内哥谈技术3 小时前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
zyjyyds1133 小时前
win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
运维·docker·容器
Altairr3 小时前
Docker基础(一)
运维·docker·容器·eureka
搬运Gong3 小时前
Dockerfile使用与最佳实践
docker·容器·虚悬镜像