本文為大家介紹了docker中的容器和映像的區別,希望能幫助大家。
(推薦教學:docker教學)
當我對Docker技術還是一知半解的時候,我發現理解Docker的指令非常困難。於是,我花了幾週的時間學習Docker的工作原理,更確切地說,是關於Docker統一檔案系統(the union file system)的知識,然後回過頭來再看Docker的命令,一切變得順理成章,簡單極了。
題外話:就我個人而言,掌握一門技術並合理使用它的最好方法就是深入理解這項技術背後的工作原理。通常情況 下,一項新技術的誕生常常會伴隨著媒體的大肆宣傳和炒作,這使得用戶很難看清技術的本質。更確切地說,新科技總是會發明一些新的術語或隱喻詞來幫助宣
傳,這在初期是非常有幫助的,但是這給技術的原理蒙上了一層砂紙,不利於用戶在後期掌握技術的真諦。
Git就是一個很好的例子。我之前不能夠很好的使用Git,於是我花了一段時間去學習Git的原理,直到這時,我才真正明白了Git的用法。我堅信只有真正理解Git內部原理的人才能夠掌握這個工具。
Image Definition
鏡像(Image)就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義。
從左邊我們看到了多個唯讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指標指向下一層。這些層是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)幾乎一模一樣,也是一堆層的統一視角,唯一差別在於容器的最上面那一層是可讀可寫的。
細心的讀者可能會發現,容器的定義並沒有提及容器是否在運行,沒錯,這是故意的。正是這個發現幫助我理解了許多困惑。
要點:容器 = 鏡像 可讀層。且容器的定義並沒有提及是否要執行容器。
接下來,我們將會討論運行態容器。
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)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。
Metadata Location:
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是这层的id
一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/
全局理解(Tying It All Together)
现在,让我们结合上面提到的实现细节来理解Docker的命令。
docker create
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
docker start
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
docker run
看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。
從圖片可以看出,docker run 指令先是利用映像建立了一個容器,然後再執行這個容器。這個命令非常的方便,並且隱藏了兩個命令的細節,但從另一方面來看,這很容易讓使用者產生誤解。
題外話:繼續我們之前有關於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
docker stop指令會向運作中的容器發送一個SIGTERM的訊號,然後停止所有的進程。
docker kill
docker kill 指令向所有運行在容器中的進程發送了一個不友善的SIGKILL訊號.
docker pause
docker stop和docker kill指令會傳送UNIX的訊號給執行中的流程,docker pause指令則不一樣,它利用了cgroups的特性將運作中的行程空間暫停。具體的內部原理你可以在這裡找到:www.kernel.org/doc/Doc ...…,但是這種方式的不足之處在於發送一個SIGTSTP信號對於進程來說不夠簡單易懂,以至於不能夠讓所有進程暫停。
docker rm
docker rm指令會移除構成容器的可讀寫入層。注意,這個指令只能對非運行態容器執行。
docker rmi
#
docker rmi 指令會移除構成映像的一個唯讀層。你只能夠使用docker rmi來移除最頂層(top level layer)(也可以說是鏡像),你也可以使用-f參數來強制刪除中間的唯讀層。
docker commit
docker commit指令將容器的可讀寫層轉換為唯讀層,這樣就把一個容器轉換成了不可變的鏡像。
docker build
docker build指令非常有趣,它會重複的執行多個指令。
我們從上圖可以看到,build指令根據Dockerfile檔案中的FROM指令取得到映像,然後重複地1)run(create和start) 、2)修改、3)commit。在循環中的每一步都會產生一個新的層,因此許多新的層會被創建。
docker exec
##
以上是docker中的容器和映像有什麼區別麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

WebStorm Mac版
好用的JavaScript開發工具

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