自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

容器的四大基礎(chǔ)技術(shù)

系統(tǒng) Linux
在本文中,我研究了容器是如何在一些特殊的 Linux 技術(shù)基礎(chǔ)上實(shí)現(xiàn)的,這其中包括命名空間和控制組。

[[424501]]

在本文中,我研究了容器是如何在一些特殊的 Linux 技術(shù)基礎(chǔ)上實(shí)現(xiàn)的,這其中包括命名空間和控制組。

圖1:對(duì)容器有貢獻(xiàn)的 Linux 技術(shù)(Nived Velayudhan, CC BY-SA 4.0)

這些 Linux 技術(shù)構(gòu)成了在系統(tǒng)上構(gòu)建和運(yùn)行容器進(jìn)程的基礎(chǔ):

  • 命名空間
  • 控制組(cgroups)
  • Seccomp
  • SELinux

1. 命名空間

命名空間namespace 為容器提供了一個(gè)隔離層,給容器提供了一個(gè)看起來(lái)是獨(dú)占的 Linux 文件系統(tǒng)的視圖。這就限制了進(jìn)程能訪(fǎng)問(wèn)的內(nèi)容,從而限制了它所能獲得的資源。

在創(chuàng)建容器時(shí),Docker 或 Podman 和其他容器技術(shù)使用了 Linux 內(nèi)核中的幾個(gè)命名空間:

  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 

用戶(hù)

用戶(hù)(user)命名空間將用戶(hù)和組隔離在一個(gè)容器內(nèi)。這是通過(guò)分配給容器與宿主系統(tǒng)有不同的 UID 和 GID 范圍來(lái)實(shí)現(xiàn)的。用戶(hù)命名空間使軟件能夠以 root 用戶(hù)的身份在容器內(nèi)運(yùn)行。如果入侵者攻擊容器,然后逃逸到宿主機(jī)上,他們就只能以受限的非 root 身份運(yùn)行了。

掛載

掛載(mnt)命名空間允許容器有自己的文件系統(tǒng)層次結(jié)構(gòu)視圖。你可以在 Linux 系統(tǒng)中的 /proc/ /mounts 位置找到每個(gè)容器進(jìn)程的掛載點(diǎn)。

UTS

Unix 分時(shí)系統(tǒng)Unix Timeharing System(UTS)命名空間允許容器擁有一個(gè)唯一主機(jī)名和域名。當(dāng)你運(yùn)行一個(gè)容器時(shí),即使使用 - name 標(biāo)簽,也會(huì)使用一個(gè)隨機(jī)的 ID 作為主機(jī)名。你可以使用 unshare 命令 來(lái)了解一下這個(gè)工作原理。

  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

進(jìn)程間通信Inter-Process Communication(IPC)命名空間允許不同的容器進(jìn)程之間,通過(guò)訪(fǎng)問(wèn)共享內(nèi)存或使用共享消息隊(duì)列來(lái)進(jìn)行通信。

  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

進(jìn)程 IDProcess ID(PID)命名空間確保運(yùn)行在容器內(nèi)的進(jìn)程與外部隔離。當(dāng)你在容器內(nèi)運(yùn)行 ps 命令時(shí),由于這個(gè)命名空間隔離的存在,你只能看到在容器內(nèi)運(yùn)行的進(jìn)程,而不是在宿主機(jī)上。

網(wǎng)絡(luò)

網(wǎng)絡(luò)(net)命名空間允許容器有自己網(wǎng)絡(luò)接口、IP 地址、路由表、端口號(hào)等視圖。容器如何能夠與外部通信?你創(chuàng)建的所有容器都會(huì)被附加到一個(gè)特殊的虛擬網(wǎng)絡(luò)接口上進(jìn)行通信。

  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)是組成一個(gè)容器的基本模塊??刂平M會(huì)分配和限制容器所使用的資源,如 CPU、內(nèi)存、網(wǎng)絡(luò) I/O 等。容器引擎會(huì)自動(dòng)創(chuàng)建每種類(lèi)型的控制組文件系統(tǒng),并在容器運(yùn)行時(shí)為每個(gè)容器設(shè)置配額。

  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 

