docker進行隔離的資源:1、檔案系統;2、網路(Network);3、進程間的通訊;4、針對權限的使用者和使用者群組;5、進程內的PID和宿主機的PID;6、主機名稱與域名等。
本教學操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。
Docker容器的本質
docker容器的本質是宿主機上的一個程序。
Docker透過namespace實現了資源隔離,透過cgroups實現了資源限制,透過*寫時複製機制(copy-on-write)*實現了高效的文件操作。
linux的namespace機制
namespace 機制提供一個資源隔離方案。
PID,IPC,Network等系統資源不再試全域性的,而是屬於某個特定的Namespace.
每個namespace下的資源對於其他的namespace下的資源是透明的,不可見的。
Linux 核心實現namespace的一個主要目的就是實現輕量級虛擬化(容器)服務,在同一個namespace下的進程可以感知彼此的變化,而對外界的進程一無所知,以達到獨立和隔離的目的。
namespace可以隔離哪些
一個容器要想與其他容器互不干擾需要能夠做到:
#檔案系統需要是被隔離的
網路也是需要被隔離的
進程間的通訊也要被隔離
針對權限,使用者與使用者群組也需要隔離
#進程內的PID也需要與宿主機器中的PID進行隔離
容器也要有自己的主機名稱
有了以上的隔離,我們認為一個容器可以與宿主機和其他容器隔離開的。
剛好Linux 的namespace可以做到這些。
namespace | 隔離內容 | 系統呼叫參數 |
---|---|---|
UTS | 主機名稱與網域名稱 | CLONE_NEWUTS |
#IPC | 訊號量、訊息佇列與共用記憶體 | #CLONE_NEWIPC |
Network | 網路設備、網路堆疊、連接埠等 | CLONE_NEWNET |
PID | 進程編號 | CLONE_NEWPID |
#Mount | 掛載點(檔案系統) | CLONE_NEWNS |
User | 使用者與使用者群組 | CLONE_NEWUSER |
UTS namespace
UTS (UNIX TIme-sharing System) namespace 提供了主機和域名的隔離,這樣每個Docker容器就可以擁有獨立的主機名稱和域名,在網絡上可以被視為一個獨立的節點,而不是宿主機上的一個進程。
Docker中,每個映像基本上都以自己提供的服務名稱來命名hostname,且不會對宿主機產生任何影響。
IPC namespace
進程間通訊(Inter-Process Communication,IPC)設計的IPC資源包括常見的信號量、訊息佇列和共享記憶體。
申請IPC資源就申請了一個全域唯一的32位元ID。
IPCnamespace中包含了系統IPC識別碼以及實作POSIX訊息佇列的檔案系統。
在同一個IPC namespace中的進程彼此可見,不同的namespace中的進程則互不可見。
PID namespace
PID namespace的隔離非常實用,他對進程PID重新編號,即兩個不同namespace下的進程可以擁有相同的PID,每個PID namespace都有自己的計數程式。
核心為所有的PID namespace維護了一個樹狀結構,最頂層的是系統初始時創建的,稱為root namespace。新建立的PIDnamespace稱為child namespace,而原先的PID namespace就是新建立的PID namespace的child namespace,而原來的PID namespace就是新建立的PID namespace的 parent namespace。
透過這種方式,不同的PID namespace會形成=一個層級體系,所屬的父節點可以看到子節點中的進程,並且可以透過訊號等方式對子節點中的進程產生影響。但是子節點確看不到父節點PID namespace中的任何內容。
mount namespace
mount namespace透過隔離檔案系統掛載點對隔離檔案系統提供支援。
隔離後,不同的mount namespace中的檔案結構會改變也互不影響。
network namespace
network namespace主要提供了關於網路資源的隔離,包括網路設備,IPv4,IPv6協定堆疊、IP路由表、防火牆、/proc/ net目錄、/sys/class/net目錄、套接字等。
user namespace
user namespace隔離了安裝相關的識別碼和屬性
namespace的動作
namespace的API包括clone() setns() unshare() 還有/proc下的部分檔案
為了確定隔離的是那些namespace,需要指定以下6個參數的一個或多個| 進行分隔。 6個參數就是上面表中提到的CLONE_NEWUTS、CLONE_NEWIPC、CLONE_NEWPID、CLONE_NEWNET、CLONE_NEWUSER
##clone()
#使用clone() 來建立一個獨立的進程,是最常見的做法,也是Docker使用namespace最基本的方法。int clone(int(*child_func)(void *),void *child_stack,int flags, void *arg);clone() 是 Linux 系統呼叫fork() 的一種更通用的實作方式,可以透過flags來控制使用多少功能。
共有20多種CLONE_*的flag,控制clone進程的方方面面。
- child_func 傳入子程序運行的程式主函數
- child_stack 傳入子程序所使用的堆疊空間
- flags 識別使用哪些CLONE_*標誌位,與namespace相關的主要是上面提到的6種。
- args 用於傳入使用者參數
/proc/[pid]/ns
使用者可以在/proc/[pid ]/ns檔案下看到指向不同namespace好的檔案。ls -l /proc/10/ns
把/proc/[pid]/ns目錄檔案使用--bind方式掛載也可以達到link的作用
touch ~/utsmount --bind /proc/10/ns/uts ~/uts
setns()
Docker中使用docker exec指令在已經執行的指令執行一個新的指令就需要使用setns() 。 透過setns()系統調用,進程從原來的namespace加入某個已經存在的namespace
通常為了不影響進程的調用者,也為了讓新加入的pid namespace生效,會在setns()函數執行後使用clone() 建立子程序繼續執行指令,讓原先的行程結束運作。
int setns(int fd, in nstype); #fd 表示要加入namespace的文件描述符。是一个指向/proc/[pid]/ns目录的文件描述符,打开目录链接可以获得 #nstype 调用者可以检查fd指向的namespace类型是否符合实际要求,该参数为0则不检查為了把新加入的namespace利用起來,需要引入execve()系列函數,該函數可以執行使用者指令,常用的就是呼叫/bin/bash並接受參數
unshare()
透過unshare() 在原先的進程上namespace隔離 unshare與clone很像,unshare不需要新啟動一個進程,在原有的進程上就可以進行使用。
docker並沒有使用
fork() 系統呼叫
fork並不屬於namespace的API強大核心工具cgroups
cgroups是Linux核心提供的一種機制,這個機制可以根據需求把一系列系統任務及其子任務整合(或分隔)到按資源分等級的不同組內,從而為系統資源管理提供一個統一的架構。
cgroups是Linux的另一個強大的核心工具,有了cgroups,不僅可以限制被namespace隔離的資源,還可以為資源設定權重、計算使用量、操控任務(進程或縣城)啟停等。說穿了就是:cgroups可以限制、記錄任務組所使用的實體資源(包括CPU,Memory,IO等),是建構Docker等一系列虛擬化管理工具的基石。
cgroups 的作用
cgroups 為不同使用者層面的資源管理提供了一個統一接口,從單一的資源控製到作業系統層面的虛擬化,cgroups提供了4個功能。
- 資源限制
- cgroups可以對任務使用的資源總額進行限制。
- 如設定應用程式運行時所使用的記憶體上限,一旦超過配額就發出OOM提示
- cgroups可以對任務使用的資源總額進行限制。
- 優先分配
- 透過分配的CPU時間片數量以及磁碟IO頻寬大小,實際上就相當於控制了任務運行的優先權
- 資源統計量
- ##cgroups可以統計系統的資源使用量
- 如CPU使用時長,記憶體用量等,這個功能非常適用於計費
- cgroups 可以對任務進行掛起、恢復等操作
以上是docker對哪些資源進行隔離的詳細內容。更多資訊請關注PHP中文網其他相關文章!

