Docker核心原理解析:深入理解Namespace、Cgroups与Rootfs

创始人
2024-12-16 11:07:53
0 次浏览
0 评论

DOCKER总结

Docker是一个开源应用程序容器引擎,允许开发人员将其应用程序和依赖项打包到可移植映像中,然后将其发布到任何流行的Linux或Windows机器,这些机器也可以虚拟化。
容器完全使用沙箱机制,相互之间不会有任何接口。

由于本地开发的程序往往需要部署到服务器上运行,这就导致程序需要运行在不同的环境中,这通常是一件令人头疼的事情。
过去,开发团队需要清楚地告诉运维部署团队所有的配置文件+所有使用的软件环境。
但即便如此,部署失败的情况还是时常发生。

于是,虚拟化技术应运而生。
开发团队将开发的程序运行在虚拟机上,这样就可以解决运维问题。
但由于虚拟机技术的笨重性,其存在资源占用大、冗余步骤多、启动慢等缺点。
这时,一种新的虚拟化技术结合容器化思想出现了,它就是Docker。

下图是虚拟机技术和容器技术架构的对比。
我们可以得出如下总结:

[图片上传失败...(image-efadd2-1643314980201)]](https://upload-images.jianshu.io/upload_images/646931-4b1431b77887632f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如下图所示,Docker采用客户端-服务器(C/S)架构模式,使用远程用于管理和创建Docker容器的API。
服务器端分为三部分:Dockerdaemon、Image、Container。
还有DockerRegistry。

我们先介绍一下Docker中的主要概念

Docker的运行原理如下:客户端可以向服务器端的Dockerdaemon发送docker命令,然后Dockerdamon根据到说明。
从Docker存储库中选择或拉取映像。
然后客户端就可以通过镜像创建容器了。
当我们需要使用程序时,运行相应的容器即可。

需要正确理解仓库/镜像/容器的概念:

除了从仓库拉取镜像外,我们还可以自己创建镜像,这就需要用到Docerfile。

Dockerfile是用于构建Docker镜像的构建文件。
它是由一系列命令和参数组成的脚本。

构建步骤:

在实际场景中,我们会遇到多个Container之间的通信问题。
Docker网络就是用来解决这个问题的技术。
Docker会给每个容器分配一个IP,容器之间可以互相访问。

每台安装了Docker的Linux主机都有一个docker0虚拟网卡。
这是一个使用veth-pair技术的桥接网卡。
Docker使用Linux桥接在主机上虚拟化Docker容器桥(docker0)。
当Docker启动一个容器时,它会根据Docker网桥的网段为容器分配一个IP地址,称为Container-IP。
同时,Docker网桥是每个容器的默认网关。
由于同一主机中的容器都连接到同一个网桥,因此容器可以直接通过容器的Container-IP进行通信。

Docker容器网络很好地利用了Linux虚拟网络技术,在本地主机和容器中分别创建一个虚拟接口,并让它们相互通信(这样的一对接口称为vethpair);

Docker中的网络接口默认是虚拟接口。
虚拟接口的优点是转发效率极高(因为Linux在内核中复制数据,以便在虚拟接口之间转发数据)接口而不通过外部网络设备交换)。
对于本地系统和容器系统来说,虚拟接口与普通以太网卡相比没有什么区别,只是速度快很多。

[图片上传...(image-41d42a-1642627027452-2)]

DockerCompose是一个用于定义和运行多容器应用程序的工具。

DockerCompose的步骤如下:

注意:docker-compose会自动在多个容器之间创建网络以保证通信。

DockerSwarm是Docker的集群管理工具。
它将Docker主机池转变为单个虚拟Docker主机。
DockerSwarm为任何已经与Docker守护进程通信的工具提供标准DockerAPI。
两者都可以使用Swarm轻松扩展到多个主机。

Docker是一个开源应用程序容器引擎。
它的出现,大大简化了运维难度,提高了运维效率。
以前我们需要在服务器上安装程序所需的所有依赖,现在只需要编写docker-compose和Dokefile脚本就可以一键运行程序了。
在企业级应用中,我们不可避免地会用到Docker和容器化技术。

深入理解Docker核心原理:Namespace、Cgroups和Rootfs

深入理解Docker核心原理:Namespace、Cgroups、Rootfs本文将深入剖析Docker容器实现的核心原理,重点关注Namespace、Cgroups、Rootfs等三个关键功能。
首先想一下容器和进程的区别,Linux容器如Docker和Namespace技术可以用来隔离进程视图,因此容器和主机可以进行多个级别的隔离。
Linux命名空间包括网络命名空间、PID命名空间等。
不同的资源,如网络、进程等,可以通过这些命名空间进行隔离。
命名空间的最大问题是不完全隔离。
为了提高安全性,出现了Firecracker、gVisor、Kata等不共享内核的沙箱容器。
Docker通过命名空间强制隔离,确保容器独立性。
在资源限制方面,Docker实现了Cgroups技术。
启动容器时,您可以指定CPU和内存等资源限制。
以CPU限制为例,在Cgroups目录下创建一个控制组,并配置资源限制来限制进程。
例如,一个进程只能使用0.5个CPU核心。
Cgroups设计简单且易于使用。
定义进程组的资源限制,包括CPU、内存、磁盘、带宽等。
在Linux上,Cgroup显示为文件系统,可以通过mount命令查看。
对于容器镜像来说,它由一系列rootfs层组成,每个层包含操作系统、目录和配置文件,但不包含内核。
Rootfs对操作系统、应用程序和依赖项进行了封装,保证应用程序在不同环境下的稳定运行。
容器启动时,将rootfs挂载到根目录。
镜像层概念简化了rootfs的复用,多个层通过Union文件系统合并挂载。
镜像包含静态文件,容器内生成实时数据,实现容器根的读写分区。
Init层用于存储容器启动时需要初始化的配置信息,如/etc/hosts、/etc/resolv.conf等,以避免在渲染图像时包含这些动态数据。
综上所述,Docker容器的核心原理集中在Namespace、Cgroups和Rootfs的功能上,通过这些机制实现容器独立性、资源管理和镜像构建,推动了云原生技术的发展。
欢迎关注微信公众号,获取更多原生云技术内容和资讯。
文章标签:
Docker 容器
热门文章
1
Redisson分布式锁深度解析:Red... Redis实现分布式锁+Redisson源码解析在某些场景下,多个进程需要以互斥...

2
深度解析Docker:容器技术提升应用部... docker是什么Docker是一种强大的开源容器技术,它将应用程序及其所有依赖...

3
Docker dockercp命令:容器... Dockercp命令详解:在Docker容器和主机之间复制文件/...

4
Redis KEY模糊查询优化策略及SC... RedisKEY*模糊查询导致交互速度慢、阻塞其他Redis操作在Redis中使...

5
Redisson深度解析:分布式锁实战与... Redis:redis分布式锁实战之redisson在分布式环境中;个体锁不能再...

6
Python float()函数:Web... Pythonfloat(input())的用法,web中的应用float(inp...

7
Java单例模式深入解析及实例代码分享 单例模式单例模式实例在Java中,单例模式确保类只存在一个实例。该模式的主要作用...

8
Docker核心原理解析:深入理解Nam... DOCKER总结Docker是一个开源应用程序容器引擎,允许开发人员将其应用程序...

9
C语言字符串输出技巧:指针与数组首地址的... C语言字符串输出Chara[]="aaaaa";printf...

10
200本Java开发精选书籍免费分享!附... Java开发书籍推荐(200多本)我整理了一份Java开发的邮件资源,一共大概2...