搜尋
首頁運維Dockerdocker中的容器和映像有什麼區別麼

docker中的容器和映像有什麼區別麼

Nov 12, 2020 pm 04:16 PM
docker容器鏡像

docker中的容器和映像有什麼區別麼

本文為大家介紹了docker中的容器和映像的區別,希望能幫助大家。

(推薦教學:docker教學

 10张图带你深入理解Docker容器和镜像     


當我對Docker技術還是一知半解的時候,我發現理解Docker的指令非常困難。於是,我花了幾週的時間學習Docker的工作原理,更確切地說,是關於Docker統一檔案系統(the union file system)的知識,然後回過頭來再看Docker的命令,一切變得順理成章,簡單極了。 

題外話:就我個人而言,掌握一門技術並合理使用它的最好方法就是深入理解這項技術背後的工作原理。通常情況 下,一項新技術的誕生常常會伴隨著媒體的大肆宣傳和炒作,這使得用戶很難看清技術的本質。更確切地說,新科技總是會發明一些新的術語或隱喻詞來幫助宣        傳,這在初期是非常有幫助的,但是這給技術的原理蒙上了一層砂紙,不利於用戶在後期掌握技術的真諦。 

Git就是一個很好的例子。我之前不能夠很好的使用Git,於是我花了一段時間去學習Git的原理,直到這時,我才真正明白了Git的用法。我堅信只有真正理解Git內部原理的人才能夠掌握這個工具。

Image Definition

鏡像(Image)就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義。 

 10张图带你深入理解Docker容器和镜像     

從左邊我們看到了多個唯讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指標指向下一層。這些層是Docker內部的實作細節,並且能夠 在主機(譯者註:運行Docker的機器)的檔案系統上存取。統一檔案系統(union file system)技術能夠將不同的層整合成一個檔案系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在,在使用者的角度看來,只存在一個文件系統。我們可以在圖片的右邊看到這個視角的形式。 

你可以在你的主機檔案系統上找到有關這些層的檔案。需要注意的是,在一個運作中的容器內部,這些層是看不見的。在我的主機上,我發現它們存在於/var/lib/docker/aufs目錄下。

sudo tree -L 1 /var/lib/docker/

/var/lib/docker/
├── aufs
├── containers
├── graph
├── init
├── linkgraph.db
├── repositories-aufs
├── tmp
├── trust
└── volumes
7 directories, 2 files

#Container Definition

容器(container)的定義和映像(image)幾乎一模一樣,也是一堆層的統一視角,唯一差別在於容器的最上面那一層是可讀可寫的。 

 10张图带你深入理解Docker容器和镜像     

細心的讀者可能會發現,容器的定義並沒有提及容器是否在運行,沒錯,這是故意的。正是這個發現幫助我理解了許多困惑。 

要點:容器 = 鏡像 可讀層。且容器的定義並沒有提及是否要執行容器。 

接下來,我們將會討論運行態容器。 

Running Container Definition

一個執行態容器(running container)被定義為一個可讀寫的統一檔案系統加上隔離的進程空間和包含其中的進程。下面這張圖片展示了一個運作中的容器。 

 10张图带你深入理解Docker容器和镜像     

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

#

 10张图带你深入理解Docker容器和镜像     

我们可以通过运行以下命令来验证我们上面所说的: 

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)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。 

 10张图带你深入理解Docker容器和镜像     

元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。 

 10张图带你深入理解Docker容器和镜像     

除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。 

 10张图带你深入理解Docker容器和镜像     

Metadata Location: 
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说: 

/var/lib/docker/graph/e809f156dc985.../json

e809f156dc985...就是这层的id 

一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/目录下找到,就是一个可读层的id。这个目录下的文件大多是运行时的数据,比如说网络,日志等等。 

全局理解(Tying It All Together)

现在,让我们结合上面提到的实现细节来理解Docker的命令。 

