漫谈容器化技术(docker原理篇)

简介: 漫谈容器化技术(docker原理篇)

01 前言

在之前,写过了一篇《漫谈容器化技术》,主要就是讲解了容器化技术的由来、发展以及技术,有兴趣的童鞋可以参阅下:https://yanglinwei.blog.csdn.net/article/details/121761856

大家都知道docker是容器化技术的一个工具,而且是很多容器化技术的基础,其地位在十分重要,本文来详细讲解docker的原理。

02 docker简介

docker的官网,可以看到是这样描述docker的:

Developers Love Docker.
Businesses Trust It.
Build safer, share wider, run faster:

翻译为:

Docker最受开发人员的喜爱。
企业信任它。
Docker构建更安全,共享更广泛,运行更快

docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的LinuxWindows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

特点开源、虚拟化、沙箱隔离机制

03 docker原理

《漫谈容器化技术》已经描述了虚拟化与容器化的区别,整体如下:

特性 虚拟机 容器
隔离级别 操作系统级 进程级别
隔离策略 Hypervisor CGroups
系统资源 5%~15% 0%~5%
启动时间 分钟级 秒级
镜像存储 GB-TB KB-MB
集群规模 上百 上万
高可用策略 备份、容灾、迁移 弹性、负载、动态

3.1 虚拟机隔离技术

从图,可以看到虚拟机(VM)本质是一个软件,其具有完整硬件系统功能的、VM间隔离,类似于完整计算机系统。我们都知道操作系统的本质是一个软件,VM这样做就是在真实的操作系统下在新建一个或多个子操作系统(区别这些操作系统资源可控)。

虚拟机(VM)是通过 Hypervisor 技术进行 虚拟机运行环境与计算机体系的建立 ,并通过该技术进行资源控制。由于篇幅有限,这里没有深入去讲解 Hypervisor的概念,不是本文的重点,有表层认知就可以了。

3.2 容器化隔离技术

docker充当着软件的角色运行在我们的操作系统,其实它是一个进程,利用操作系统提供的各种功能实现了进程间网络、空间、权限等隔离,让多个 docker容器进程相互不知道彼此的存在。

虚拟机技术与容器技术的最大区别在于:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核

说到docker的隔离技术,就很有必要了解Linux的资源隔离技术(Namespace)、资源限制技术(Cgroups)、分层技术(Union File System)。

3.2.1 Namespace-资源隔离技术

Linux Namespace(Linux 命名空间)是Linux内核(Kernel)提供的功能,它可以隔离一系列的系统资源,如PIDUser IDNetworkFile System等。

Linux 主要提供 6 种不同类型的Namespace :

Namespace类型 描述
Mount 隔离文件系统挂载点
UTS 隔离HostName与DomianName
IPC 隔离进程间通信
PID 隔离进程ID
Network 隔离网络
User 隔离用户和用户组

下面举例两个场景来熟悉Namespace

情景一: 比如我们分配计算机的资源给一些用户,我们可以使用User Namespace对不同的用户进行隔离,而用户在自己的命名空间内具有root 权限,但在真实物理机中,用户只操作了自己的空间的内容,这就解决了用户间隔离的问题。

情景二: 而用户在自己的User Namespace里,也进行了PID NameSpace隔离,对于这些用户来说,分配的命名空间就像一台新的Linux,有自己的 init 进程(初始进程,PID 为 1),其他进程的 PIDinit进程 PID 上递增。

Linux关于Namespace有3个API:

clone(): 创建新进程,根据系统调用 flags 来决定哪种类型 Namespace 将会被创建,而该进程的子进程也会包含这些 Namespace

setns () 将进程加入到已存在的 Namespace 中。

unshare () 将进程移出某个 Namespace

这里可以看到:docker 就是利用 Linux Namespace开放的API来实现多个 docker 容器相互隔离,使其具有独立环境的功能

3.2.2 Cgroups-资源限制技术

从上面可以看到docker是使用了Linux Namespace技术来实现了用户空间及进程的隔离,使用户觉得自己是在使用一个新的Linux系统,那么docker是如何限制用户在自己空间内的资源使用的呢?这里就使用到了Linux Cgroups资源限制技术了。

Linux Cgroups(Linux Contorl Groups,简称 Cgroups):可以对一组进程及这些进程的子进程进行资源限制、控制和统计的能力,其中包括 CPU、内存、存储、网络、设备访问权限等,通过 Cgroups 可以很轻松的限制某个进程的资源占用并且统计该进程的实时使用情况。

说白了,可以把Cgroups看作是Linux一个资源限制功能,提供APIdocker使用,docker只要调用其API就可以对当前用户NameSpace命名空间内的资源进行限制以及查看

Cgroups 由 3 个组件构成:分别是 cgroup(控制组)、subsystem(子系统)以及 hierarchy(层级树)

cgroup: 是对进程分组管理的一种机制,一个 cgroup通常包含一组(多个)进程,Cgroups 中的资源控制都以 cgroup为单位实现。

subsystem :是一组(多个)资源控制的模块,每个 subsystem 会管理到某个 cgroup 上,对该 cgroup中的进程做出相应的限制和控制。

hierarchy :会将一组(多个) cgroup 构建成一个树状结构,Cgropus可以利用该结构实现继承等功能

3.2.3 Union File System-分层技术

docker镜像是一种分层结构,每一层构建在其它层之上,从而实现增量增加内容的功能,这是如何实现的?这里用到了LinuxUnion File System分层技术。

Union File System(简称,UnionFS):是为 Linux 系统设计的将其他文件系统联合到一个联合挂载点的文件系统服务。UnionFS使用 branch(分支)将不同文件系统的文件和目录透明地叠加覆盖,形成一个单一一致的文件系统,此外 UnionFS 使用写时复制(Copy on Write,简称,CoW)技术来提高合并后文件系统的资源利用。

其实docker镜像分层、增量增加就是利用UnionFS功能,在基础的文件系统上增量的增加新的文件系统,通过叠加覆盖的形式最终形成一个文件系统,同时这也导致了运行 docker 容器如果没有指定 volume(数据卷)或 bind mount,则 docker 容器结束后,运行时产生的数据便丢失了(一般会指定宿主主机的目录)

04 小结

本文主要讲解了docker的概念以及原理,整理下:

  • docker是一个开源的应用容器引擎,它有开源、虚拟化、沙箱隔离机制的特点;
  • docker使用Namespace来实现多个容器相互隔离,使其具有独立环境的功能;
  • docker使用Cgroups对用户NameSpace命名空间内的资源使用进行限制与监控;
  • docker使用UnionFS实现分层结构与增量更新等功能。

这里需要说的是,docker不止使用了NamespaceCgroupsUnionFS这三种核心技术,还使用了很多其其它技术,本文就没有详述了。

本文或许存在纰漏之处,欢迎大家留言指出并关注。本文完!

目录
相关文章
|
30天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
26天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
188 77
|
7天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
75 35
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
6天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
12天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
39 4
|
28天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
87 3
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
108 7
|
1月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
78 3
|
1月前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
37 2