Docker原理之UnionFS

一、UnionFS

Linux 的命名空間和控制組分別解決了不同資源隔離的問題,前者解決了進程、網絡以及文件系統的隔離,后者實現了 CPU、內存等資源的隔離,但是在 Docker 中還有另一個非常重要的問題需要解決 - 也就是鏡像。

鏡像到底是什么,它又是如何組成和組織的是作者使用 Docker 以來的一段時間內一直比較讓作者感到困惑的問題,我們可以使用 docker run 非常輕松地從遠程下載 Docker 的鏡像并在本地運行。

Docker 鏡像其實本質就是一個壓縮包,我們可以使用下面的命令將一個 Docker 鏡像中的文件導出:

$ docker export $(docker create busybox) | tar -C rootfs -xvf -
$ ls
bin  dev  etc  home proc root sys  tmp  usr  var

你可以看到這個 busybox 鏡像中的目錄結構與 Linux 操作系統的根目錄中的內容并沒有太多的區別,可以說 Docker 鏡像就是一個文件。

二、存儲驅動

Docker 使用了一系列不同的存儲驅動管理鏡像內的文件系統并運行容器,這些存儲驅動與 Docker 卷(volume)有些不同,存儲引擎管理著能夠在多個容器之間共享的存儲。

想要理解 Docker 使用的存儲驅動,我們首先需要理解 Docker 是如何構建并且存儲鏡像的,也需要明白 Docker 的鏡像是如何被每一個容器所使用的;Docker 中的每一個鏡像都是由一系列只讀的層組成的,Dockerfile 中的每一個命令都會在已有的只讀層上創建一個新的層:

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

容器中的每一層都只對當前容器進行了非常小的修改,上述的 Dockerfile 文件會構建一個擁有四層 layer 的鏡像:

16.png

當鏡像被 docker run 命令創建時就會在鏡像的最上層添加g zhi一個可寫的層,也就是容器層,所有對于運行時容器的修改其實都是對這個容器讀寫層的修改。

容器和鏡像的區別就在于,所有的鏡像都是只讀的,而每一個容器其實等于鏡像加上一個可讀寫的層,也就是同一個鏡像可以對應多個容器。

17.png

三、AUFS

UnionFS 其實是一種為 Linux 操作系統設計的用于把多個文件系統『聯合』到同一個掛載點的文件系統服務。而 AUFS 即 Advanced UnionFS 其實就是 UnionFS 的升級版,它能夠提供更優秀的性能和效率。

AUFS 作為聯合文件系統,它能夠將不同文件夾中的層聯合(Union)到了同一個文件夾中,這些文件夾在 AUFS 中稱作分支,整個『聯合』的過程被稱為聯合掛載(Union Mount):

18.png

每一個鏡像層或者容器層都是 /var/lib/docker/ 目錄下的一個子文件夾;在 Docker 中,所有鏡像層和容器層的內容都存儲在 /var/lib/docker/aufs/diff/ 目錄中:

$ ls /var/lib/docker/aufs/diff/00adcccc1a55a36a610a6ebb3e07cc35577f2f5a3b671be3dbc0e74db9ca691c       93604f232a831b22aeb372d5b11af8c8779feb96590a6dc36a80140e38e764d8
00adcccc1a55a36a610a6ebb3e07cc35577f2f5a3b671be3dbc0e74db9ca691c-init  93604f232a831b22aeb372d5b11af8c8779feb96590a6dc36a80140e38e764d8-init
019a8283e2ff6fca8d0a07884c78b41662979f848190f0658813bb6a9a464a90       93b06191602b7934fafc984fbacae02911b579769d0debd89cf2a032e7f35cfa
...

而 /var/lib/docker/aufs/layers/ 中存儲著鏡像層的元數據,每一個文件都保存著鏡像層的元數據,最后的 /var/lib/docker/aufs/mnt/ 包含鏡像或者容器層的掛載點,最終會被 Docker 通過聯合的方式進行組裝。

19.png

