漫谈容器化技术(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这三种核心技术,还使用了很多其其它技术,本文就没有详述了。

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

目录
相关文章
|
2天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
8天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
16 1
|
6天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
7天前
|
Cloud Native 持续交付 Docker
深入解析Docker容器化技术及其在生产环境中的应用
深入解析Docker容器化技术及其在生产环境中的应用
10 0
|
8天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
23 0
|
1月前
|
应用服务中间件 Shell nginx
Docker容器操作基础命令
关于Docker容器操作基础命令的教程,涵盖了从启动、查看、删除容器到端口映射和容器信息获取的一系列常用命令及其使用方法。
63 14
|
2月前
|
存储 Docker 容器
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
|
3月前
|
Shell 应用服务中间件 nginx
docker 服务,镜像,容器命令总结
docker 服务,镜像,容器命令总结
141 4
|
4月前
|
Shell Docker 容器
深入探索Docker容器管理:常用命令一览(1)
深入探索Docker容器管理:常用命令一览(1)
下一篇
无影云桌面