Docker 儲存驅動詳細介紹_java

來源:互聯網
上載者:User

Docker 儲存驅動詳細介紹

最近做項目,期間對Docker 儲存驅動不會,於是在網上找資料,並解決了,這裡就記錄下。

目的

  1. 理解docker的儲存方式
  2. docker的image和container在host上的目錄結構
  3. docker image和container的內容與配置不同儲存

Docker是一個開源的應用程式容器引擎,主要利用Linux核心namespace實現沙箱隔離,用Cgroup實現資源限制。Docker用於統一開發和部署的輕量級 Linux 容器,試圖解決“依賴地獄”問題,把依賴的服務和組件組合起來,類似船舶使用的集裝箱,達到快速安裝部署。

1. Docker的基本架構—Client和Daemon

讓我們先搞明白docker的基本架構和啟動過程,其實Docker 採用了C/S架構,包括用戶端和服務端。Docker daemon作為服務端接受來自客戶的請求,並處理這些請求(建立、運行、提交容器)。 用戶端和服務端在一個機器上,通過RESTful API 來進行通訊。 具體到使用的過程中,就是在執行 service docker start 後,在主機(host)上產生docker deamon守護進程,在後台運行並等待接收來自用戶端的訊息(即輸入的docker命令,如 docker pull xxx,docker run …,docker commit xxx ),實現跟docker deamon的互動。當啟動docker服務後,可以看到docker進程。

Default

[root@localhost ~]# ps -aux | grep dockerroot  11701 0.0 0.4 359208 16624 ?  Ssl 21:05 0:00 /usr/bin/docker -d -H fd:// --selinux-enabled --insecure-registry 186.100.8.216:5000root  11861 0.0 0.0 113004 2256 pts/0 S+ 23:01 0:00 grep --color=auto docker

說明這個,主要是後面指定檔案系統的時候,需要先在 /etc/sysconfig/docker 的配置具體的storage driver(這個會寫一篇專門的Blog),然後再啟動Docker Daemon,而不能通過run命令的參數進行操作。還可以直接在host命令列通過 docker –d 進行設定。

2. Docker的儲存方式—Storage Driver

Docker模型的核心部分是有效利用分層鏡像機制,鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。不同 Docker 容器就可以共用一些基礎的檔案系統層,同時再加上自己專屬的改動層,大大提高了儲存的效率。其中主要的機制就是分層模型和將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem,來自 這篇文章 )。 針對鏡像儲存docker採用了幾種不同的儲存drivers,包括:aufs,devicemapper,btrfs 和overlay(來自 官網 )。下面簡單對不同的儲存drivers做個介紹。

AUFS

AUFS(AnotherUnionFS)是一種聯合檔案系統。 AUFS 支援為每一個成員目錄(類似 Git 的分支)設定唯讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)許可權, 同時 AUFS 裡有一個類似分層的概念, 對唯讀許可權的分支可以邏輯上進行增量地修改(不影響唯讀部分的)。AUFS唯一一個storage driver可以實現容器間共用可執行及可共用的運行庫, 所以當你跑成千上百個擁有相同程式碼或者運行庫時時候,AUFS是個相當不錯的選擇。

Device mapper

Device mapper 是 Linux 2.6 核心中提供的一種從邏輯裝置到物理裝置的映射架構機制,在該機制下,使用者可以很方便的根據自己的需要制定實現儲存資源的管理原則( 詳見 ) 。Device mapper driver 會建立一個100G的簡單檔案包含你的鏡像和容器,每一個容器被限制在10G大小的卷內(注意:這是利用loopback自動建立的疏鬆檔案,具體為 /var/lib/docker/devicemapper/devicemapper 下的data和metadata,可動態擴張)。可以調整Docker容器的大小, 具體參考 ) 你可以在啟動docker daemon時用參數-s 指定driver,也就是可以 docker -d -s devicemapper 設定docker的儲存driver。先關閉docker服務,執行命令:

