千家信息网

怎样实现Docker容器的底层技术

发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,今天就跟大家聊聊有关怎样实现Docker 容器的底层技术,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为了更好地理解容器的特性,我们将讨论容器
千家信息网最后更新 2024年09月25日怎样实现Docker容器的底层技术

今天就跟大家聊聊有关怎样实现Docker 容器的底层技术,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

为了更好地理解容器的特性,我们将讨论容器的底层实现技术。
cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额, namespace 实现资源隔离。

cgroup

cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。相信你已经猜到了:前面我们看到的--cpu-shares-m--device-write-bps 实际上就是在配置 cgroup。

cgroup 到底长什么样子呢?我们可以在 /sys/fs/cgroup 中找到它。还是用例子来说明,启动一个容器,设置 --cpu-shares=512

查看容器的 ID

在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名

目录中包含所有与 cpu 相关的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值为 512。

同样的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是内存以及 Block IO 的 cgroup 配置。

namespace

在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。

Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离

Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User,下面我们分别讨论。

Mount namespace

Mount namespace 让容器看上去拥有整个文件系统。

容器有自己的 / 目录,可以执行 mountumount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。

UTS namespace

简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h--hostname 参数设置。

IPC namespace

IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。

PID namespace

我们前面提到过,容器在 host 中以进程的形式运行。例如当前 host 中运行了两个容器:


通过 ps axf 可以查看容器进程

所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。 如果我们进入到某个容器,ps 就只能看到自己的进程了。

而且进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的 init 进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。

Network namespace

Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。我们会在后面网络章节详细讨论。

User namespace

User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。

在容器中创建了用户 cloudman,但 host 中并不会创建相应的用户。

首先通过大量实验学习了容器的各种操作以及容器状态之间如何转换,然后讨论了限制容器使用 CPU、内存和 Block IO 的方法,最后学习了实现容器的底层技术:cgroup 和 namespace。

下面是容器的常用操作命令:

create 创建容器

run 运行容器

pause 暂停容器

unpause 取消暂停继续运行容器

stop 发送 SIGTERM 停止容器

kill 发送 SIGKILL 快速停止容器

start 启动容器

restart 重启容器

attach attach 到容器启动进程的终端

exec 在容器中启动新进程,通常使用 "-it" 参数

logs 显示容器启动进程的控制台输出,用 "-f" 持续打印

rm 从磁盘中删除容器

看完上述内容,你们对怎样实现Docker 容器的底层技术有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

容器 进程 资源 技术 网卡 底层 内存 用户 目录 独立 运行 配置 内容 就是 文件 系统 参数 只有 命令 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 医院设备管理系统软件开发 缓存跟数据库该怎么设计 app软件开发开题报告 签名验签服务器安全管理制度 个人网络技术 丽水网络安全准入控制系统报价 杭州言之成网络技术公司 国家监察网络安全 网络技术云计算方向 微信服务器哪个好用 中通信息公司网络技术深圳分公司 微信网页登陆服务器痕迹 举办ctf网络安全大赛的目的 河北志成网络技术 长城底层软件开发 计算机网络技术windows 张家界软件开发中介 软件开发选择哪个行业比较好 a股最纯正的网络安全公司排名 鞍山 银行招软件开发吗 校级网络安全应急预案 软件开发企业资产负债表 医疗保险缴费服务器不可用 网络安全防护体系建设工作 嘉定区网络软件开发制品价格 网络安全 老师 app如何访问数据库 张家港运营网络技术哪家好 动漫计算机网络技术基础西瓜视频 手机出现服务器连接错误为什么
0