1. 程式人生 > >docker基礎工作原理(二)

docker基礎工作原理(二)

注:以下博文來源於我的獨立部落格網站:http://www.chenbiaolong.com/,由於原網站是用markdown寫的,複製到這邊格式有點問題。

在本篇博文中將主要介紹docker使用device mapper管理映象的原理。這部分內容我也沒完全搞懂,以下內容主要是通過參考多篇博文總結出的概要。

loop裝置介紹

在類 UNIX 系統裡,loop 裝置是一種偽裝置(pseudo-device),或者也可以說是模擬裝置。它能使我們像塊裝置一樣訪問一個檔案。
在使用之前,一個 loop 裝置必須要和一個檔案進行連線。這種結合方式給使用者提供了一個替代塊特殊檔案的介面。因此,如果這個檔案包含有一個完整的檔案系統,那麼這個檔案就可以像一個磁碟裝置一樣被 mount 起來。

loop裝置測試例項

  1. 首先建立一個 1G 大小的空檔案:
1 dd if=/dev/zero of=loopfile.img bs=1G count=1

2.對該檔案格式化為 ext4 格式:

1234567891011121314151617181920212223 # mkfs.ext4 loopfile.imgmke2fs 1.41.11 (14-Mar-2010)loopfile.img is not a block special device.Proceed anyway? (y,n) yFilesystem label=OS type: LinuxBlock size=4096
(log=2)Fragment size=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks65536 inodes, 262144 blocks13107 blocks (5.00%) reserved for the super userFirst data block=0Maximum filesystem blocks=2684354568 block groups32768 blocks per group, 32768 fragments per group8192 inodes per groupSuperblock backups stored on
blocks:32768,98304, 163840, 229376Writing inode tables:doneCreating journal (8192 blocks): doneWriting superblocks and filesystem accounting information:doneThis filesystem will be automatically checked every 38 mountsor180 days, whichever comesfirst. Use tune2fs -c or -i tooverride.

用 file 命令檢視下格式化後的檔案型別:

12 # file loopfile.imgloopfile.img: Linux rev 1.0 ext4 filesystem data,UUID=a9dfb4a0-6653-4407-ae05-7044d92c1159 (extents) (large files)(huge files)

準備將上面的檔案掛載起來:

12 # mkdir /mnt/loopback# mount -o loop loopfile.img /mnt/loopback

mount 命令的 -o loop 選項可以將任意一個 loopback 檔案系統掛載。上面的 mount 命令實際等價於下面兩條命令:

12 # losetup /dev/loop0 loopfile.img# mount /dev/loop0 /mnt/loopback

因此實際上,mount -o loop 在內部已經預設的將檔案和 /dev/loop0 掛載起來了。然而對於第一種方法(mount -oloop)並不能適用於所有的場景。比如,我們想建立一個硬碟檔案,然後對該檔案進行分割槽,接著掛載其中一個子分割槽,這時就不能用 -oloop 這種方法了。因此必須如下做:

12 # losetup /dev/loop1 loopfile.img# fdisk /dev/loop1

解除安裝掛載點

1 # umount /mnt/loopback

docker儲存結構分析

docker中映象的layer是通過device mapper thin provisioning(自動精簡配置)模式實現的。
thin provision是在 kernel3.2 中引入的。它主要有以下一些特點:
(1)允許多個虛擬裝置儲存在相同的資料卷中,從而達到共享資料,節省空間的目的;
(2)支援任意深度的快照。之前的實現的效能為O(n),新的實現通過一個單獨的資料避免了效能隨快照深度的增加而降低。
(3)支援元資料儲存到單獨的裝置上。這樣就可以將元資料放到映象裝置或者更快的SSD上。
thin provisioning模式需要兩個塊裝置,一個儲存data資訊,一個儲存metadata資訊。設定好這兩個塊裝置之後thin provision可以建立一個儲存池(pool)。
具體到docker,docker在/var/lib/docker/devicemapper自動建立兩個稀疏檔案:data檔案(預設100G)和metadata檔案(預設2G)。稀疏檔案只有在真正往裡面存入資料後才會實際佔用磁碟空間。這兩個檔案與2個loop裝置進行連線,一般來說data檔案關聯到/dev/loop0裝置,metadata檔案關聯到/dev/loop1裝置。thin provison通過這兩個裝置建立起一個儲存池。可以通過dmsetup table檢視儲存池資訊

