看圖帶你深入理解Docker容器和鏡像
發布時間:2020-02-12 責任編輯:lina
【導讀】本篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和鏡像(image)之間的區別,並深入探討容器和運行中的容器之間的區別。
本篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和鏡像(image)之間的區別,並深入探討容器和運行中的容器之間的區別。

當我對Docker技術還是一知半解的時候,我發現理解Docker的命令非常困難。於是,我花了幾周的時間來學習Docker的工作原理,更確切地說,是關於Docker統一文件係統(the union file system)的知識,然後回過頭來再看Docker的命令,一切變得順理成章,簡單極了。
題外話:就jiu我wo個ge人ren而er言yan,掌zhang握wo一yi門men技ji術shu並bing合he理li使shi用yong它ta的de最zui好hao辦ban法fa就jiu是shi深shen入ru理li解jie這zhe項xiang技ji術shu背bei後hou的de工gong作zuo原yuan理li。通tong常chang情qing況kuang下xia,一yi項xiang新xin技ji術shu的de誕dan生sheng常chang常chang會hui伴ban隨sui著zhe媒mei體ti的de大da肆si宣xuan傳chuan和he炒chao作zuo,這zhe使shi得de用yong戶hu很hen難nan看kan清qing技ji術shu的de本ben質zhi。更geng確que切qie地di說shuo,新xin技ji術shu總zong是shi會hui發fa明ming一yi些xie新xin的de術shu語yu或huo者zhe隱yin喻yu詞ci來lai幫bang助zhu宣xuan傳chuan,這zhe在zai初chu期qi是shi非fei常chang有you幫bang助zhu的de,但dan是shi這zhe給gei技ji術shu的de原yuan理li蒙meng上shang了le一yi層ceng砂sha紙zhi,不bu利li於yu用yong戶hu在zai後hou期qi掌zhang握wo技ji術shu的de真zhen諦di。
Git就是一個很好的例子。我之前不能夠很好的使用Git,於是我花了一段時間去學習Git的原理,直到這時,我才真正明白了Git的用法。我堅信隻有真正理解Git內部原理的人才能夠掌握這個工具。
Image Definition
鏡像(Image)就是一堆隻讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下麵的這張圖能夠幫助讀者理解鏡像的定義。

從左邊我們看到了多個隻讀層,它們重疊在一起。除了最下麵一層,其它層都會有一個指針指向下一層。這些層是Docker內部的實現細節,並且能夠在主機(譯者注:運行Docker的機器)的文件係統上訪問到。統一文件係統(union file system)技ji術shu能neng夠gou將jiang不bu同tong的de層ceng整zheng合he成cheng一yi個ge文wen件jian係xi統tong,為wei這zhe些xie層ceng提ti供gong了le一yi個ge統tong一yi的de視shi角jiao,這zhe樣yang就jiu隱yin藏zang了le多duo層ceng的de存cun在zai,在zai用yong戶hu的de角jiao度du看kan來lai,隻zhi存cun在zai一yi個ge文wen件jian係xi統tong。我wo們men可ke以yi在zai圖tu片pian的de右you邊bian看kan到dao這zhe個ge視shi角jiao的de形xing式shi。
你ni可ke以yi在zai你ni的de主zhu機ji文wen件jian係xi統tong上shang找zhao到dao有you關guan這zhe些xie層ceng的de文wen件jian。需xu要yao注zhu意yi的de是shi,在zai一yi個ge運yun行xing中zhong的de容rong器qi內nei部bu,這zhe些xie層ceng是shi不bu可ke見jian的de。在zai我wo的de主zhu機ji上shang,我wo發fa現xian它ta們men存cun在zai於yu/var/lib/docker/aufs目錄下。
1./var/lib/docker/
2.├── aufs
3.├── containers
4.├── graph
5.├── init
6.├── linkgraph.db
7.├── repositories-aufs
8.├── tmp
9.├── trust
10.└── volumes
11.7 directories, 2 files
12.Container Definition
容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上麵那一層是可讀可寫的。

