皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

容器的四大基础技术

命名空间、控制组、seccomp 和 SELinux 构成了在系统上构建和运行一个容器进程的 Linux 技术基础。

在以前的文章中,我介绍过 容器镜像 及其  运行时。在本文中,我研究了容器是如何在一些特殊的 Linux 技术基础上实现的,这其中包括命名空间和控制组。

容器的四大基础技术

图1:对容器有贡献的 Linux 技术(Nived Velayudhan,  CC BY-SA 4.0)

这些 Linux 技术构成了在系统上构建和运行容器进程的基础:

  1. 命名空间
  2. 控制组(cgroups)
  3. Seccomp
  4. SELinux

命名空间

命名空间namespace 为容器提供了一个隔离层,给容器提供了一个看起来是独占的 Linux 文件系统的视图。这就限制了进程能访问的内容,从而限制了它所能获得的资源。

在创建容器时,Docker 或 Podman 和其他容器技术使用了 Linux 内核中的几个命名空间:

  1. [nivedv@homelab ~]$ docker container run alpine ping 8.8.8.8
  2. [nivedv@homelab ~]$ sudo lsns -p 29413
  3. NS TYPE NPROCS PID USER COMMAND
  4. 4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --switched...
  5. 4026531837 user 278 1 root /usr/lib/systemd/systemd --switched...
  6. 4026533105 mnt 1 29413 root ping 8.8.8.8
  7. 4026533106 uts 1 29413 root ping 8.8.8.8
  8. 4026533107 ipc 1 29413 root ping 8.8.8.8
  9. 4026533108 pid 1 29413 root ping 8.8.8.8
  10. 4026533110 net 1 29413 root ping 8.8.8.8

用户

用户(user)命名空间将用户和组隔离在一个容器内。这是通过分配给容器与宿主系统有不同的 UID 和 GID 范围来实现的。用户命名空间使软件能够以 root 用户的身份在容器内运行。如果入侵者攻击容器,然后逃逸到宿主机上,他们就只能以受限的非 root 身份运行了。

挂载

挂载(mnt)命名空间允许容器有自己的文件系统层次结构视图。你可以在 Linux 系统中的 /proc/<PID>/mounts 位置找到每个容器进程的挂载点。

UTS

Unix 分时系统Unix Timeharing System(UTS)命名空间允许容器拥有一个唯一主机名和域名。当你运行一个容器时,即使使用 - name 标签,也会使用一个随机的 ID 作为主机名。你可以使用  unshare 命令 来了解一下这个工作原理。

  1. nivedv@homelab ~]$ docker container run -it --name nived alpine sh
  2. / # hostname
  3. 9c9a5edabdd6
  4. / #
  5. nivedv@homelab ~]$ sudo unshare -u sh
  6. sh-5.0# hostname isolated.hostname
  7. sh-5.0# hostname
  8. isolated.hostname
  9. sh-5.0#
  10. sh-5.0# exit
  11. exit
  12. [nivedv@homelab ~]$ hostname
  13. homelab.redhat.com

IPC

进程间通信Inter-Process Communication(IPC)命名空间允许不同的容器进程之间,通过访问共享内存或使用共享消息队列来进行通信。

  1. [root@demo /]# ipcmk -M 10M
  2. Shared memory id: 0
  3. [root@demo /]# ipcmk -M 20M
  4. Shared memory id: 1
  5. [root@demo /]#
  6. [root@demo /]# ipcs
  7. ------ Message Queues --------
  8. key msqid owner perms used-bytes messages
  9. ------ Shared Memory Segments --------
  10. key shmid owner perms bytes nattch status
  11. 0xd1df416a 0 root 644 10485760 0
  12. 0xbd487a9d 1 root 644 20971520 0
  13. ------ Semaphore Arrays --------
  14. key semid owner perms nsems

PID

进程 IDProcess ID(PID)命名空间确保运行在容器内的进程与外部隔离。当你在容器内运行 ps 命令时,由于这个命名空间隔离的存在,你只能看到在容器内运行的进程,而不是在宿主机上。

网络

网络(net)命名空间允许容器有自己网络接口、IP 地址、路由表、端口号等视图。容器如何能够与外部通信?你创建的所有容器都会被附加到一个特殊的虚拟网络接口上进行通信。

  1. [nivedv@homelab ~]$ docker container run --rm -it alpine sh
  2. / # ping 8.8.8.8
  3. PING 8.8.8.8 (8.8.8.8): 56 data bytes
  4. 64 bytes from 8.8.8.8: seq=0 ttl=119 time=21.643 ms
  5. 64 bytes from 8.8.8.8: seq=1 ttl=119 time=20.940 ms
  6. ^C
  7. [root@homelab ~]# ip link show veth84ea6fc
  8. veth84ea6fc@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
  9. master docker0 state UP mode DEFAULT group default

控制组

控制组(cgroup)是组成一个容器的基本模块。控制组会分配和限制容器所使用的资源,如 CPU、内存、网络 I/O 等。容器引擎会自动创建每种类型的控制组文件系统,并在容器运行时为每个容器设置配额。

  1. [root@homelab ~]# lscgroup | grep docker
  2. cpuset:/docker
  3. net_cls,net_prio:/docker
  4. cpu,cpuacct:/docker
  5. hugetlb:/docker
  6. devices:/docker
  7. freezer:/docker
  8. memory:/docker
  9. perf_event:/docker
  10. blkio:/docker
  11. pids:/docker

