30分鐘玩轉Docker系列課程2---Docker核心概念

對於學習Docker而言,很關鍵的一點,一定要了解Docker的核心概念及其原理,若不瞭解清除,在後續的可持續集成,自動化生產部署方案會出現問題

Docker原理:

Docker使用客戶端-服務器(C/S)架構模式。Docker客戶端會與Docker守護進程進行通信。Docker守護進程會處理複雜繁重的任務,例如建立、運行、發佈你的Docker容器。Docker客戶端和守護進程可以運行在同一個系統上,當然你也可以使用Docker客戶端去連接一個遠程的Docker守護進程。Docker客戶端和守護進程之間通過socket或者 RESTful API進行通信


Docker核心概念:

1、鏡像(image)

類似於虛擬機鏡像,可以理解爲一個面向Docker引擎的只讀模板,包含了文件系統

2、容器(Container)

容器是從鏡像創建的應用運行實例

3、倉庫(Repository)
類似代碼倉庫,Docker集中存放鏡像文件的場所

鏡像核心概念:

按照Docker官網的技術文檔描述,Image(鏡像)是Docker術語的一種,代表一個只讀的layer。而layer則具體代表Docker Container文件系統中可疊加的一部分

Docker鏡像相關的4個概念:rootfsUnion mountimage以及layer
1rootfs
代表一個Docker Container在啓動時(而非運行後)其內部進程可見的文件系統視角,或者是Docker Container的根目錄。當然,該目錄下含有Docker Container所需要的系統文件、工具、容器文件等

例如:假設用戶已經通過Docker Registry下拉了Ubuntu:14.04的鏡像,並通過命令docker run –it ubuntu:14.04 /bin/bash將其啓動運行。則Docker Daemon爲其創建的rootfs以及容器可讀寫的文件系統可參見

2 Unionmount
代表一種文件系統掛載的方式,允許同一時刻多種文件系統掛載在一起,並以一種文件系統的形式,呈現多種文件系統內容合併後的目錄;

一般情況下,通過某種文件系統掛載內容至掛載點的話,掛載點目錄中原先的內容將會被隱藏。而Unionmount則不會將掛載點目錄中的內容隱藏,反而是將掛載點目錄中的內容和被掛載的內容合併,併爲合併後的內容提供一個統一獨立的文件系統視角

3、image
最爲簡單的解釋image,就是Docker容器中只讀文件系統rootfs的一部分。換言之,實際上Docker容器的rootfs可以由多個image來構成。多個image構成rootfs的方式依然沿用Union mount技術



繼續以ubuntu14.04爲例,雖然通過AUFS可以實現rootfsread-writefilesystem的合併,但是考慮到rootfs自身接近200MB的磁盤大小,如果以這個rootfs的粒度來實現容器的創建與遷移等,是否會稍顯笨重,同時也會大大降低鏡像的靈活性。而且,若用戶希望擁有一個ubuntu14.10rootfs,那麼是否有必要創建一個全新的rootfs,畢竟ubuntu14.10ubuntu14.04rootfs中有很多一致的內容。

DockerImage中又抽象出兩種概念:ParentImage以及BaseImage

通過image的形式,原先較爲臃腫的rootfs被逐漸打散成輕便的多層。Image除了輕便的特性,同時還有上文提到的只讀特性,如此一來,在不同的容器、不同的rootfsimage完全可以用來複用。


4、layer
Docker術語中,layer是一個與image含義較爲相近的詞。容器鏡像的rootfs是容器只讀的文件系統,rootfs又是由多個只讀的image構成。於是,rootfs中每個只讀的image都可以稱爲一層layer。
除了只讀的image之外,Docker Daemon在創建容器時會在容器的rootfs之上,再mount一層read-write filesystem,而這一層文件系統,也稱爲容器的一層layer,常被稱爲top layer


綜上所述,大家要把鏡像和容器都理解成,鏡像由多個不可寫的layer層組成,容器是在鏡像最上層,是一個可寫的層;大家可以在linux操作系統上輸入

Docker images -tree


就可以看多images的組成關係

容器核心概念:
容器是在鏡像最上層,是一個可寫的層;
我們從一個例子看下容器是如何運行的
docker run -ti docker.io/centos:latest /bin/bash
Docker底層做了哪些事情:
1、拉去centos鏡像,首先檢查本地是否有centos鏡像,如果本地沒這個鏡像,則Docker會從Docker Hub上下載
2創建新的容器: Docker有了這個鏡像之後,Docker會用它來創建一個新的容器
3分配文件系統並且掛載一個可讀寫的層容器會在這個文件系統中創建,並且一個可讀寫的層被添加到鏡像
4分配網絡/橋接接口創建一個允許容器與本地主機通信的網絡接口。
5設置一個IP地址從池中尋找一個可用的IP地址並且服加到容器上。
6運行你指定的程序運行指定的程序。
7捕獲並且提供應用輸出連接並且記錄標準輸出、輸入和錯誤讓你可以看到你的程序是如何運行的。


倉庫核心概念:
可以通俗易懂的理解爲:我們存放&&下載鏡像的地方,這個地方有公共的Docker Hub或私有的Hub
我們下載centos鏡像,輸入以下命令
docker pull centos
實際執行的命令爲
sudodocker pullregistry.hub.docker.com/centos:latest
我們也可以創建自己私有的倉庫,運行官方提供的 registry 鏡像,將端口映射到主機的 5000 端口上,其它均使用默認配置
guohl@ghl-MBP ⮀ ~ ⮀ docker run -d -p 5000:5000 registry
Unable to find image 'registry:latest' locally
6cfde7386ab2: Pull complete
9789d95d9fda: Pull complete
19443e64f223: Pull complete
b329371ab73c: Pull complete
f0daee9a4e8f: Pull complete
a66e50e56475: Pull complete
8ab3d2988df5: Pull complete
5f60fa7ea945: Pull complete
db22a140c899: Pull complete
5b2fff9306bd: Pull complete
511136ea3c5a: Already exists
f3c84ac3a053: Already exists
a1a958a24818: Already exists
9fec74352904: Already exists
d0955f21bf24: Already exists
registry:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for registry:latest
8fb8e82e61822e593e10b59a4e7bbad18c789b34e3b38942d5b63dccb497ed09
創建好私有倉庫之後,我們就可以向該倉庫上傳鏡像,別人也可以從該倉庫下載鏡像














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章