搜尋
首頁運維Docker十分鐘可以跟著Docker學分層復用思想

這篇文章為大家帶來了docker中映像分層、容器分層和容器在磁碟佔用空間的相關問題,希望對大家有幫助。

十分鐘可以跟著Docker學分層復用思想

Docker是如何組織儲存的

dokcer在組織儲存內容時很巧妙的應用了分層復用的想法。所以我們可以以此為案例學習一下該想法。

1.映像分層

一個Docker映像在建置的過程中分了很多層,每一層都是唯讀的。結合下面範例進行說明:

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
LABEL org.opencontainers.image.authors="org@example.com"
COPY . /app
RUN make /app
RUN rm -r $HOME/.cache
CMD python /app/app.py

這個Dockerfile中會有4個指令改變了檔案系統並建立了新圖層。

  • FROM指令從ubuntu:18.04的映像中建立了基礎層。
  • LABEL指令僅僅修改了鏡像的元數據,不會建立新層。
  • COPY指令將執行本次建置的目前目錄中的內容新增至鏡像當中,會建立一個新層記錄變更。
  • 第一個RUN指令,建立了程式並將結果輸出到映像中,會建立一個新層記錄變更。
  • 第二個RUN指令,刪除了快取目錄,會建立一個新層記錄改變。
  • CMD指令定義了容器中執行的指令,只是修改了鏡像的元數據,並不會建立新層。

這裡每層都只記錄與其上一層的不同。當我們創建一個容器的時候,這是就會創建一層可寫層,也叫容器層。對於正在運作中的容器的內容的變化都會記錄在該層中。下圖描述了該關係:

2.容器分層

容器和鏡像的不同主要是最頂層的可寫層的不同,所有對於容器的寫入操作都會記錄在這層中,如果容器被刪除,那麼這個可寫層也會被刪除,但是鏡像會被保留。

注意:如果想要多個容器共享相同的數據,可以透過Docker Volumes實作。

每個容器都有自己的可寫層,所有的變換都會被存放在其中,所以多個容器可共用同一個映像。下圖描述了該關係:

注意 :這裡還有個細節,多個鏡像可能共用相同的層,例如兩個鏡像中有相同的層,那麼在建造或是拉取的時候發現本地以存在,則不會再次建造或拉取。所以計算鏡像大小的時候,不能只透過 docker images指令顯示出的大小來匯總求和,該值有可能大於實際值。

3.容器在磁碟所佔用的空間

可以透過docker ps -s指令,來看正在執行中的容器所佔用的空間(部分值)。兩個欄位的不同代表的內容:

  • size: 容器的可寫層所佔用的磁碟大小
  • virtual size: 包含了容器可寫層和唯讀鏡像的大小。

容器佔用磁碟空間的其它途徑:

  • 容器產生的日誌檔案。
  • 使用Volume和bind mounts掛載的內容。
  • 容器的設定檔
  • 記憶體中的內容(如果開啟了swapping)
  • Checkpoints(如果使用了該功能)

4.Copy-on-Write(CoW)策略

Docker中的儲存驅動程式都是採用該策略。

CoW策略能夠最大效率的共享和複製檔案。如果一個檔案在鏡像的較低層存在,那麼其上層(包括可寫層)需要讀取該內容則可以直接使用該檔案。當需要對其進行修改時,會複製該檔案到該圖層並進行修改。這最大限度的減少了IO和每個後續層的大小。

4.1共享使映像更小

當我們使用docker pull拉取映像或是使用一個本地沒有的映像建立容器的時候,該鏡像會被分層的儲存到本機Dockers儲存區域。在linux中通常是 /var/lib/docker

我們可以去 /var/lib/docker/<storage-driver></storage-driver>目錄下看我們已拉取各層映像。例如使用 overlay2儲存驅動程式。

這麼多層,我們可以透過docker image inspect來查看某個映像包含哪些層

docker image inspect --format "{{json .RootFS.Layers}}" redis

docker image inspect --format "{{json .RootFS.Layers}}" mysql:5.7

十分鐘可以跟著Docker學分層復用思想

#透過上面查看我們可以看到redis和mysql5.7運用了同一層,這樣共享相同層就大大節省了儲存鏡像的空間,同時也提升了拉取鏡像的速度。

我们可以通过 docker image history命令来查看镜像分层情况,以redis为例

docker history redis

注意 :

  • 有些步骤的大小为0,是因为他们只改变了元数据,并不会产生新层,也不会占用额外的空间(除元数据本身)。所以上述redis镜像中包含了5层。

  • <missing></missing>步骤,这些步骤可能是以下情况中的一种

    • 在另一个系统上构建的
    • 从Docker Hub中提取的
    • 使用BuildKit作为构建器构建的。

4.2复制让容器更有效率

当我们启动一个容器的时候,会添加一个可写层在镜像之上,用于存储所有的变化。当对已有文件进行修改的时候采用CoW策略。首先会到各层寻找到该文件,然后复制该文件到可写层,然后进行修改并存储。

