docker1
一、docker 簡介
1.1 docker的組成
官網:https://docs.docker.com/engine/docker-overview/
docker主機(host):一個物理機或虛擬機,用于運行docker服務進程和容器
docker服務端(server):docker守護進程,運行docker容器。
docker客戶端(client):客戶端使用docker命令或其他工具調用dockerAPI
docker倉庫(Registry):保存鏡像的倉庫,類似于git或svn這樣的版本控制系統。官方倉庫:https://hub.docker.com/
docker鏡像(images):鏡像可以理解為創建實例使用的模板
docker容器(container):容器是從鏡像生成對外提供服務的一個或一組服務

1.2:docker對比虛擬機

1、資源利用率更高:一 臺物理機可以運行數百個容器,但是般只能運行數十個虛擬機 。
2、開銷更小:不需要啟動單獨的 虛擬機 占用硬件資源。
3、啟動速度更快:可以在數秒內完成啟動
1.3:docker的底層隔離實現技術
1.3.1:Linux Namespace
namespace 是 Linux系統的底層概念,系統的底層概念,在內核層實現,即有一些不同類型的命名空間被部署在核內 ,各個docker容器運行在同一個docker 主進程并且共用同一個宿主機系統內核 ,各docker容器運行在宿主機的用戶空間,每個容器都要有類似于虛擬機一樣的相互隔離的運行空間 ,但是容器技術是在一個進程內實現運行指定服務的運行環境,并且還可以保護宿主機內核不受其他進程的干擾和影響,如文件系統空間、網絡進程等,目前主要通過以下技術實現容器運行空間的相互隔離:
目前Linux中提供了六類系統資源的隔離機制,分別是:
Mount: 隔離文件系統掛載點。Mount Namespace用來隔離文件系統的掛載點,不同Mount Namespace的進程擁有不同的掛載點,同時也擁有了不同的文件系統視圖。

宿主機是使用了chroot技術把容器鎖定到一個指的運行目錄里面。例如上圖中:/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID
UTS: 隔離主機名和域名信息。由于主機名和域名可以用來代替IP地址,如果沒有這一層隔離,同一主機上不同的容器的網絡訪問就可能出問題。UTS Namespace提供了主機名和域名的隔離,也就是struct utsname里的nodename和domainname兩個字段。不同Namespace中可以擁有獨立的主機名和域名。
![]()
默認容器ID,一般不建議去改,容器訪問不是通過主機名訪問,不利于橫向擴展。
IPC: 隔離進程間通信。IPC Namespace是對不同容器跨容器進程間通信的隔離,進程間通信常見的方法有信號量、消息隊列和共享內存。IPC Namespace要達到的目標是相同的標識符在不同的Namepspace中代表不同的通信介質(比如信號量、消息隊列和共享內存)。
PID: 隔離進程的ID。PID Namespace對進程PID重新標號,即不同的Namespace下的進程可以有同一個PID。新創建的PID Namespace中的第一個進程PID為1,成為新Namespace的systemd進程。一個 容器內的進程間通信 ,允許 一個 容器內的不同進程 的(內存 、緩存等 )數據訪 問,但是不能夸容器訪問其他 容器的數據 。






容器內核版本高于宿主機內核版本,容器內的命令照樣可以運行,因為是基于二進制文件,只要cpu可以解析二進制文件即可,另外官方也有考慮。
Network: 隔離網絡資源。不同Namespace種可以擁有獨立的網絡資源,包括網絡設備(網卡、網橋)、IPV4或IPV6協議棧、路由表、防火墻、端口等信息。如果需要打通不同Namespace的通信,可以通過創建vnet pair虛擬網絡設備對的形式。
容器內網卡顯示

宿主機網卡信息

網橋信息
![]()
開啟:net.ipv4.ip_forward = 1跨網段

iptables

網絡拓撲圖:

User: 隔離用戶和用戶組的ID。·一個普通進程(Namespace外面的用戶ID非0)在Namespace里面的用戶和用戶組ID可以為0,換句話說這個普通進程在Namespace里面可以擁有root特權的權限。
涉及到Namespace的操作接口包括clone()、setns()、unshare()以及還有/proc下的部分文件。可以通過clone系統調用來創建一個獨立Namespace的進程,setns()函數可以把進程加入到指定的Namespace中,unshare()系統調用用于將當前進程和所在的Namespace分離,并加入到一個新的Namespace中,相對于setns()系統調用來說,unshare()不用關聯之前存在的Namespace,只需要指定需要分離的Namespace就行,該調用會自動創建一個新的Namespace。通過/proc文件查看進程所屬的namespace。
1.3.2:Linux control groups
Cgroups全稱Control Groups,是Linux內核提供的物理資源隔離機制,通過這種機制,可以實現對Linux進程或者進程組的資源限制、隔離和統計功能。它最主要的作用, 就是限制一個進程組能夠使用的資源上,包括 CPUCPU 、內存磁盤網絡帶寬等。此外,還能夠對進程行優先級設置以及將掛起和恢復操作