12345 [[email protected] devicemapper]# dmsetup tabledocker-253:1-153295518-pool: 0 209715200 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing centos-home: 0 1628528640 linear 8:3 8161280centos-swap: 0 8159232 linear 8:3 2048centos-root: 0 104857600 linear 8:3 1636689920

pool的具體資訊如下:

1 docker-253:1-153295518-pool: 0 209715200 thin-pool 7:1 7:0 128 32768 1

可以通過dmsetup命令具體分析其table格式:

123 dmsetup create pool \ --table "0 209715200 thin-pool $metadata_dev $data_dev \ $data_block_size $low_water_mark

這個儲存池大小為209715200/2/1024/1024=100G,metadata裝置為7:1,在我的電腦中對應/dev/loop1,data裝置為7:0 對應/dev/loop0裝置。128指data_block_size,它代表一次申請的最小磁碟空間,單位為sector(512位元組)。32768是low_water_mark,單位也是sector。當data的實際剩餘空間小於這個值時將會觸發一個dm event。詳細說明請參考官方文件:https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt

當啟動容器後將會從該儲存池中分配出10G(預設值)空間建立thin volume,用來儲存映象和容器檔案系統的資料。這個過程具體是通過快照(snapshot)實現的。因此同一個映象可以通過快照被多個容器使用,當容器修改映象時,通過copy on write實現映象的修改。
綜合來看,docker的儲存結構如下圖所示
docker儲存結構
比如建立一個apache容器時devicemapper處理流程如下所示:
1.Create a snapshot of the base device.
2.Mount it and apply the changes in the fedora image.
3.Create a snapshot based on the fedora device.
4.Mount it and apply the changes in the apache image.
5.Create a snapshot based on the apache device.
6.Mount it and use as the root in the new container.
其中base device是所有容器的祖先映象,在docker中可以具體參考setupBaseImage函式。簡單來說base device是一個空的格式化過的裝置,其格式只能為xfs或者ext4,大小預設為10G,在docker server端啟動時可以通過dm.basesize設定。因為base device是所有的容器的共同祖先映象,一旦大小設定,在不重新啟動docker server時docker無法改變其大小(當然也可以自己手動通過device mapper擴充容量,可以參考使用 Device Mapper來改變Docker容器的大小

總結

目前只對docker如何使用devicemapper有了大致框架的瞭解,具體細節還沒完全搞懂,後面再根據docker原始碼詳細分析。

參考文章

相關推薦

docker基礎工作原理

注:以下博文來源於我的獨立部落格網站:http://www.chenbiaolong.com/,由於原網站是用markdown寫的,複製到這邊格式有點問題。 在本篇博文中將主要介紹docker使用device mapper管理映象的原理。這部分內容我也沒完全搞懂,以下內

【SpringMVC架構】SpringMVC入門實例,解析工作原理

rip 業務邏輯層 popu 輸入 implement override article hide -i 上篇博文,我們簡單的介紹了什麽是SpringMVC。這篇博文。我們搭建一個簡單SpringMVC的環境,使用非註解形式實現一個HelloWorld實

瀏覽器工作原理:瀏覽器渲染過程概述

sync 結構 dom end 繪制 fault 異步加載 步驟 targe 參考:https://segmentfault.com/a/1190000012925872#articleHeader4 瀏覽器器內核拿到內容後,渲染大概可以劃分成以下幾個步驟: 解析html

工作中能用到的基礎知識總結

protected 構造函數 blog 繼承鏈 附加 調用 初始化 傳統 -s 簡介 繼承、封裝和多態是面向對象編程的重要特性。要想運用好,就必須熟悉這三種特性,本篇說說我對封裝、繼承和多態相關的知識總結。 知識點 一、訪問修飾符 C#中類及

VA7010中央空調電動通閥工作原理

mil size 有關 至少 安全 型號 utl oat 垂直 VA7010中央空調電動二通閥 VA7010中央空調電動二通閥用於控制冷水或熱水空調系統管道的開啟或關閉,達到控制室溫之目的。廣泛用於中央空調、采暖、水處理、工業加工行業等系統的流體控制。 產品名稱:

VA7010風機盤管電動通閥工作原理

1.5 ali 超過 工業 更換 建築物 flow 箭頭 有限公司 VA7010風機盤管電動二通閥 VA7010風機盤管電動二通閥用於控制冷水或熱水空調系統管道的開啟或關閉,達到控制室溫之目的。廣泛用於中央空調、采暖、水處理、工業加工行業等系統的流體控制。 產品名

VB7200、VB3200比例積分電動通閥工作原理

v5000 參數 tex round nbsp 形式 solid nor body VB7200、VB3200比例積分電動二通閥 VB7200、VB3200比例積分電動二通閥配以電子驅動控制裝置後,能調節蒸汽或冷、熱水的流量,廣泛用於中央空調、采暖、水處理、工業加工行業等

linux設備驅動之platform平臺總線工作原理

linux設備和驅動設備為數據,驅動為加工著1、以led-s3c24xx.c為例來分析platform設備和驅動的註冊過程其中關於led的驅動數據結構為:static struct platform_driver s3c24xx_led_driver = { .probe = s3c24xx_led_pr

JAVA基礎實例

for bin 存在 void hset search demo 個數字 .so 1.做一個飼養員給動物餵食物的樣例體現JAVA中的面向對象思想,接口(抽象類)的用處 package com.softeem.demo; /** [email p

gitlab+jenkins+maven+docker持續集成——maven安裝配置

jenkins gitlab maven 建議安裝3.3.9版本,最新版本貌似有點問題下載地址:#wget http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz解壓# tar -zxvf

django基礎知識筆記

log 技術分享 過濾 搜索 筆記 基礎 技術 http alt 一,深度搜索 二,過濾器fiter django基礎知識筆記(二)

Java基礎—IO小結大綱待更新

16px 文件復制 buffere tro 順序 -a [] 啟用 -c 一、緩沖流的使用   每個字節流都有對應的緩沖流:      BufferedInputStream / BufferedOutputStream   構造器:         方法摘要

JAVA基礎-IO流

直寫 eno 接口 寫入 print lis ted his ride 一、字節流 字節流是通過字節來進行讀寫操作的,他的使用對象相比於字符流來說更加的廣泛。這主要是因為他們讀寫文件的方式而決定的。字符流讀寫文件時是將讀取到的字節通過默認編碼表轉換成字符,在通

spring 內部工作機制

出了 流水線 tor 應用程序 java反射機制 post 技術 process 加載 本章節講Spring容器從加載配置文件到創建出一個完整Bean的作業流程及參與的角色。 Spring 啟動時讀取應用程序提供的Bean配置信息,並在Spring容器中生成一份相應

Python練習題基礎知識練習題

strip() 哪些 字符 單行註釋 alt imp exe 列表 表格形式 1.執行Python腳本的兩種方式 (1).交互方式:啟動python解釋器,執行命令 (2).腳本方式:Python xxx.py 或者 chmod +x && ./xxx.p

QR 編碼原理

bit 選擇 www. nbsp char 混合 示例 mode 匹配 編碼就是把常見的數字、字符等轉換成QR碼的方法。說具體的編碼之前,先說一下QR碼的最大容量問題。 一、最大容量 QR碼的最大容量取決於選擇的版本、糾錯級別和編碼模式(Mode:數字、字符、多字節字符等)

JavaScript基礎入門教程

alert .get OS 全部 isnan rep mut 分別是 只有一個 說明   前一篇博客介紹了js以及一些關於js基本類型的簡單知識,本篇博客將詳細介紹js的基礎類型,捎帶介紹對象類型,更詳細的對象類型的說明將後續再講。 js中類型的說明   js中的類型分

Vue基礎知識總結

定義 mouse 括號 bind turn clientx clas 倒序 花括號 一、解決網速慢的時候用戶看到花括號標記   (1)v-cloak,防止閃爍,通常用於比較大的選擇器上。   給元素添加屬性v-cloak,然後style裏面:[v-cloak]{displa

三層交換機工作原理轉載

存在 嚴重 文檔 轉發原理 mark 動態 發送 大致 添加 路由器的三層轉發主要依靠CPU進行,而三層交換機的三層轉發依靠ASIC芯片完成,這就決定了兩者在轉發性能上的巨大差別。當然,三層交換機並不能完全替代路由器,路由器所具備的豐富的接口類型、良好的流量服務等級控制、

iOS基礎之UIImageView

ont height ger graphic ntc eal eth extc 通道 1 UIImage 任意角度旋轉 #import "UIImage+ImageRotate.h" #import <QuartzCore/QuartzCore.h> #imp