1、docker容器技术基础入门
Docker和傳統虛擬機的區別? ??
? ? ? ?
?
參考文章:
https://lwn.net/Articles/531114/? ??操作中的命名空間詳解
https://blog.yadutaf.fr/page/2/??
https://ruby-china.org/topics/22004? ??Docker 介紹以及其相關術語、底層原理和技術
http://tiewei.github.io/cloud/Docker-Getting-Start/
https://blog.csdn.net/zmx729618/article/details/72930474
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
?
主機級虛擬化
Type-I:直接在硬件平臺上安裝虛擬機管理器Hypervisor,在硬件上不需要再安裝宿主機操作系統,而是直接安裝Hypervisor,然后在Hypervisor上安裝虛擬機;
Type-II:首先在物理機上安裝一個主機操作系統(HostOS),即宿主機操作系統,然后在宿主機上安裝VMM(Virtual Machine Manager,虛擬機管理器,例如VMware_workstation),在VMware_workstation軟件上創建虛擬機。
容器級虛擬化
Control Groups(cgroups) 把系統級的資源分成多個組,然后把每一個組內的資源量分配到特定用戶空間進程上? ?
https://tech.meituan.com/2015/03/31/cgroups.html? ?可重點參考
https://en.wikipedia.org/wiki/Cgroups
https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
cgroups 的全稱是control groups,cgroups為每種可以控制的資源定義了一個子系統。典型的子系統介紹如下:
cgroups 實現了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似文件的接口,在 /cgroup 目錄下新建一個文件夾即可新建一個 group,在此文件夾中新建 task 文件,并將 pid 寫入該文件,即可實現對該進程的資源控制。具體的資源配置選項可以在該文件夾中新建子 subsystem ,{子系統前綴}.{資源項} 是典型的配置方法, 如 memory.usageinbytes 就定義了該 group 在 subsystem memory 中的一個內存限制選項。 另外,cgroups 中的 subsystem 可以隨意組合,一個 subsystem 可以在不同的 group 中,也可以一個 group 包含多個 subsystem - 也就是說一個 subsystem。
?
Container可以當作隔離環境管理器,在其上面創建一個個隔離環境,然后把要運行的隔離出來的進程運行在隔離環境中。內核提供的是內核空間,進程運行在用戶空間,當進程運行在一個隔離環境中的話,那么隔離的就是用戶空間,這就把用戶空間隔離成多組。這些被隔離的用戶進程共享底層同一個內核,但進程運行空間的邊界就是被隔離的用戶空間的邊界。這些被隔離的、運行進程的用戶空間就叫容器。
一旦進程出現故障,除了感染所屬容器,是否會干擾其他容器的進程?利用jail。
jail被應用到linux上后叫vserver,vserver所實現的功能有chroot,切換根目錄。
?
參考:https://blog.csdn.net/zmx729618/article/details/72930474
一個用戶空間主要目標是實現環境隔離的,任何進程運行在此用戶空間中會認為它是唯一運行在內核上用戶空間的進程。
一個用戶空間應該包括的組件:
Linux支持6種Namespace:
1、UTS?namespace(主機名和域名);??http://blog.lucode.net/linux/intro-Linux-namespace-1.html
UTS ("UNIX Time-sharing System") namespace 允許每個 container 擁有獨立的 hostname 和 domain name, 使其在網絡上可以被視作一個獨立的節點而非 Host 上的一個進程。
2、Mount namespace(根文件系統);
類似 chroot,將一個進程放到一個特定的目錄執行。mnt namespace 允許不同 namespace 的進程看到的文件結構不同,這樣每個 namespace 中的進程所看到的文件目錄就被隔離開了。同 chroot 不同,每個 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。
3、IPC namespace:不同的用戶隔離空間中的進程是無法利用IPC進行通信的,不然用戶空間的隔離就沒有任何意義了。
container 中進程交互還是采用 Linux 常見的進程間交互方法 (interprocess communication - IPC), 包括常見的信號量、消息隊列和共享內存。然而同 VM 不同,container 的進程間交互實際上還是 host 上具有相同 pid namespace 中的進程間交互,因此需要在IPC資源申請時加入 namespace 信息 - 每個 IPC 資源有一個唯一的 32bit ID。
4、PID namespace:?Introduction to Linux namespaces – Part 2: IPC
? ?每個被隔離的用戶空間在運行進程的時候,必須有一個父進程,即必須有管理此用戶空間的多個進程的父進程,否則在此用戶空間被銷毀前就無法管理此空間運行的進程了。
不同用戶的進程就是通過 pid namespace 隔離開的,且不同 namespace 中可以有相同 PID。具有以下特征:
- 每個 namespace 中的 pid 是有自己的 pid=1 的進程(類似 /sbin/init 進程)
- 每個 namespace 中的進程只能影響自己的同一個 namespace 或子 namespace 中的進程
- 因為 /proc 包含正在運行的進程,因此在 container 中的 pseudo-filesystem 的 /proc 目錄只能看到自己 namespace 中的進程
- 因為 namespace 允許嵌套,父 namespace 可以影響子 namespace 的進程,所以子 namespace 的進程可以在父 namespace 中看到,但是具有不同的 pid
5、USER namespace:每個用戶空間都應該有一個類似與root的管理者,但這些管理者在真實的主機上是普通用戶。
每個 container 可以有不同的 user 和 group id, 也就是說可以以 container 內部的用戶在 container 內部執行程序而非 Host 上的用戶。
6、Net?namespace? ?Introduction to Linux namespaces – Part 5: NET
網絡隔離是通過 net namespace 實現的, 每個 net namespace 有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個 container 的網絡就能隔離開來。 docker 默認采用 veth 的方式將 container 中的虛擬網卡同 host 上的一個 docker bridge 連接在一起。
Linux Namespaces
Namespaces通過系統調用把上述6中功能向外輸出,創建進程用clone();
把創建好的進程放到某個namespaces中,則使用系統調用:setns(),即把內核中啟用的進程放到容器中;
unshare():此系統調用方法是是把容器中的進程拿出來;
從上述角度看,要想使用容器需要依靠linux內核級的內核資源用于支撐用戶空間中。
docker構建鏡像是 分層構建、聯合掛載。
docker構建鏡像是 分層構建、聯合掛載。
比如centos是一個鏡像,nginx是一個鏡像,那么把這兩者疊加在一起則可以實現nginx運行在centos上,這就叫聯合掛載。
當需要運行nginx時,把centos鏡像和nginx鏡像聯合掛載。每一層鏡像都是只讀的,所以底層鏡像是不允許修改的。
如果想在容器A中修改文件怎么辦呢?那么可以附加一個新層即E層,E層是專門屬容器A的層,是能讀能寫的,所以容器A就可以在E層進行讀寫。
但是如果容器A想要刪除一個屬于底層鏡像的文件,怎么辦?由于底層鏡像是只讀,所以是無法刪除的,那么即可在底層鏡像中標記為不可見即可。如果要修改底層鏡像的文件,即把底層鏡像中的文件復制到E層,然后在E層中進行修改即可。
另外一個問題,因為E層有數據,那么如何把容器A遷移到其他宿主機?因此在使用容器時,是不會在容器本地保存有效數據的,所以在需要存儲數據時,就會在文件系統上掛載一個外部的存儲,以后即使把容器刪除,也可以再啟動同樣的鏡像,創建同樣的容器,然后掛載此數據庫即可。
libcontainer
Docker 從 0.9 版本開始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系統的交互圖如下:
?
?
?
?
?
轉載于:https://www.cnblogs.com/hanshanxiaoheshang/p/10373068.html
總結
以上是生活随笔為你收集整理的1、docker容器技术基础入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fire Net HDU1045
- 下一篇: 极限编程阅读笔记--第二篇