文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

容器的四大基础技术

2024-12-02 21:01

关注

在本文中,我研究了容器是如何在一些特殊的 Linux 技术基础上实现的,这其中包括命名空间和控制组。

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

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

1. 命名空间

命名空间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/ /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 

2. 控制组

控制组(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 

3. SECCOMP

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

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

4. SELinux

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

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

总结

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

 

来源:Linux中国内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