groups中內存模塊:

查看系統cgroups:
root@ubuntu:~# ll /sys/fs/cgroup/ total 0 drwxr-xr-x 15 root root 380 Feb 15 11:06 ./ drwxr-xr-x 10 root root 0 Feb 15 11:06 ../ dr-xr-xr-x 5 root root 0 Feb 15 11:06 blkio/ #塊設備IO限制 lrwxrwxrwx 1 root root 11 Feb 15 11:06 cpu -> cpu,cpuacct/ #使用調度程序為 cgroup任務提供cpu的訪問 lrwxrwxrwx 1 root root 11 Feb 15 11:06 cpuacct -> cpu,cpuacct/ #產生cgroup任務的cpu資源報告 dr-xr-xr-x 5 root root 0 Feb 15 11:06 cpu,cpuacct/ dr-xr-xr-x 3 root root 0 Feb 15 11:06 cpuset/ #如果是多核心的cpu,這個子系統會為cgroup任務分配單獨的任務分配單獨的cpu和內存。 dr-xr-xr-x 5 root root 0 Feb 15 11:06 devices/ #允許或拒絕cgroup任務對設備的訪問 dr-xr-xr-x 3 root root 0 Feb 15 11:06 freezer/ #暫停和恢復cgroup任務 dr-xr-xr-x 3 root root 0 Feb 15 11:06 hugetlb/ dr-xr-xr-x 5 root root 0 Feb 15 11:06 memory/ #設置每個cgroup的內存限制以及產生資源報告 lrwxrwxrwx 1 root root 16 Feb 15 11:06 net_cls -> net_cls,net_prio/ #標記每個網絡包以供cgroup方便使用 dr-xr-xr-x 3 root root 0 Feb 15 11:06 net_cls,net_prio/ lrwxrwxrwx 1 root root 16 Feb 15 11:06 net_prio -> net_cls,net_prio/ dr-xr-xr-x 3 root root 0 Feb 15 11:06 perf_event/ #增加了對每group的 、監測跟蹤能力,可以屬于某個特定的group的所有線程以及運行在特定CPU上的線程 dr-xr-xr-x 5 root root 0 Feb 15 11:06 pids/ dr-xr-xr-x 2 root root 0 Feb 15 11:06 rdma/ dr-xr-xr-x 6 root root 0 Feb 15 11:06 systemd/ dr-xr-xr-x 5 root root 0 Feb 15 11:06 unified/
1.4:容器管理工具
1.4.1:docker
Docker啟動一個容器也需要一個外部模板但是較多鏡像, docker的鏡像可以 保 存在一 個公共的地方享使用, 只要 把鏡像下載來就可以使用 ,最主要的是可以在鏡像基礎之上做自定義配置 并且 可以 再把其提交 為一個鏡像 ,可以被 啟動 為多個容器。
Docker的鏡像是分層,鏡像底層為庫文件且只讀層即不能寫入也不能刪除數據,從鏡像加載啟動為一個容器后會生成一個可寫層,其寫入的數據會復制到容器目錄 ,但是容器內的數據在刪除后也會被隨之刪除。
容器內文件顯示:

宿主機文件顯示:
![]()
![]()

1.4.2:pouch
https://www.infoq.cn/article/alibaba-pouch
https://github.com/alibaba/pouch
1.5:docker(容器)的核心技術
容器 runtime:
runtime是真正運行容器的地方,因此為了運行不同的容器runtime需要和操作系統內核緊密合相互在支持 ,以便為容器提供相應的運行環境 。
目前主流的三種 runtime:
Lxc:linux上早期的runtime ,Docker早期 就是采用 lxc作為runtime。
runc :目前 Docker默認的runtime 。
rkt:是 CoreOS開發的容器runtime,也符合OCI規范,所以使用rktruntime也可以運行 Docker容器

容器管理工具:管理工具連接 runtime與用戶,對用戶提供圖形或命令方式操作,然后管理工具將用戶操作傳遞給runtime 執行 。
Runc的管理工具是 docker engine,docker engine包含后臺deamon和cli兩部分,大家經常提到的 Docker就是指的docker engine。

容器定義工具:容器定義工具允許用戶容器的屬性和內容,以方便容器能夠被保存、共享和重建 。
Docker image :是docker容器 的模板, runtime依據 docker image創建容器。
Dockerfile :包含 N個命令的文本文件,通過 dockerfile創建出 docker image。
Registry:統一 保存鏡像而且是多個不同鏡像版的地方叫做鏡像倉庫 。
Docker hub:docker官方的公共倉庫 ,已經保存了大量的常用鏡像,可以方便大家直接使用。
Harbor:vmware提供的自帶 web界面自帶認證功能的鏡像倉庫,目前的鏡像倉庫,目前有很多公司在使用。
編排工具:
Kubernetes:google領導開發的容器編排引擎 ,內部項目為Borg,且其同時支持 docker和 CoreOS。
浙公網安備 33010602011771號