这么做能够让我们最大限度地减少I/O操作。

但是,很明显的是当一个容器中的应用需要进行频繁的写操作,那么会造成可写层越来越庞大,此时我们可以通过Volume来帮助我们分担压力。

容器的元数据和日志是单独存放的,一般是存放在 /var/lib/docker/containers中,我们可以使用 du -sh /var/lib/docker/containers/*来查看各个容器占用多少。(容器ID其实就是文件夹名称的前12位)。

推荐学习:《docker视频教程

以上是十分鐘可以跟著Docker學分層復用思想的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
為什麼要使用Docker?解釋的好處和優勢為什麼要使用Docker?解釋的好處和優勢Apr 25, 2025 am 12:05 AM

使用Docker的原因是它提供高效、便攜且一致的環境來打包、分發和運行應用程序。 1)Docker是一種容器化平台,允許開發者將應用程序及其依賴項打包到輕量級、可移植的容器中。 2)它基於Linux容器技術和聯合文件系統,確保快速啟動和高效運行。 3)Docker支持多階段構建,優化鏡像大小和部署速度。 4)使用Docker可以簡化開發和部署流程,提高效率並確保跨環境的一致性。

Docker在行動:現實世界中的示例和用例Docker在行動:現實世界中的示例和用例Apr 24, 2025 am 12:10 AM

Docker在實際項目中的應用場景包括簡化部署、管理多容器應用和性能優化。 1.Docker簡化了應用部署,如使用Dockerfile部署Node.js應用。 2.DockerCompose管理多容器應用,如微服務架構中的Web和數據庫服務。 3.性能優化使用多階段構建減小鏡像大小,並通過健康檢查監控容器狀態。

Docker vs. Kubernetes:用例和方案Docker vs. Kubernetes:用例和方案Apr 23, 2025 am 12:11 AM

在小型項目或開發環境中選擇Docker,在大型項目或生產環境中選擇Kubernetes。 1.Docker適合快速迭代和測試,2.Kubernetes提供強大的容器編排能力,適合管理和擴展大型應用。

Linux上的Docker:Linux系統的容器化Linux上的Docker:Linux系統的容器化Apr 22, 2025 am 12:03 AM

Docker在Linux上重要,因為Linux是其原生平台,提供了豐富的工具和社區支持。 1.安裝Docker:使用sudoapt-getupdate和sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io。 2.創建和管理容器:使用dockerrun命令,如dockerrun-d--namemynginx-p80:80nginx。 3.編寫Dockerfile:優化鏡像大小,使用多階段構建。 4.優化和調試:使用dockerlogs和dockerex

Docker:容器化工具,Kubernetes:編排者Docker:容器化工具,Kubernetes:編排者Apr 21, 2025 am 12:01 AM

Docker是容器化工具,Kubernetes是容器編排工具。 1.Docker打包應用及其依賴成容器,可在任何支持Docker的環境中運行。 2.Kubernetes管理這些容器,實現自動化部署、擴展和管理,使應用高效運行。

Docker的目的:簡化應用程序部署Docker的目的:簡化應用程序部署Apr 20, 2025 am 12:09 AM

Docker的目的是簡化應用部署,通過容器化技術確保應用在不同環境中一致運行。 1)Docker通過將應用和依賴打包到容器中,解決了環境差異問題。 2)使用Dockerfile創建鏡像,確保應用在任何地方一致運行。 3)Docker的工作原理基於鏡像和容器,利用Linux內核的命名空間和控制組實現隔離和資源管理。 4)基本用法包括從DockerHub拉取並運行鏡像,高級用法涉及使用DockerCompose管理多容器應用。 5)常見錯誤如鏡像構建失敗和容器無法啟動,可通過日誌和網絡配置調試。 6)性能優化建

Linux和Docker:不同Linux發行版的DockerLinux和Docker:不同Linux發行版的DockerApr 19, 2025 am 12:10 AM

在Ubuntu、CentOS和Debian上安裝和使用Docker的方法各有不同。 1)Ubuntu:使用apt包管理器,命令為sudoapt-getupdate&&sudoapt-getinstalldocker.io。 2)CentOS:使用yum包管理器,需添加Docker倉庫,命令為sudoyuminstall-yyum-utils&&sudoyum-config-manager--add-repohttps://download.docker.com/lin

掌握Docker:Linux用戶指南掌握Docker:Linux用戶指南Apr 18, 2025 am 12:08 AM

在Linux上使用Docker可以提高開發效率和簡化應用部署。 1)拉取Ubuntu鏡像:dockerpullubuntu。 2)運行Ubuntu容器:dockerrun-itubuntu/bin/bash。 3)創建包含nginx的Dockerfile:FROMubuntu;RUNapt-getupdate&&apt-getinstall-ynginx;EXPOSE80。4)構建鏡像:dockerbuild-tmy-nginx.。 5)運行容器:dockerrun-d-p8080:80

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

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

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器