容器運(yùn)行時(shí)為每個(gè)容器設(shè)置了控制組值,所有信息都存儲(chǔ)在 /sys/fs/cgroup/*/docker。下面的命令將確保容器可以使用 50000 微秒的 CPU 時(shí)間片,并將內(nèi)存的軟、硬限制分別設(shè)置為 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 意思是“安全計(jì)算secure computing”。它是一項(xiàng) Linux 功能,用于限制應(yīng)用程序進(jìn)行的系統(tǒng)調(diào)用的集合。例如,Docker 的默認(rèn) seccomp 配置文件禁用了大約 44 個(gè)系統(tǒng)調(diào)用(總計(jì)超過(guò) 300 個(gè))。

這里的思路是讓容器只訪(fǎng)問(wèn)所必須的資源。例如,如果你不需要容器改變主機(jī)上的時(shí)鐘時(shí)間,你可能不會(huì)使用 clock_adjtime 和 clock_settime 系統(tǒng)調(diào)用,屏蔽它們是合理的。同樣地,你不希望容器改變內(nèi)核模塊,所以沒(méi)有必要讓它們使用 create_module、 delete_module 系統(tǒng)調(diào)用。

4. SELinux

SELinux 是“安全增強(qiáng)的 Linuxsecurity-enhanced Linux”的縮寫(xiě)。如果你在你的宿主機(jī)上運(yùn)行的是 Red Hat 發(fā)行版,那么 SELinux 是默認(rèn)啟用的。SELinux 可以讓你限制一個(gè)應(yīng)用程序只能訪(fǎng)問(wèn)它自己的文件,并阻止任何其他進(jìn)程訪(fǎng)問(wèn)。因此,如果一個(gè)應(yīng)用程序被破壞了,它將限制該應(yīng)用程序可以影響或控制的文件數(shù)量。通過(guò)為文件和進(jìn)程設(shè)置上下文環(huán)境以及定義策略來(lái)實(shí)現(xiàn),這些策略將限制一個(gè)進(jìn)程可以訪(fǎng)問(wèn)和更改的內(nèi)容。

容器的 SELinux 策略是由 container-selinux 包定義的。默認(rèn)情況下,容器以 container_t 標(biāo)簽運(yùn)行,允許在 /usr 目錄下讀取(r)和執(zhí)行(x),并從 /etc 目錄下讀取大部分內(nèi)容。標(biāo)簽container_var_lib_t 是與容器有關(guān)的文件的通用標(biāo)簽。

總結(jié)

容器是當(dāng)今 IT 基礎(chǔ)設(shè)施的一個(gè)重要組成部分,也是一項(xiàng)相當(dāng)有趣的技術(shù)。即使你的工作不直接涉及容器化,了解一些基本的容器概念和方法,也能讓你體會(huì)到它們?nèi)绾螏椭愕慕M織。容器是建立在開(kāi)源的 Linux 技術(shù)之上的,這使它們變得更加美好。

 

責(zé)任編輯:趙寧寧 來(lái)源: Linux中國(guó)
相關(guān)推薦

2016-03-17 17:35:15

云容器虛擬化管理Docker

2020-02-29 09:09:34

物聯(lián)網(wǎng)定位技術(shù)IOT

2020-04-06 20:11:26

區(qū)塊鏈分布式核心技術(shù)

2020-07-16 07:00:49

容器管理考量

2021-11-03 15:15:21

Go重構(gòu)技術(shù)

2011-03-21 09:01:49

CSS框架

2015-07-17 09:50:16

Carthage優(yōu)劣比較

2015-04-02 15:50:47

數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)挖掘

2020-06-29 14:52:31

隱私增強(qiáng)技術(shù)PET加密

2017-03-17 19:48:01

人臉識(shí)別

2009-08-28 10:47:46

Java EE容器

2015-12-04 13:46:31

技術(shù)人創(chuàng)業(yè)創(chuàng)業(yè)項(xiàng)目

2013-09-02 10:17:05

虛擬化技術(shù)

2009-12-09 10:15:08

2013-01-06 10:44:43

微軟Windows 8云計(jì)算

2012-07-11 10:41:38

虛擬化

2023-02-08 11:01:37

網(wǎng)絡(luò)以太網(wǎng)

2016-03-30 11:51:55

2021-08-30 10:05:19

零售行業(yè)基礎(chǔ)設(shè)施技術(shù)

2022-05-11 14:46:19

元宇宙虛擬世界人工智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)