docker中rm和rmi的区别:rm命令用于删除一个或者多个容器,而rmi命令用于删除一个或者多个镜像;rm命令的语法为“docker rm [OPTIONS] CONTAINER [CONTAINER...]”,rmi命令的语法为“docker rmi [OPTIONS] IMAGE [IMAGE...]”。

docker官方镜像有:1、nginx,一个高性能的HTTP和反向代理服务;2、alpine,一个面向安全应用的轻量级Linux发行版;3、busybox,一个集成了三百多个常用Linux命令和工具的软件;4、ubuntu;5、PHP等等。

docker对于小型企业、个人、教育和非商业开源项目来说是免费的;2021年8月31日,docker宣布“Docker Desktop”将转变“Docker Personal”,将只免费提供给小型企业、个人、教育和非商业开源项目使用,对于其他用例则需要付费订阅。

docker容器重启后数据会丢失的;但是可以利用volume或者“data container”来实现数据持久化,在容器关闭之后可以利用“-v”或者“–volumes-from”重新使用以前的数据,docker也可挂载宿主机磁盘目录,用来永久存储数据。

AUFS是docker最早支持的存储引擎。AUFS是一种Union File System,是文件级的存储驱动,是Docker早期用的存储驱动,是Docker18.06版本之前,Ubuntu14.04版本前推荐的,支持xfs、ext4文件。

docker能安装oracle。安装方法:1、拉取Oracle官方镜像,可以利用“docker images”查看镜像;2、启动容器后利用“docker exec -it oracle11g bash”进入容器,并且编辑环境变量;3、利用“sqlplus /nolog”进入oracle命令行即可。

解决方法:1、停止docker服务后,利用“rsync -avz /var/lib/docker 大磁盘目录/docker/lib/”将docker迁移到大容量磁盘中;2、编辑“/etc/docker/daemon.json”添加指定参数,将docker的目录迁移绑定;3、重载和重启docker服务即可。

docker中的镜像会自动更新;可以利用Watchtower工具来自动更新镜像,Watchtower是一个可以监控正在运行的容器镜像是否更新的工具,当本地镜像与远程镜像有差异的时候,可以自动使用当前容器的运行参数以新镜像重新创建一个新的容器,并删除旧的容器。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。