docker create

 10张图带你深入理解Docker容器和镜像     

docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。 

 10张图带你深入理解Docker容器和镜像     

docker start

 10张图带你深入理解Docker容器和镜像     

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 

docker run

 10张图带你深入理解Docker容器和镜像     

看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。 

docker中的容器和映像有什麼區別麼

從圖片可以看出,docker run 指令先是利用映像建立了一個容器,然後再執行這個容器。這個命令非常的方便,並且隱藏了兩個命令的細節,但從另一方面來看,這很容易讓使用者產生誤解。 

題外話:繼續我們之前有關於Git的話題,我認為docker run指令類似git pull指令。 git pull指令就是git fetch 和 git merge兩個指令的組合,同樣的,docker run就是docker create和docker start兩個指令的組合。 

docker ps

 10张图带你深入理解Docker容器和镜像     

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

docker ps –a

 10张图带你深入理解Docker容器和镜像     

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

docker images

 10张图带你深入理解Docker容器和镜像     

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

docker images –a

 10张图带你深入理解Docker容器和镜像     

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

docker stop

 10张图带你深入理解Docker容器和镜像     

docker stop指令會向運作中的容器發送一個SIGTERM的訊號,然後停止所有的進程。

docker kill

 10张图带你深入理解Docker容器和镜像     

docker kill 指令向所有運行在容器中的進程發送了一個不友善的SIGKILL訊號.

docker pause

 10张图带你深入理解Docker容器和镜像     

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

docker rm

 10张图带你深入理解Docker容器和镜像     

docker rm指令會移除構成容器的可讀寫入層。注意,這個指令只能對非運行態容器執行。 

docker rmi

 10张图带你深入理解Docker容器和镜像#     

docker rmi 指令會移除構成映像的一個唯讀層。你只能夠使用docker rmi來移除最頂層(top level layer)(也可以說是鏡像),你也可以使用-f參數來強制刪除中間的唯讀層。

docker commit

 10张图带你深入理解Docker容器和镜像     

docker commit指令將容器的可讀寫層轉換為唯讀層,這樣就把一個容器轉換成了不可變的鏡像。 
 10张图带你深入理解Docker容器和镜像     

docker build

 10张图带你深入理解Docker容器和镜像     

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

docker中的容器和映像有什麼區別麼

我們從上圖可以看到,build指令根據Dockerfile檔案中的FROM指令取得到映像,然後重複地1)run(create和start) 、2)修改、3)commit。在循環中的每一步都會產生一個新的層,因此許多新的層會被創建。 

docker exec

##      10张图带你深入理解Docker容器和镜像

docker exec 指令會在執行中的容器執行一個新進程。


docker inspect or

      10张图带你深入理解Docker容器和镜像

#docker inspect指令會擷取容器或映像最頂層的元數據。


docker save

      10张图带你深入理解Docker容器和镜像

docker save指令會建立一個映像的壓縮文件,這個檔案能夠在另一個主機的Docker上使用。和export指令不同,這個指令為每一個層都保存了它們的元資料。這個指令只能對鏡像生效。


docker export

      10张图带你深入理解Docker容器和镜像

docker export指令建立一個tar文件,並且移除了元資料和不必要的層,將多個層整合成了一個層,只保存了當前統一視角看到的內容(譯者註:expoxt後的容器再import到Docker中,透過docker images –tree指令只能看到一個鏡像;而save後的鏡像則不同,它能夠看見這個鏡像的歷史鏡像)。 


docker history

      10张图带你深入理解Docker容器和镜像

docker history指令遞歸地輸出指定映像的歷史映像。 

以上是docker中的容器和映像有什麼區別麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金。如有侵權,請聯絡admin@php.cn刪除
將Docker與Linux一起使用:綜合指南將Docker與Linux一起使用:綜合指南Apr 12, 2025 am 12:07 AM