細心的讀者可能會發現,容器的定義並沒有提及容器是否在運行,沒錯,這是故意的。正是這個發現幫助我理解了很多困惑。
要點:容器 = 鏡像 + 讀寫層。並且容器的定義並沒有提及是否要運行容器。
接下來,我們將會討論運行態容器。
Running Container Definition
一個運行態容器(running container)被定義為一個可讀寫的統一文件係統加上隔離的進程空間和包含其中的進程。下麵這張圖片展示了一個運行中的容器。

正是文件係統隔離技術使得Docker成為了一個前途無量的技術。一個容器中的進程可能會對文件進行修改、刪除、創建,這些改變都將作用於可讀寫層(read-write layer)。下麵這張圖展示了這個行為。

我們可以通過運行以下命令來驗證我們上麵所說的:
docker run ubuntu touch happiness.txt
即便是這個ubuntu容器不再運行,我們依舊能夠在主機的文件係統上找到這個新文件。
find / -name happiness.txt
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Image Layer Definition
為了將零星的數據整合起來,我們提出了鏡像層(image layer)這zhe個ge概gai念nian。下xia麵mian的de這zhe張zhang圖tu描miao述shu了le一yi個ge鏡jing像xiang層ceng,通tong過guo圖tu片pian我wo們men能neng夠gou發fa現xian一yi個ge層ceng並bing不bu僅jin僅jin包bao含han文wen件jian係xi統tong的de改gai變bian,它ta還hai能neng包bao含han了le其qi他ta重zhong要yao信xin息xi。

元數據(metadata)就是關於這個層的額外信息,它不僅能夠讓Docker獲取運行和構建時的信息,還包括父層的層次信息。需要注意,隻讀層和讀寫層都包含元數據。

除此之外,每一層都包括了一個指向父層的指針。如果一個層沒有這個指針,說明它處於最底層。

Metadata Location:
我發現在我自己的主機上,鏡像層(image layer)的元數據被保存在名為”json”的文件中,比如說:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是這層的id
一個容器的元數據好像是被分成了很多文件,但或多或少能夠在/var/lib/docker/containers/<id>目錄下找到,<id>就是一個可讀層的id。這個目錄下的文件大多是運行時的數據,比如說網絡,日誌等等。
全局理解(Tying It All Together)
現在,讓我們結合上麵提到的實現細節來理解Docker的命令。
docker create <image-id>

docker create 命令為指定的鏡像(image)添加了一個可讀寫層,構成了一個新的容器。注意,這個容器並沒有運行。

docker start <container-id>

Docker start命令為容器文件係統創建了一個進程隔離空間。注意,每一個容器隻能夠有一個進程隔離空間。
docker run <image-id>

看到這個命令,讀者通常會有一個疑問:docker start 和 docker run命令有什麼區別。

從圖片可以看出,docker run 命ming令ling先xian是shi利li用yong鏡jing像xiang創chuang建jian了le一yi個ge容rong器qi,然ran後hou運yun行xing這zhe個ge容rong器qi。這zhe個ge命ming令ling非fei常chang的de方fang便bian,並bing且qie隱yin藏zang了le兩liang個ge命ming令ling的de細xi節jie,但dan從cong另ling一yi方fang麵mian來lai看kan,這zhe容rong易yi讓rang用yong戶hu產chan生sheng誤wu解jie。
題外話:繼續我們之前有關於Git的話題,我認為docker run命令類似於git pull命令。git pull命令就是git fetch 和 git merge兩個命令的組合,同樣的,docker run就是docker create和docker start兩個命令的組合。
docker ps

docker ps 命令會列出所有運行中的容器。這隱藏了非運行態容器的存在,如果想要找出這些容器,我們需要使用下麵這個命令。
docker ps –a

docker ps –a命令會列出所有的容器,不管是運行的,還是停止的。
docker images

