【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 和内存,需要通过虚拟层调用,占用率高 直接作用于硬件资源,占用少
启动速度 几分钟(从开机到运行项目) 几秒钟(从开启容器到运行项目)
安装管理 要专门的运维技术 安装、管理方便
应用部署 手动部署、速度慢 可以自动化部署、速度快
隔离性 系统级别 进程级别
封装程度 对整个操作系统进行打包 打包项目代码和项目所需要的部分操作系统
相关推荐
Rsingstarzengjx3 小时前
搭建Jenkins gitlab 环境
运维·服务器
君之嘞5 小时前
【操作系统基础】认识操作系统:系统调用
linux·运维·microsoft
爱倒腾的老唐6 小时前
07、Linux 文件管理
linux·运维·服务器
24zhgjx-fuhao6 小时前
基于时间的ACL
运维·网络
Raymond运维7 小时前
MySQL包安装 -- RHEL系列(离线RPM包安装MySQL)
linux·运维·数据库·mysql
心灵宝贝7 小时前
libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)
linux·运维·服务器
btyzadt7 小时前
Ubuntu中安装Nuclei教程
linux·运维·ubuntu
养生技术人7 小时前
Oracle OCP认证考试题目详解082系列第45题
运维·数据库·sql·oracle·开闭原则·ocp
致宏Rex8 小时前
Docker 完整教程(3,4) | 网络与挂载
运维·docker·容器
倔强的石头1068 小时前
【Linux指南】gdb进阶技巧:断点高级玩法与变量跟踪实战
linux·运维