上面的這張圖片非常好的展示了組裝的過程,每一個鏡像層都是建立在另一個鏡像層之上的,同時所有的鏡像層都是只讀的,只有每個容器最頂層的容器層才可以被用戶直接讀寫,所有的容器都建立在一些底層服務(Kernel)上,包括命名空間、控制組、rootfs 等等,這種容器的組裝方式提供了非常大的靈活性,只讀的鏡像層通過共享也能夠減少磁盤的占用。

四、其他存儲驅動

AUFS 只是 Docker 使用的存儲驅動的一種,除了 AUFS 之外,Docker 還支持了不同的存儲驅動,包括 aufs、devicemapper、overlay2、zfs 和 vfs 等等,在最新的 Docker 中,overlay2 取代了 aufs 成為了推薦的存儲驅動,但是在沒有 overlay2 驅動的機器上仍然會使用 aufs 作為 Docker 的默認驅動。

20.png

不同的存儲驅動在存儲鏡像和容器文件時也有著完全不同的實現,有興趣的讀者可以在 Docker 的官方文檔 Select a storage driver 中找到相應的內容。

想要查看當前系統的 Docker 上使用了哪種存儲驅動只需要使用以下的命令就能得到相對應的信息:

$ docker info | grep Storage
Storage Driver: aufs

作者的這臺 Ubuntu 上由于沒有 overlay2 存儲驅動,所以使用 aufs 作為 Docker 的默認存儲驅動。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535716.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

教你精確編寫高質量高性能的MySQL語法

在應用系統開發初期,由于開發數據庫數據比較少,對于查詢SQL語句,復雜視圖的編寫,剛開始不會體會出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用后,隨著數據庫中數據的增加,系統的…

Docker使用-Hello World

1、docker pull hello-world 拉去docker遠程倉庫中的Hello World的鏡像 [rootCarlota2 ~]# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e09…

Mysql數據庫引擎快速指南

如果你是個賽車手并且按一下按鈕就能夠立即更換引擎而不需要把車開到車庫里去換,那會是怎么感覺呢? MySQL 數據庫為開發人員所做的就好像是按按鈕換引擎;它讓你選擇數據庫引擎,并給你一條簡單的途徑來切換它。 MySQL的自帶引擎肯…

Docker使用-構建MySQL

拉取官方鏡像(我們這里選擇5.7,如果不寫后面的版本號則會自動拉取最新版) docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mysql鏡像MySQL文檔地址 檢查是否拉取成功 $ sudo docker images一般來說數據庫容…

Java集合:什么是Java集合?

一、集合的由來 通常,我們的Java程序需要根據程序運行時才知道創建了多少個對象。但若非程序運行,程序開發階段,我們根本不知道到底需要多少個數量的對象,甚至不知道它的準確類型。為了滿足這些常規的編程需要,我們要…

Mysql截取中英數混合的字符串

