標籤:docker btrfs aufs device mapper
docker 配置Btrfs和Device mapper儲存驅動設定
運行環境:
docker -v
Docker version 1.12.1, build 23cf638
uname -a
Linux ceph-6-29 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\
一:docker 首次安裝完成,預設存放裝置為loop 迴環裝置,會建立一個100G的用於儲存資料,和一個2G的用於儲存中繼資料的疏鬆檔案,然後分別附加到迴環塊裝置/dev/loop0和/dev/loop1。然後基於迴環塊裝置建立thin pool。
1.1:查看迴環塊裝置資訊
[[email protected] ~]# losetup -a
/dev/loop0: [2245]:1937889 (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: [2245]:1937890 (/var/lib/docker/devicemapper/devicemapper/metadata)
1.2:查看迴環裝置大小
[[email protected] ~]# docker info
.。。。。。。。。。。。。。。。
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:197-537316283-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB《《=============data 預設塊大小
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 11.8 MB
Data Space Total: 107.4 GB
Data Space Available: 107.4 GB
Metadata Space Used: 581.6 kB
Metadata Space Total: 2.147 GB《《=============metadata 預設塊大小
Metadata Space Available: 2.147 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
從上的資訊可以看出,Base Device 只有10G 空間,我們測試期間發現,反覆發布鏡像,很容易把空間沾滿,如果你想增大空間執行操作如下:
1.3:關閉docker
systemctl stop docker
1.4:刪除docker目錄檔案,不刪除也可以,不過有時候可能會導致docker 服務服務啟動。
rm -rf /var/lib/docker/*
1.5:調整迴環裝置檔案和鏡像的大小,例如,我們將迴環境裝置檔案大小設定為100G,中繼資料檔案大小為4G,基礎鏡像大小為20G:
另外,–storage-opt還有其它一些參數,比較dm.fs指定檔案系統(預設為ext4)等。
vim /usr/lib/systemd/system/docker.service
添加啟動項內容如下:
ExecStart=/usr/bin/dockerd --storage-opt dm.basesize=100G dm.loopdatasize=50G --storage-opt dm.loopmetadatasize=4G
1.6:啟動docker服務
systemctl daemon-reload
systemctl start docker
1.7:在粗驗證docker配置資訊:
docker info
.。。。。。。。。。。。。。。
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:197-537315670-pool
Pool Blocksize: 65.54 kB
Base Device Size: 107.4 《《=============Base Device 預設塊大小
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 53.74 MB《《=============data 預設塊大小
Data Space Total: 53.69 GB
Data Space Available: 53.63 GB
Metadata Space Used: 532.5 kB
Metadata Space Total: 4.295 《《=============Metadata 預設塊大小
Metadata Space Available: 4.294 GB
Thin Pool Minimum Free Space: 5.369 GB
1.8: 以上是直接修改配置調整儲存空間大小,驗證配置修改生效;
二:通過dd 建立儲存空間檔案方式調整儲存空間;
2.1:線上驗證docker配置資訊:
docker info
.。。。。。。。。。。。。。。
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:197-537315670-pool
Pool Blocksize: 65.54 kB
Base Device Size: 107.4 《《=============Base Device 預設塊大小
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 53.74 MB《《=============data 預設塊大小
Data Space Total: 53.69 GB
Data Space Available: 53.63 GB
Metadata Space Used: 532.5 kB
Metadata Space Total: 4.295 《《=============Metadata 預設塊大小
Metadata Space Available: 4.294 GB
Thin Pool Minimum Free Space: 5.369 GB
1.3:關閉docker
systemctl stop docker
1.4:刪除docker目錄檔案,不刪除也可以,不過有時候可能會導致docker 服務服務啟動。
rm -rf /var/lib/docker/*
1.5: 建立儲存空間檔案
建立目錄
mkdir -p /var/lib/docker/devicemapper/devicemapper
cd /var/lib/docker/devicemapper/devicemapper
Create your pool:
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=80
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=4k count=0 seek=1024000
1.6:驗證儲存空間大小
[[email protected] devicemapper]# ls -lsh
total 0
0 -rw-r--r-- 1 root root 80G Sep 12 21:35 data
0 -rw-r--r-- 1 root root 4.0G Sep 12 21:36 metadata
1.7: 查看啟動服務組態檔:
vim /usr/lib/systemd/system/docker.service
啟動項內容爆出預設即可:
ExecStart=/usr/bin/dockerd
1.8:啟動docker服務
systemctl daemon-reload
systemctl start docker
1.9:驗證配置:
[[email protected] devicemapper]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:197-537315670-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 《《=============Base Device 預設塊大小
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 11.8 MB《《=============data 預設塊大小
Data Space Total: 107.4 GB
Data Space Available: 107.4 GB
Metadata Space Used: 704.5 kB
Metadata Space Total: 4.194 《《============= Metadata 預設塊大小
Metadata Space Available: 4.194 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
2.0: 驗證查看info資訊,空間資訊沒有發生變化,這種配置方式,這種貌似不太靠譜,上面是在國外查詢資料時看到有人這麼做,僅供參考:
以上兩種方式的示範,基本對docker的儲存有所瞭解,但是以上方式都不推薦在生產環境使用,使用迴環裝置,效能差不說,也不太穩定,總是出一些奇葩的問題,我們深受其害,所有尋找資料總計梳理下面兩種配置docker 使用儲存空間的方式,現已經在生產系統測實驗證可靠性。
以下內容可能牽扯很多儲存相關的知識,請查詢相關資料,本文不做闡述,目前,Docker支援AUFS、Btrfs、Device mapper、OverlayFS、ZFS五種儲存驅動。就如Docker官網上說的,沒有單一的驅動適合所有的應用情境,要根據不同的情境選擇合適的儲存驅動,才能有效提高Docker的效能。
AUFS :最早的docker雖支援的儲存啟動,以補丁方式加入核心,問題比較多!AUFS能透明覆蓋一或多個現有檔案系統的層狀檔案系統,把多層合并成檔案系統的單層表示。
devicemapper:寫時複製(CoW)。CoW就是copy-on-write,表示只在需要寫時才去複製,這個是針對已有檔案的修改情境。
Btrfs:btrfs驅動程式,docker build 非常快,-但是devicemapper 裝置之間不共用可執行記憶體。
OverlayFS:是一個非常快的工會的檔案系統。它現在合并在主Linux核心作為3.18.0。
具體參考資訊如下:
https://docs.docker.com/engine/reference/commandline/dockerd/
http://dockone.io/article/1513
下面主要介紹如何快速簡單的配置使用btrfs 和 devicemapper 驅動;
三:使用裸裝置直接儲存docker 資料,即將真實磁碟連結到 docker data 儲存資料。
3.1:配置要求,
a:系統需要有一塊未使用的磁碟或分區;
b:掌握分區常用命令
3.2:查看系統磁碟分割資訊:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 558.4G 0 disk
。。。。。。。。。。。。。。。。。。
├─sda4 8:4 0 1K 0 part
├─sda5 8:5 0 355.9G 0 part /dbdata
├─sda6 8:6 0 80G 0 part 《=======本次示範使用分區
。。。。。。。。。。。。
3.3:修改前查看info資訊:
[[email protected] ~]# docker info
。。。。。。。。。。。。。。。。。。。。。
Images: 5
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:2-269225707-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 1.944 GB
Data Space Total: 107.4 GB
Data Space Available: 98.49 GB
Metadata Space Used: 2.834 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.145 GB
Thin Pool Minimum Free Space: 10.74 GB
3.4:關閉docker
systemctl stop docker
3.5:刪除docker目錄檔案,不刪除也可以,不過有時候可能會導致docker 服務服務啟動。
rm -rf /var/lib/docker/*
3.6:系統磁碟分割;
我這邊要做的操作是使用 fdisk 刪除 /dev/sda6 分區,將剩餘空間重現劃分為兩個分區,資訊如下:
dm.datadev=/dev/sda6 ==>70G
dm.metadatadev=/dev/sda7 ==>10G
3.7:添加啟動項內容如下:
vim /usr/lib/systemd/system/docker.service
修改啟動項如下:
ExecStart=/usr/bin/dockerd --storage-opt dm.datadev=/dev/sda6 --storage-opt dm.metadatadev=/dev/sda7 --storage-opt dm.blocksize=512K --storage-opt dm.basesize=80G
3.8:啟動docker服務
systemctl daemon-reload
systemctl start docker
3.9:驗證修改效果:
[[email protected] docker]# docker info
。。。。。。。。。。。。。。。。
Images: 0
Server Version: 1.12.1
Storage Driver: devicemapper
Pool Name: docker-8:2-403544979-pool
Pool Blocksize: 524.3 kB
Base Device Size: 85.9 GB《《=============儲存位置已變更
Backing Filesystem: xfs
Data file: /dev/sda6《《=============儲存位置已變更
Metadata file: /dev/sda7《《=============儲存位置已變更
Data Space Used: 79.17 MB
Data Space Total: 85.9 GB
Data Space Available: 85.82 GB
Metadata Space Used: 737.3 kB
Metadata Space Total: 10.74 GB
Metadata Space Available: 10.74 GB
Thin Pool Minimum Free Space: 8.59 GB
通過以上配置,可以實現docker將資料存放區到裸裝置,原理上速度應該不錯,這種方式的缺點是,磁碟空間的使用量不好監控。有些人使用lvm 處理之後再這麼配置,然後添加配置
dockerd --storage-opt dm.min_free_space=10% 來保障空間使用方式,我測試了一下直接使用裸裝置,這個參數添加後docker 無法啟動。我覺得中間加一層lvm 的配置變得有些麻煩,就沒這麼做。
四:配置使用btrfs 檔案系統;
這種方式配置比較簡單,檔案系統掛載系統後再將docker 的資料寫入,系統後掛載點,系統監控可以監控磁碟空間,可以實現警示。
4.1:配置要求,
a:系統需要有一塊未使用的磁碟或分區;
b:掌握分區常用命令
4.2:修改前docker info 資訊如下:
Pool Name: docker-8:197-270105280-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 768.3 MB
Data Space Total: 107.4 GB
Data Space Available: 106.6 GB
Metadata Space Used: 1.79 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.146 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
4.3:查看系統磁碟分割資訊:
sdm 8:192 0 278.9G 0 disk
├.......................
├─sdm2 8:194 0 80G 0 part 《=======本次示範使用分區
......................
[[email protected] ~]#
4.4:格式檔案系統
安裝基礎包
yum install btrfs-*
將 /dev/sdm2 格式化為btrfs 檔案系統:
mkfs.btrfs -f /dev/sdm2
4.5:查看分區UUID ,為掛載做準備:
blkid
/dev/sdm1: UUID="4f00e697-43a9-4088-9f47-363238ddd36c" TYPE="xfs"
/dev/sdm2: UUID="15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a" UUID_SUB="66494e3f-4708-4376-a416-c769bfa96651" TYPE="btrfs"
4.5:關閉docker
systemctl stop docker
4.6:刪除docker目錄檔案,不刪除也可以,不過有時候可能會導致docker 服務服務啟動。
rm -rf /var/lib/docker/*
4.7:添加系統開機自動掛載:
vim /etc/fstab
UUID=15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a /var/lib/docker btrfs defaults 0 0
儲存退出後:
執行 mount -a
查看系統磁碟分割掛載情況:
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
..............................
/dev/sdm2 80G 2.4G 77G 3% /var/lib/docker
4.8:添加啟動項內容如下:
Btrfs 配置選項 :btrfs.min_space ,剩餘空間小於這個值,系統會給出警示資訊;
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -s btrfs -g /var/lib/docker --storage-opt btrfs.min_space=10G
4.9:啟動docker服務
systemctl daemon-reload
systemctl start docker
4.10: 配置資訊驗證:
[[email protected] ~]# docker info
................
Server Version: 1.12.1
Storage Driver: Btrfs <================儲存資訊
Build Version: Btrfs v3.19.1
Library Version: 101
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host bridge null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
以上3-4 步驟介紹了配置Btrfs和Device mapper儲存驅動設定,不足之處各位看官指正。
參考文檔:
Docker五種儲存驅動原理及應用情境和效能測試對比:http://dockone.io/article/1513
Docker容器的持久儲存模式:http://dockone.io/article/1283
http://vitan.github.io/docker/2016/01/22/aufs-vs-devicemapper.html
http://www.cnblogs.com/itcomputer/p/5667917.html
https://github.com/snitm/docker/tree/master/daemon/graphdriver/devmapper
本文出自 “康建華” 部落格,轉載請與作者聯絡!
docker 配置Btrfs和Device mapper儲存驅動設定