容器运行时为每个容器设置了控制组值,所有信息都存储在 /sys/fs/cgroup/*/docker。下面的命令将确保容器可以使用 50000 微秒的 CPU 时间片,并将内存的软、硬限制分别设置为 500M 和 1G。

  1. [root@homelab ~]# docker container run -d --name test-cgroups --cpus 0.5 --memory 1G --memory-reservation 500M httpd
  2. [root@homelab ~]# lscgroup cpu,cpuacct:/docker memory:/docker
  3. cpu,cpuacct:/docker/
  4. cpu,cpuacct:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84
  5. memory:/docker/
  6. memory:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84
  7. [root@homelab c....c84]# cat cpu.cfs_period_us
  8. 100000
  9. [root@homelab c....c84]# cat cpu.cfs_quota_us
  10. 50000
  11. [root@homelab c....c84]# cat memory.soft_limit_in_bytes
  12. 524288000
  13. [root@homelab c....c84]# cat memory.limit_in_bytes
  14. 1073741824

SECCOMP

Seccomp 意思是“安全计算secure computing”。它是一项 Linux 功能,用于限制应用程序进行的系统调用的集合。例如,Docker 的默认 seccomp 配置文件禁用了大约 44 个系统调用(总计超过 300 个)。

这里的思路是让容器只访问所必须的资源。例如,如果你不需要容器改变主机上的时钟时间,你可能不会使用 clock_adjtime 和 clock_settime 系统调用,屏蔽它们是合理的。同样地,你不希望容器改变内核模块,所以没有必要让它们使用 create_module、 delete_module 系统调用。

SELinux

SELinux 是“安全增强的 Linuxsecurity-enhanced Linux”的缩写。如果你在你的宿主机上运行的是 Red Hat 发行版,那么 SELinux 是默认启用的。SELinux 可以让你限制一个应用程序只能访问它自己的文件,并阻止任何其他进程访问。因此,如果一个应用程序被破坏了,它将限制该应用程序可以影响或控制的文件数量。通过为文件和进程设置上下文环境以及定义策略来实现,这些策略将限制一个进程可以访问和更改的内容。

容器的 SELinux 策略是由 container-selinux 包定义的。默认情况下,容器以 container_t 标签运行,允许在 /usr 目录下读取(r)和执行(x),并从 /etc 目录下读取大部分内容。标签container_var_lib_t 是与容器有关的文件的通用标签。

总结

容器是当今 IT 基础设施的一个重要组成部分,也是一项相当有趣的技术。即使你的工作不直接涉及容器化,了解一些基本的容器概念和方法,也能让你体会到它们如何帮助你的组织。容器是建立在开源的 Linux 技术之上的,这使它们变得更加美好。

本文基于  techbeatly 的文章,并经授权改编。


via:  https://opensource.com/article/21/8/container-linux-technology

作者:Nived V 选题:lujun9972 译者:wxy 校对:turbokernel

本文由 LCTT 原创编译,Linux中国 荣誉推出

转自 https://linux.cn/article-13792-1.html

相关推荐

  • 每日文章精选 2024 05 30
  • 每日文章精选 2024 05 29
  • 每日文章精选 2024 05 28
  • 每日文章精选 2024 05 27
  • 每日文章精选 2024 05 26
  • 每日文章精选 2024 05 25
  • 每日文章精选 2024 05 24
  • 每日文章精选 2024 05 23

近期文章

最新评论

  • zhujun_sh 16小时前说:
    追求最先进的芯片制程工艺远远没有用好硬件,做扎实测试,建设完善的安全系统和构建有文化的软件工具链和生态来的重要!
  • zhujun_sh 1天前说:
    使用 HTTP/3 时,处理特制的 QUIC 会话时,可能会导致工作进程崩溃、工作进程内存泄露(在MTU大于4096字节的系统上 在 MTU 大于 4096 字节的系统上可能导致工作进程内存泄露,或造
  • 微博音频 3天前说:
    微博已支持音频服务,一起来#听见微博#发现你喜爱的音频作者吧~
  • 杜蕾斯这厮 2周前 (05-20)说:
    intel现在是蒸蒸日下
  • 东莞文老师 2周前 (05-15)说:
    这个发行版是不是特别适合安装Oracle database ?
  • zhujun_sh 3周前 (05-13)说:
    龙芯这是要往GPU的路线发展吗?
  • zhujun_sh 3周前 (05-13)说:
    为 LoongArch 架构添加了对 ORC 堆栈解扰器和内核实时补丁的支持,缓解了影响 Intel Atom 处理器的 RFDS(寄存器文件数据采样)漏洞,并为 RISC-V 架构添加了对 memb
  • zhujiang15 3周前 (05-12)说:
    反向工程,需要重写全部 windows api,非常的刺激。[哈哈][哈哈][哈哈]

分类目录

  • Unix家族
  • 人物介绍
  • 企业应用
  • 企鹅看世界
  • 使用经验
  • 开源美图
  • 开源资讯
  • 技术前沿
  • 数据库类
  • 新手入门
  • 未分类
  • 极客漫画
  • 版本更新资讯
  • 系统安全
  • 系统管理
  • 编程开发
  • 网站头条
  • 观点评论
  • 软件更新资讯

深圳SEO优化公司济宁seo网站推广宝安百姓网标王报价运城建站多少钱鹤壁SEO按天收费多少钱乌海企业网站改版商丘网站优化按天收费价格黔东南企业网站改版哪家好坪地SEO按效果付费价格三明优秀网站设计报价连云港优秀网站设计推荐鸡西企业网站设计推荐安阳网站搜索优化南平建站哪家好锦州设计网站朔州网站推广方案推荐自贡设计网站报价垦利网站制作设计公司龙华百姓网标王推广报价襄阳网站设计价格塘坑营销网站价格昌吉seo优化价格许昌网站关键词优化莆田设计公司网站价格伊犁阿里店铺运营多少钱长葛网页设计伊犁企业网站建设哪家好邯郸网站改版哪家好天水网站排名优化推荐黄山建站中卫网站定制多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化