在 mysql中截取字符串我們用 LEFT函數 LEFT(str,len) 返回從字符串str 開始的len 最左字符。 mysql> SELECT LEFT(foobarbar, 5); -> fooba 手冊上只介紹了截取英文字符串的方法,中文或者中英文的怎么辦呢?以下是截取中英混合的字符串(中國人…

Java集合:Collection接口

Collection是一個接口,繼承自Iterable。我們先看一下Iterable接口的源碼 一、Iterable package java.lang;import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Cons…

Java集合:List集合

List集合 List集合類中元素有序、且可重復,集合中的每個元素都有其對應的順序索引。 List容器中的元素都對應一個整數型的序號記載其在容器中的位置,可以根據序號存取容器中的元素。 JDK API中List接口的實現類常用的有:ArrayList、LinkList和…

MySQL為什么要set names

大家都知道SET NAMES x相當于SET character_set_client x;SET character_set_results x;SET character_set_connection x; 以下從MySQL5.0官方文檔上摘錄了相關內容,并翻譯,說明了相關系統變量的用處: What character set is the statem…

MySql日期處理系列-常用的日期推算處理

以下都是我平時用的一些日期推算處理方法,方法并不一定是最有效率的.全部均通過測試!轉載請注明來自[phpchina.com] #title: 常用的日期推算處理#auther: 小強(占卜師) #date: 2007-12-25 #取得當前日期set dtCURDATE();select dt; #當前日期這個月的第一天selec…

Java集合:Set集合

一、Set接口的特點 一個不包含重復元素的collection。更確切地講,Set不包含滿足e1.equals(e2)的元素對 e1和e2,并且最多包含一個null元素。 Set集合由Set接口和Set接口的實現類組成,Set接口繼承了Collection接口,因此包含了Coll…

談談我對MYSQL亂碼的解決辦法

經常更換虛擬主機,而各個服務商的MYSQL版本不同,當導入數據后,總會出現亂碼等無法正常顯示的問題,查了好多資料,總結出自己的一點技巧: WINDOWS 下導入應該這樣使用MYSQL的命令在DOS命令下進入mysql的bin目錄下,輸入mysql -uroot -p密碼 數據庫名稱<要恢復的數據庫, 例如我們…

Java集合:Map集合

一、簡述 public interface Map<K,V>將鍵映射到值的對象。一個映射不能包含重復的鍵&#xff1b;每個鍵最多只能映射到一個值。 注意&#xff1a;Map中的集合不能包含重復的鍵&#xff0c;值可以重復。每個鍵只能對應一個值。 Map集合是鍵值對形式存儲值的&#xff0c…

用離線編輯器Zoundry寫zblog日志

Zoundry是免費的離線網志發布工具&#xff0c;由于家里的網絡很差&#xff0c;寫了一半的日志經常因為掉線而丟失&#xff0c;這樣一款軟件的確是很必要的。今天下載試用了一下&#xff0c;感覺的確不錯。使用起來也很簡單&#xff1a; 1.下載并安裝zoundry軟件&#xff1a;現…

MySQL:基本命令

一、數據庫操作 1、查詢數據庫&#xff0c;命令如下: SHOW DATABASES;2、我們可以在登陸 MySQL 服務后&#xff0c;使用 create 命令創建數據庫&#xff0c;命令格式: CREATE DATABASE 數據庫名;3、使用 drop 命令刪除數據庫&#xff0c;命令格式&#xff1a; drop databas…

CentOS 5打造全功能Web服務器

轉&#xff1a;主要做為歷史記錄&#xff0c;以后用。另外很少見這么好的編譯的文章&#xff0c;其實我不推薦用編譯安裝。但這個文章不錯.V3.0 2007年11月11日 將搭建教程劃分階段以適應不同需要。加入程序優化&#xff0c;程序安全&#xff0c;加入memcache&#xff0c;squid…

MySQL:查詢條件

查詢條件 1、使用 WHERE 子句從數據表中讀取數據的通用語法&#xff1a; SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....查詢語句中你可以使用一個或者多個表&#xff0c;表之間使用逗號**,** 分割&#x…

linux下的ImageMagick安裝

檢查系統有無安裝ImageMagick官方網址是&#xff1a; www.imagemagick.org 從官方不好下載&#xff0c;提供 sourceforge的下載地址&#xff1a; imagemagick.sourceforge.net shell> rpm -qa | grep ImageMagick 沒有就開始安裝ImageMagickshell> rpm -Uvh ImageMagi…

MySQL:進階應用

一、進階應用 1、可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。 JOIN 按照功能大致分為如下三類&#xff1a; INNER JOIN&#xff08;內連接,或等值連接&#xff09;&#xff1a;獲取兩個表中字段匹配關系的記錄。**LEFT JOIN&#xff08;左連…

Hive-常用操作

一. 數據庫操作 1、創建數據庫 //用戶可以用 IF NOT EXISTS 選項來忽略這個異常。create database [ if not exists ] myhive ;2、創建數據庫并指定hdfs存儲位置 create database myhive2 location /myhive2;3、修改數據庫&#xff0c;可以使用alter database 命令來修改數據…