Default

[root@localhost ~]# docker -d -s devicemapperINFO[0000] +job serveapi(unix:///var/run/docker.sock) INFO[0000] Listening for HTTP on unix (/var/run/docker.sock) INFO[0000] +job init_networkdriver()     INFO[0000] -job init_networkdriver() = OK (0)   INFO[0000] Loading containers: start.     ....INFO[0000] Loading containers: done.     INFO[0000] docker daemon: 1.4.0 4595d4f/1.4.0; execdriver: native-0.2; graphdriver: devicemapper INFO[0000] +job acceptconnections()      INFO[0000] -job acceptconnections() = OK (0)

另外,docker在啟動容器的時候可以指定 –storage-opt 參數,但是現在只有devicemapper能夠接受參數設定。後面會有針對性的Blog展示。

BTRFS

Btrfs Driver 在docker build可以很高效。但是跟 devicemapper 一樣不支援裝置間共用儲存(參加 官網 )。Btrfs 支援建立快照(snapshot)和複製(clone),還能夠方便的管理多個物理裝置。(詳細瞭解可以參考 IBM對Btrfs的介紹 )

overlay

overlay跟AUFS很像,但是效能比AUFS好,有很好記憶體利用,現在已經合并入Linux核心3.18了。具體使用命令: docker –d –s overlay

官網的Note: It is currently unsupported on btrfs or any Copy on Write filesystem and should only be used over ext4 partitions.

3 Docker目錄結構

Docker兩個最重要的概念是鏡像和容器。那麼我們pull下來的鏡像的儲存在哪裡呢?鏡像運行容器啟動後,我們的操作修改的內容儲存在哪裡呢?因為具體的驅動不同,所以最終的實現效果不同。下面我們以Device Mapper儲存driver為例,分析下docker的儲存結構。

1. 進入 /var/lib/docker 目錄,列出內容:

Default

[root@localhost ~]# cd /var/lib/docker/[root@localhost docker]# lscontainers devicemapper execdriver graph init linkgraph.db repositories-devicemapper tmp trust volumes

根據目錄的內容,可以明顯的看到是使用了devicemapper driver。

註:以下顯示的檔案夾都是在/var/lib/docker下的。

2. pull的鏡像檔案存在哪個檔案夾下呢?( 參考 )

pull的鏡像資訊儲存在了graph檔案夾下,鏡像的內容存在了 devicemapper/ devicemapper/data 下。

3. 啟動的容器運行在哪裡呢?

啟動的容器配置資訊儲存在 containers 裡,查看了還有 execdriver/native/ 。

容器裡操作的內容儲存在 devicemapper/devicemapper/data 下。

4. graph的角色

在Docker架構中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關係的記錄者。graph的本地目錄中,關於每一個的容器鏡像,具體儲存的資訊有:該容器鏡像的中繼資料(json),容器鏡像的大小(layersize)資訊,以及該容器鏡像所代表的具體rootfs。

5. 實驗測試:

- 初始沒有啟容器:

Default

[root@localhost docker]# ll containers/total 0

- 啟動一個容器:

Default

[root@localhost docker]# docker run -i -t --rm centos:7 /bin/bash[root@187a8f9d2865 /]#

所啟動的容器的 UUID=187a8f9d2865

- 啟動容器前,查看查看/var/lib/docker/devicemapper/devicemapper/下檔案的實際大小

Default

[root@bhDocker216 docker]# du -h devicemapper/devicemapper/*2.1G devicemapper/devicemapper/data3.5M devicemapper/devicemapper/metadata

- 在host的主機上查看

Default

[root@bhDocker216 docker]# ls containers/187a8f9d2865c2ac***91b981

查看啟動的容器在UUID檔案夾下面的內容:

Default

