詳細講解docker容器和鏡像的區別

来源:https://www.cnblogs.com/mingtianguohou/archive/2020/05/29/12985529.html
-Advertisement-
Play Games

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


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

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

# Image Definition

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

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

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

# Container Definition

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

 

 

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

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

# Running Container Definition

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

 

 

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

 

 

 

我們可以通過運行以下命令來驗證我們上面所說的:

docker run ubuntu touch happiness.txt

即便是這個ubuntu容器不再運行,我們依舊能夠在主機的文件系統上找到這個新文件。

find / -name happiness.txt

# Image Layer Definition

為了將零星的數據整合起來,我們提出了鏡像層(image layer)這個概念。下麵的這張圖描述了一個鏡像層,通過圖片我們能夠發現一個層並不僅僅包含文件系統的改變,它還能包含了其他重要信息。

 

 

 

 

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

 

 

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

Metadata Location:
我發現在我自己的主機上,鏡像層(image layer)的元數據被保存在名為”json”的文件中,比如說:

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

一個容器的元數據好像是被分成了很多文件,但或多或少能夠在/data/docker/lib/containers/<id>目錄下找到,<id>就是一個可讀層的id。這個目錄下的文件大多是運行時的數據,比如說網路,日誌等等。

# 全局理解(Tying It All Together)

docker create <image-id>

docker start <container-id>

 

 

 Docker start命令為容器文件系統創建了一個進程隔離空間。註意,每一個容器只能夠有一個進程隔離空間。

docker run <image-id>

 

 

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

 

 

 

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

docker stop <container-id>

  

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

docker rm <container-id>

 

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

docker commit <container-id>

  

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

docker build

 

 

 

docker save <image-id>

  

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

docker export <container-id>

 

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

 

 

作者 | bethal

來源 | http://sina.lt/gfmf

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • docker容器把資源抽象成對象;作為客戶端,docker這個命令其實就是在對這些抽象出來的資源對象做增刪查改的操作;docker的API是RESTful風格的API,所以它支持類似像http協議里的GET、POST、PUT、DELETE等操作;RESTful風格的API有這樣的特點;1、每一個U... ...
  • 樹莓派版本: Raspberry Pi 4B 操作系統 : Ubuntu Server 20.04_x64 使用 ip a 查看無線網卡名稱: ubuntu@ubuntu:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue st ...
  • 步驟說明: <步驟1:打開控制面板> <步驟2:設置日期,時間> 操作截圖: ...
  • 一、Ubuntu安裝: 為什麼用Ubuntu,作為伺服器初學者開發,如果真的要買蘋果系統電腦性價比不高,所以在window系統中安裝Linux虛擬機是不二之選。為什麼用Ubuntu不多說了,開始安裝吧。 以window 10 為例: 1)點擊控制面板->搜索"開發者設置"->設置開發者模式 2)點擊 ...
  • Linux 下如果我們進入到了一個比較長的路徑,比如: /home/alvin/projects/blogdemos/linux-system-programming/thread /home/alvin/projects/blogdemos/diff /home/harry/study/亞洲文化/ ...
  • linux命令tr: (Translate/ Text Replacer):可以對來自標準輸入的內容進行字元替換,字元刪除,以及重覆字元壓縮。 ***只從stdin標準輸入接收數據: 格式:tr [options] set1 set2 將輸入按照位置從set1映射到set2,然後將輸出寫到stdou ...
  • chronyd時間伺服器,和之前NTP的功能一樣,提供時間的。基礎概念我就不說了,不擅長。chronyd是NTP之後誕生的。最近下載了最新的Centos Linux 8.1,發現裡面沒有ntp服務了,百度一搜發現改為了Chronyd,這篇文章就是部署一個伺服器+客戶端測試。1、伺服器端Centos ... ...
  • 有人說安卓就是 Linux,也有人說安卓是安卓、Linux 是 Linux,兩者沒什麼關係,還有人說安卓用的是 Linux 的內核,那麼它們之間到底是什麼關係呢。要想得到這個問題的答案,我們要先弄清楚幾個概念。 Linux 與 Linux 內核 Linux 與 Linux 內核其實是不一樣的,關於這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...