在Linux上使用Docker可以提高開發和部署效率。 1.安裝Docker:使用腳本在Ubuntu上安裝Docker。 2.驗證安裝:運行sudodockerrunhello-world。 3.基本用法:創建Nginx容器dockerrun--namemy-nginx-p8080:80-dnginx。 4.高級用法:創建自定義鏡像,使用Dockerfile構建並運行。 5.優化與最佳實踐:使用多階段構建和DockerCompose,遵循編寫Dockerfile的最佳實踐。

Docker監視:收集指標和跟踪集裝箱健康Docker監視:收集指標和跟踪集裝箱健康Apr 10, 2025 am 09:39 AM

Docker監控的核心在於收集和分析容器的運行數據,主要包括CPU使用率、內存使用、網絡流量和磁盤I/O等指標。通過使用Prometheus、Grafana和cAdvisor等工具,可以實現對容器的全面監控和性能優化。

Docker群:建築物可擴展和彈性的容器簇Docker群:建築物可擴展和彈性的容器簇Apr 09, 2025 am 12:11 AM

DockerSwarm可用於構建可擴展和高可用性的容器集群。 1)初始化Swarm集群使用dockerswarminit。 2)加入Swarm集群使用dockerswarmjoin--token:。 3)創建服務使用dockerservicecreate--namemy-nginx--replicas3nginx。 4)部署複雜服務使用dockerstackdeploy-cdocker-compose.ymlmyapp。

Kubernetes的Docker:用於企業應用程序的集裝箱編排Kubernetes的Docker:用於企業應用程序的集裝箱編排Apr 08, 2025 am 12:07 AM

如何利用Docker和Kubernetes進行企業應用的容器編排?通過以下步驟實現:創建Docker鏡像並推送到DockerHub。在Kubernetes中創建Deployment和Service以部署應用。使用Ingress管理外部訪問。應用性能優化和最佳實踐,如多階段構建和資源限制。

Docker故障排除:診斷和解決常見問題Docker故障排除:診斷和解決常見問題Apr 07, 2025 am 12:15 AM

Docker常見問題可以通過以下步驟診斷和解決:1.查看容器狀態和日誌,2.檢查網絡配置,3.確保卷掛載正確。通過這些方法,可以快速定位並修復Docker中的問題,提升系統穩定性和性能。

Docker面試問題:Ace您的DevOps工程採訪Docker面試問題:Ace您的DevOps工程採訪Apr 06, 2025 am 12:01 AM

Docker是DevOps工程師必備的技能。 1.Docker是開源的容器化平台,通過將應用程序及其依賴打包到容器中,實現隔離和可移植性。 2.Docker的工作原理包括命名空間、控制組和聯合文件系統。 3.基本用法包括創建、運行和管理容器。 4.高級用法包括使用DockerCompose管理多容器應用。 5.常見錯誤有容器無法啟動、端口映射問題和數據持久化問題,調試技巧包括查看日誌、進入容器和查看詳細信息。 6.性能優化和最佳實踐包括鏡像優化、資源限制、網絡優化和使用Dockerfile的最佳實踐。

Docker安全硬化:保護您的容器免受漏洞Docker安全硬化:保護您的容器免受漏洞Apr 05, 2025 am 12:08 AM

Docker安全強化的方法包括:1.使用--cap-drop參數限制Linux能力,2.創建只讀容器,3.設置SELinux標籤。這些策略通過減少漏洞暴露面和限制攻擊者能力來保護容器安全。

Docker卷:在容器中管理持久數據Docker卷:在容器中管理持久數據Apr 04, 2025 am 12:19 AM

DockerVolumes可確保數據在容器重啟、刪除或遷移時依然安全。 1.創建Volume:dockervolumecreatemydata。 2.運行容器並掛載Volume:dockerrun-it-vmydata:/app/dataubuntubash。 3.高級用法包括數據共享和備份。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Safe Exam Browser

Safe Exam Browser

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