[root@bhDocker216 containers]# ll 187a8f9d2865c2ac***91b981total 24-rw-------. 1 root root 273 Mar 5 23:59 187a8f9d2865***-json.log-rw-r--r--. 1 root root 1683 Mar 5 23:58 config.json-rw-r--r--. 1 root root 334 Mar 5 23:58 hostconfig.json-rw-r--r--. 1 root root 13 Mar 5 23:58 hostname-rw-r--r--. 1 root root 174 Mar 5 23:58 hosts-rw-r--r--. 1 root root 69 Mar 5 23:58 resolv.conf- 在啟動的容器添加檔案,並查看。

先在啟動並執行容器內建立一個檔案:

Default

[root@8a1e3ad05d9e /]# dd if=/dev/zero of=floppy.img bs=512 count=57605760+0 records in5760+0 records out2949120 bytes (2.9 MB) copied, 0.0126794 s, 233 MB/s

然後在/var/lib/docker/devicemapper/devicemapper/下查看檔案:

Default

[root@bhDocker216 docker]# du -h devicemapper/devicemapper/*5.5G devicemapper/devicemapper/data4.6M devicemapper/devicemapper/metadata

這地方大小有點出入,是因為先執行了 # dd if=/dev/zero of=test.txt bs=1M count=8000 ,建立一個8G大小的檔案,由於太慢我終止了,但是可以明確的看到在啟動並執行容器裡進行操作,兩個檔案夾都發生了改變(增加)。

- 查看graph,在只pull了一個鏡像(Ubuntu14.10)的情況下,裡面出現了7個長UUID命名的目錄,這是怎麼來的呢?

用 docker images –tree 列出鏡像樹形結構,我們可以看到鏡像的階層式存放區結構。最終的Ubuntu(第7層)是基於第6層改動的,即這種邏輯上的樹中第n層基於是第n-1層改動的,n層依賴n-1層的image。第0層,大小為0,稱為base image。

- graph/UUID目錄下內容是啥呢?

Default

[root@localhost graph]# ll 01bf15a18638145eb*** -htotal 8.0K-rw-------. 1 root root 1.6K Mar 5 18:02 json-rw-------. 1 root root 9 Mar 5 18:02 layersize

查看layersize的內容:數字展示層的大小(單位:B)。 josn:儲存了這個鏡像的中繼資料(如: size,architecture,config,container,**parent的UUID** 等等)。

- 查看devicemapper/devicemapper檔案夾

有兩個檔案夾 data 和 metadata ,其實device mapper driver是就是把 鏡像和容器的檔案 都儲存在 **data** 這個檔案內。可以通過docker info查看data和metadata的大小。 另外可以用 du –h (上面有用到)查看這兩個疏鬆檔案的實際大小。

- execdriver

Default

[root@bhDocker216 docker]# ls execdriver/native/8a1e3ad05d9e66a455e683a2c***2437bdcccdfdfa//對裡面的內容進行查看:[root@bhDocker216 8a1e3ad05d9e66a455e***]# lscontainer.json state.json

- volumes

沒有加-v參數的volumes是空的,經測試如果啟動容器增加加-v參數,volumes檔案夾下將顯示一個UUID,在host進行全域搜尋,只在volumes下找到了,跟鏡像和容器的UUID都沒有關係。

Default

[root@bhDocker216 docker]# find / -name 86eb77f9f5e25676f100***d5a/var/lib/docker/volumes/86eb77f9f5e25676f100***d5a//查看裡面的內容:[root@bhDocker216 volumes]# ls 86eb77f9f5e25676f100***d5aconfig.json[root@bhDocker216 volumes]# cat 86eb77f9f5e25676f100***d5a /config.json {"ID":"86eb77f9f5e25676f100a89ba727bc15185303236aae0dcf4c17223e37651d5a","Path":"/home/data","IsBindMount":true,"Writable":true}

檔案夾作用表格性說明

做個總結,整理一個表格,把/var/lib/docker下的不同檔案夾作用說明下:

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.