docker images命令會列出了所有頂層(top-level)鏡像。實際上,在這裏我們沒有辦法區分一個鏡像和一個隻讀層,所以我們提出了top-level鏡像。隻有創建容器時使用的鏡像或者是直接pull下來的鏡像能被稱為頂層(top-level)鏡像,並且每一個頂層鏡像下麵都隱藏了多個鏡像層。
docker images –a

docker images –a命令列出了所有的鏡像,也可以說是列出了所有的可讀層。如果你想要查看某一個image-id下的所有層,可以使用docker history來查看。
docker stop <container-id>

docker stop命令會向運行中的容器發送一個SIGTERM的信號,然後停止所有的進程。
docker kill <container-id>

docker kill 命令向所有運行在容器中的進程發送了一個不友好的SIGKILL信號。
docker pause <container-id>

docker stop和docker kill命令會發送UNIX的信號給運行中的進程,docker pause命令則不一樣,它利用了cgroups的特性將運行中的進程空間暫停。具體的內部原理你可以在這裏找到:https://www.kernel.org/doc/Doc ... m.txt,但是這種方式的不足之處在於發送一個SIGTSTP信號對於進程來說不夠簡單易懂,以至於不能夠讓所有進程暫停。
docker rm <container-id>

docker rm命令會移除構成容器的可讀寫層。注意,這個命令隻能對非運行態容器執行。
docker rmi <image-id>

docker rmi 命令會移除構成鏡像的一個隻讀層。你隻能夠使用docker rmi來移除最頂層(top level layer)(也可以說是鏡像),你也可以使用-f參數來強製刪除中間的隻讀層。
docker commit <container-id>

docker commit命令將容器的可讀寫層轉換為一個隻讀層,這樣就把一個容器轉換成了不可變的鏡像。
docker build

docker build命令非常有趣,它會反複的執行多個命令。

我們從上圖可以看到,build命令根據Dockerfile文件中的FROM指令獲取到鏡像,然後重複地1)run(create和start)、2)修改、3)commit。在循環中的每一步都會生成一個新的層,因此許多新的層會被創建。
docker exec <running-container-id>

docker exec 命令會在運行中的容器執行一個新進程。
docker inspect <container-id> or <image-id>

docker inspect命令會提取出容器或者鏡像最頂層的元數據。
docker save <image-id>

docker save命令會創建一個鏡像的壓縮文件,這個文件能夠在另外一個主機的Docker上使用。和export命令不同,這個命令為每一個層都保存了它們的元數據。這個命令隻能對鏡像生效。
docker export <container-id>

docker export命令創建一個tar文件,並且移除了元數據和不必要的層,將多個層整合成了一個層,隻保存了當前統一視角看到的內容(譯者注:expoxt後的容器再import到Docker中,通過docker images –tree命令隻能看到一個鏡像;而save後的鏡像則不同,它能夠看到這個鏡像的曆史鏡像)。
docker history <image-id>

docker history命令遞歸地輸出指定鏡像的曆史鏡像。
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- e絡盟與Same Sky簽署全球分銷協議,拓展高性能元器件版圖
- 告別“偏色”煩惱:光譜傳感器如何重塑手機攝影的真實色彩
- 從“掃描”到“洞察”:Hyperlux ID iToF技術如何攻克30米測距極限
- 解鎖算力芯片的“速度密碼”:SmartDV全棧IP方案深度解析
- 發燒友福音!XMOS推出32段EQ調節與一鍵升頻功能
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
開關三極管
科通
可變電容
可調電感
可控矽
空心線圈
控製變壓器
控製模塊
藍牙
藍牙4.0
藍牙模塊
浪湧保護器
雷度電子
鋰電池
利爾達
連接器
流量單位
漏電保護器
濾波電感
濾波器
路由器設置
鋁電解電容
鋁殼電阻
邏輯IC
馬達控製
麥克風
脈衝變壓器
鉚接設備
夢想電子
模擬鎖相環





