Docker 底层原理浅析

本文介绍了Docker的演进历程,从Vagrant到LXC,再到Docker的崛起。重点探讨了Docker的核心技术,包括Chroot、Namespace、cgroups以及联合文件系统(UFS),阐述了如何实现进程隔离和资源管理。并通过实例展示了如何创建和管理容器的资源,以及Docker镜像的存储管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:vitovzhong,腾讯 TEG 应用开发工程师

容器的实质是进程,与宿主机上的其他进程是共用一个内核,但与直接在宿主机执行的进程不同,容器进程运行在属于自己的独立的命名空间。命名空间隔离了进程间的资源,使得 a,b 进程可以看到 S 资源,而 c 进程看不到。

1.  演进

对于统一开发、测试、生产环境的渴望,要远远早于 docker 的出现。我们先来了解一下在 docker 之前出现过哪些解决方案。

1.1 vagrant

Vagarant 是笔者最早接触到的一个解决环境配置不统一的技术方案。它使用 Ruby 语言编写,由 HashCorp 公司在 2010 年 1 月发布。Vagrant 的底层是虚拟机,最开始选用的是 virtualbox。一个个已经配置好的虚拟机被称作 box。用户可自由在虚拟机内部的安装依赖库和软件服务,并将 box 发布。通过简单的命令,就能够拉取 box,将环境搭建起来。

// 拉取一个ubuntu12.04的box
$ vagrant init hashicorp/precise32

// 运行该虚拟机
$ vagrant up

// 查看当前本地都有哪些box
$ vagrant box list


如果需要运行多个服务,也可以通过编写 vagrantfile,将相互依赖的服务一起运行,颇有如今 docker-compose 的味道。

config.vm.define("web") do |web|web.vm.box = "apache"
end
config.vm.define("db") do |db|db.vm.box = "mysql”
end

1.2 LXC (LinuX Container)

在 2008 年,Linux 2.6.24 将 cgroups 特性合入了主干。Linux Container 是 Canonical 公司基于 namespace 和 cgroups 等技术,瞄准容器世界而开发的一个项目,目标就是要创造出运行在 Linux 系统中,并且隔离性良好的容器环境。当然它最早也就见于 Ubuntu 操作系统上。

2013 年,在 PyCon 大会上 Docker 正式面世。当时的 Docker 是在 Ubuntu 12.04 上开发实现的,只是基于 LXC 之上的一个工具,屏蔽掉了 LXC 的使用细节(类似于 vagrant 屏蔽了底层虚拟机),让用户可以一句  docker run  命令行便创建出自己的容器环境。

2.  技术发展

容器技术是操作系统层面的虚拟化技术,可以概括为使用  Linux 内核的 cgroup,namespace 等技术,对进程进行的封装隔离。早在  Docker 之前,Linux 就已经提供了今天的 Docker 所使用的那些基础技术。Docker 一夜之间火爆全球,但技术上的积累并不是瞬间完成的。我们摘取其中几个关键技术节点进行介绍。

2.1 Chroot

软件主要分为系统软件和应用软件,而容器中运行的程序并非系统软件。容器中的进程实质上是运行在宿主机上,与宿主机上的其他进程共用一个内核。而每个应用软件运行都需要有必要的环境,包括一些 lib 库依赖之类的。所以,为了避免不同应用程序的 lib 库依赖冲突,很自然地我们会想是否可以把他们进行隔离,让他们看到的库是不一样的。基于这个朴素的想法,1979 年, chroot 系统调用首次问世。来举个例子感受一下。在 devcloud 上申请的云主机,现在我的 home 目录下准备好了一个 alpine 系统的 rootfs,如下:

在该目录下执行:

chroot rootfs/ /bin/bash

然后将/etc/os-release 打印出来,就看到是”Alpine Linux”

Docker是一种开源的容器化平台,它可以帮助开发者将应用程序及其依赖项打包成一个独立的容器,以实现跨平台的部署和运行。下面是Docker底层原理的简要介绍: 1. 命名空间(Namespaces):Docker使用Linux的命名空间功能来实现容器之间的隔离。命名空间可以将系统资源(如进程、网络、文件系统等)隔离开,使得每个容器都拥有自己独立的资源视图。 2. 控制组(Control Groups):Docker利用Linux的控制组功能来限制和隔离容器对系统资源的使用。控制组可以对CPU、内存、磁盘IO等资源进行限制和分配,确保容器之间不会相互干扰。 3. 联合文件系统(Union File System):Docker使用联合文件系统来构建容器镜像。联合文件系统允许将多个文件系统挂载到同一个目录下,形成一个统一的文件系统视图。这样,Docker可以通过层叠的方式来管理和共享镜像的文件系统,实现镜像的高效复用和快速部署。 4. 容器镜像(Container Image):Docker的容器镜像是一个只读的模板,包含了运行一个容器所需的所有文件和配置。镜像可以通过Dockerfile定义,其中包括了构建镜像所需的步骤和指令。镜像可以通过Docker Hub或私有仓库进行分享和分发。 5. 容器运行时(Container Runtime):Docker使用容器运行时来创建和管理容器。常用的容器运行时包括Docker Engine、containerd等。容器运行时负责解析容器镜像、创建容器、启动进程、管理容器的生命周期等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值