资讯动态

【Docker】简介

发布时间:2026/8/19 14:39:52 来源:尧图企业网站定制
个人主页秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 系列专栏Docker_秦jh_的博客-CSDN博客​​​​目录Docker 简介什么是虚拟化、容器化虚拟化实现方式应用程序执行环境分层虚拟化常见类别虚拟机容器JVM之类的虚拟机常见虚拟化实现主机虚拟化(虚拟机)实现容器虚拟化实现容器虚拟化实现原理容器虚拟化基础之NameSpace空间隔离容器虚拟化基础之cgroups资源控制容器虚拟化基础之LXCLXC容器化Docker 是什么Docker 本质Docker 的引擎迭代Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高启动快Docker 和JVM虚拟化的区别Docker 架构官方架构前言 hello! 各位铁子们大家好哇。今日更新了Docker相关内容 欢迎大家关注点赞收藏⭐️留言Docker 简介什么是虚拟化、容器化物理机实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理 机提供给虚拟机以硬件环境有时也称为“寄主”或“宿主”。虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上 同时运行多个逻辑计算机每个逻辑计算机可运行不同的操作系统并且应用程序都 可以在相互独立的空间内运行而互不影响从而显著提高计算机的工作效率。容器化容器化是一种虚拟化技术又称操作系统层虚拟化Operating system level virtualization这种技术将操作系统内核虚拟化可以允许用户空间软件实例 instances被分割成几个独立的单元在内核中运行而不是只有一个单一实例运 行。这个软件实例也被称为是一个容器containers。对每个实例的拥有者与用户 来说他们使用的服务器程序看起来就像是自己专用的。容器技术是虚拟化的一种。 docker 是现今容器技术的事实标准。案例举个生活中的例子。 物理机如下就像一个庄园独立占用了一块土地花园都是自己的其他人无法共 享使用。虚拟机相当于开发商的一个楼盘一栋楼一套房子一户人家共享一块宅基地共享 小区的花园共享小区的游乐设施。容器相当于在1个房子里面开辟出来一个又一个的胶囊公寓共享这套房子的卫生 间、共享厨房、共享WiFi只有衣服、电脑等私人物品是你自己的。虚拟化实现方式应用程序执行环境分层硬件层提供硬件抽象包括指令集架构、硬件设备及硬件访问接口操作系统层 提供系统调用接口管理硬件资源程序库层提供数据结构定义及函数调用接口虚拟化常见类别虚拟机存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口 将一个操作系统以及操作系统层以上的层嫁接到硬件上实现和真实物理机几乎一样 的功能。比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机就能够用这台 电脑打开 Android 系统上的应用。容器存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口 将函数库层以上的功能置于操作系统上。以 Docker 为例其就是一个基于 Linux 操作 系统的 Namespace 和 Cgroup 功能实现的隔离容器可以模拟操作系统的功能。简单 来说如果虚拟机是把整个操作系统封装隔离从而实现跨平台应用的话那么容器 则是把一个个应用单独封装隔离从而实现跨平台应用。所以容器体积比虚拟机小很多理论上占用资源更少。容器化就是应用程序级别的虚拟化技术。容器提供了将应 用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容 器共享一个内核操作系统它安装在硬件上。JVM之类的虚拟机存在于函数库层和应用程序之间的虚拟化技术。Java 虚拟机同样具有跨平台特性所 谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库 的JVM 就是在应用层与函数库层之间建立一个抽象层对下通过不同的版本适应不 同的操作系统函数库对上提供统一的运行环境交给程序和开发者使开发者能够调 用不同操作系统的函数库。常见虚拟化实现主机虚拟化(虚拟机)实现主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可 以在物理服务器和客户操作系统之间建立虚拟机使得它们可以独立运行。从软件框架的角度上根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之 上将虚拟化划分为Type1和Type2.Type1类的Hypervisor(Hypervisor 是一种系统软件它充当计算机硬件和虚拟机之间 的中介负责有效地分配和利用由各个虚拟机使用的硬件资源这些虚拟机在物理主 机上单独工作因此Hypervisor也称为虚拟机管理器。)直接运行在硬件之上没有 宿主机操作系统Hypervisor直接控制硬件资源和客户机。典型框架为Xen、Vmware ESX。Type2类的Hypervisor运行在一个宿主机操作系统之上Vmware Workstation或者 系统里面,Hypervisor作为宿主机操作系统中的一个应用程序客户机就是在宿主机操 作系统上的一个进程。容器虚拟化实现容器虚拟化实现原理容器虚拟化有别于主机虚拟化是操作系统层的虚拟化。通过namespace进行各程 序的隔离加上cgroups进行资源的控制以此来进行虚拟化。容器虚拟化基础之NameSpace什么是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可以使用 | (按位或)组合 这些参数。举个例子三年一班的小明和三年二班的小明虽说他们名字是一样的但是所在班级不一样 那么在全年级排行榜上面即使出现两个名字一样的小明也会通过各自的学号来 区分。对于学校来说每个班级就相当于是一个命名空间这个空间的名称是班级号。 班级号用于描述逻辑上的学生分组信息至于什么学生分配到1班什么学生分配到 2班那就由学校层面来统一调度。以上命名空间在容器环境下的隔离效果UTS每个容器能看到自己的hostname拥有独立的主机名和域名。IPC同一个IPC namespace的进程之间能互相通讯不同的IPC namespace之间 不能通信。PID每个PID namespace中的进程可以有其独立的PID每个容器可以有其PID为 1的root进程。Network每个容器用有其独立的网络设备IP地址IP路由表/proc/net目录端 口号。Mount每个容器能看到不同的文件系统层次结构。 User每个container可以有不同的user和group id。想想以下如果我们要隔离两个进程需要怎么办首先容器进程与进程之间需要隔离所以需要PID隔离首先容器A进程不能读取容器B进程通讯内容需要隔离信号量等所以需要IPC 隔离首先容器A进程不能读取容器B进程的文件所以需要Mount隔离首先容器A进程不能读取容器B进程的socket所以需要网络隔离、主机隔离Docker 允许用户在主机和容器间共享文件夹同时不需要限制容器的访问权限 这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。空间隔离参考《空间隔离》文章容器虚拟化基础之cgroups什么是cgroupscgroups(Control Groups) 是 linux 内核提供的一种机制这种机制可以根据需求把一 系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内从而为系统资源 管理提供一个统一的框架。简单说cgroups 可以限制、记录任务组所使用的物理资 源。本质上来说cgroups 是内核附加在程序上的一系列钩子(hook)通过程序运行时 对资源的调度触发相应的钩子以达到资源追踪和限制的目的。为什么使用cgroups其可以做到对 cpu内存等资源实现精细化的控制目前越来越火的轻量级容器Docker 及k8s中的pod就使用了 cgroups 提供的资源限制能力来完成cpu内存等部 分的资源控制。比如在一个既部署了前端 web 服务也部署了后端计算模块的八核服务器上可以使 用 cgroups 限制 web server 仅可以使用其中的六个核把剩下的两个核留给后端计算 模块。cgroups 的用途Resource limitation: 限制资源使用例内存使用上限/cpu的使用限制Prioritization: 优先级控制例CPU利用/磁盘IO吞吐Accounting: 一些审计或一些统计Control: 挂起进程/恢复执行进程cgroups 可以控制的子系统资源控制参考《资源控制》文章容器虚拟化基础之LXCLXC是什么LXCLinuX ContainersLinux容器一种操作系统层虚拟化技术为Linux内核容 器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器Container 内含应用软件本身的代码以及所需要的操作系统核心和库。透过统一的名字空间和 共享 API 来分配不同软件容器的可用硬件资源创造出应用程序的独立沙箱运行环境 使得Linux用户可以容易的创建和管理系统或应用容器。LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了 容器技术使用的一个方案LXC虽然极大的简化了容器技术的使用但比起直接通过内核调用来使用容器技术 其复杂程度其实并没有多大降低因为我们必须要学会LXC的一组命令工具且由于 内核的创建都是通过命令来实现的通过批量命令实现数据迁移并不容易。其隔离性 也没有虚拟机那么强大。后来就出现了docker所以从一定程度上来说docker就是LXC的增强版。LXC容器化参考《LXC容器化》文章Docker 是什么Docker 本质Docker 本质其实是LXC之类的增强版它本身不是容器而是容器的易用工具。容 器是linux内核中的技术Docker只是把这种技术在使用上简易普及了。Docker在早 期的版本其核心就是LXC的二次封装发行版。Docker 作为容器技术的一个实现或者说让容器技术普及开来的最成功的实现。 Docker 是基于Go语言实现的一个开源项目它的主要目标是“BuildShip and Run Any APPAnywhere”即通过对组件的封装、分发、部署、运行等生命周期的 管理使得用户的应用及其运行环境能够做到“一次封装到处运行”。早期Docker利用LXC做容器管理引擎但是在创建容器时不再使用模板去安装生 成而是通过镜像技术把一个操作系统用户空间所需要使用到的组件事先编排好 并整体打包成一个文件image文件镜像文件集中放在一个仓库中。当需要创建容 器时Docker调用LXC的工具lxc-create但不再通过lxc的模板去安装而是连接 到镜像服务器上下载匹配的镜像文件而后基于镜像启动容器。所以Docker极大的 简化了容器的使用难度。以后我们创建启动容器只需要一个命令docker-run docker-stop 就可以启动停止一个容器了。Docker 的引擎迭代Docker 早期是基于LXC容器管理引擎实现当后来成熟之后Docker自建了一个容 器引擎叫libcontainer后来CNCF的介入Docker又研发了一个工业化标准的容器 引擎runC目前所使用的新版Docker所使用的容器引擎就是RunC。Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高启动快docker 有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化运 行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利 用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核而不需要 Guest OS节省了Guest OS占用的资源。docker 不需要Guest OS创建一个容器时不需要和虚拟机一样重新加载一个操作 系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程当新建一个 虚拟机时虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个 docker 容器只需要几秒钟。Docker 和JVM虚拟化的区别Docker 架构官方架构Docker 使用客户端-服务器 (C/S) 架构模式使用远程API来管理和创建Docker容器。 Docker 容器通过 Docker 镜像来创建。Docker 仓库(Registry)Docker 仓库用来保存镜像可以理解为代码控制中的代码仓库。Docker Hub供了庞 大的镜像集合供使用。Docker daemonDocker daemon 是服务器组件是 Docker 最核心的后台进程我们也把它称为守护 进程。Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用Docker API 与 Docker 的守护进程通信。Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板。Docker 容器(Container)容器是独立运行的一个或一组应用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价