共計 5690 個字符,預計需要花費 15 分鐘才能閱讀完成。
本篇內容介紹了“怎么配置 docker 使用 devicemapper”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
devicemapper 最佳實踐
docker 最先是跑在 ubuntu 和 debian 上的, 使用 aufs 存儲器. 由于 docker 越來越流行, 許多公司希望在 RHEL 上使用, 但是上游內核中沒有包括 aufs, 所以 rhel 不能使用 aufs. 最終開發者們開發了一個新的后端存儲引擎 devicemapper, 基于已有的 Device Mapper 技術, 并且使 docker 支持可插拔, 現在全世界有很多真實案例在生產環境使用 devicemapper.
鏡像層與共享
devicemapper 存儲每個鏡像和容器在自己的虛擬設備上, 也就是說這些設備是按需分配(copy-on-write snapshot devices),Device Mapper 技術是工作在 block 級別的而不是文件級別的.
devicemapper 創建鏡像的方式是:
devicemapper 基于塊設備或 loop mounted sparse files 來創建一個虛擬池.
然后在上面創建一個有文件系統的基礎設備(base device).
每個鏡像層就是基于這個基礎設備的 COW 快照(snapshot), 也就是說這些快照初始化時是空的, 只有數據寫入時才會占用池中的空間.
devicemapper 的讀操作
容器中的應用請求塊 0x44f, 因為容器層也是個虛擬的快照, 不存數據, 只有指針. 通過指針找到存放數據的鏡像層.
根據指針找到 a005e 層的 0xf33.
devicemapper copy 其中的數據到容器內存中.
存儲驅動器返回數據給請求的應用.
devicemapper 的寫操作
devicemapper 寫操作是通過 allocate-on-demand(按需分配)的方式. 更新數據是通過 COW 方式. 因為 devicemapper 是一種基于塊的技術, 所以就算修改一個大文件, 也不會 copy 整個文件過來. 只會 copy 對應要修改的塊.
寫新數據
寫 56k 的數據到容器中:
應用請求寫 56k 的數據到容器
按需分配一個新的 64k 大小的塊在容器層.(超過 64k, 則分配多個)
數據寫入新分配的塊中
修改數據
應用請求修改容器中數據
cow 操作定位到要更新的塊
分配新的塊在容器層并將數據 copy 過來
對數據進行修改
配置 docker 使用 devicemapper
基于 rhel 的分支默認使用的 devicemapper, 并且默認配置成 loop-lvm 模式運行. 這種模式使用文件來作為虛擬池 (thin pool) 構建鏡像和容器的層. 但是生產環境不因該使用這種模式.
通過 docker info 命令來檢查
[root@srv00 ~]# docker info
WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.107-RHEL7 (2015-12-01)
...
Data loop file,Metadata loop file 指示了 docker 運行在 loop-lvm 模式下, 并且還有個 WARNING.
為生產環境配置 direct-lvm 模式
生產環境下因該使用 direct-lvm, 如果之前有鏡像在 loop-lvm 模式下創建, 需要切換, 則因該將鏡像做備份.(push 到 hub 或私有 registry)
我給虛擬機分配個 30G 磁盤
1. 停止 docker daemon
[root@srv00 ~]# systemctl stop docker
2. 創建相關的邏輯卷和 thinpool
創建 pv
[root@srv00 ~]# fdisk -l == 檢查下磁盤
Disk /dev/xvdb: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@srv00 ~]# pvcreate /dev/xvdb
Physical volume /dev/xvdb successfully created
創建 vg
[root@srv00 ~]# vgcreate vgdocker /dev/xvdb
Volume group vgdocker successfully created
創建一個 thin pool, 名字叫 thinpool, 先來創建邏輯卷
[root@srv00 ~]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker
Logical volume thinpool created.
[root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker
Logical volume thinpoolmeta created.
[root@srv00 ~]# lvscan
ACTIVE /dev/centos/swap [4.00 GiB] inherit
ACTIVE /dev/centos/root [35.47 GiB] inherit
ACTIVE /dev/vgdocker/thinpool [28.50 GiB] inherit
ACTIVE /dev/vgdocker/thinpoolmeta [304.00 MiB] inherit
剩余的 4% 留給它們自動擴展
轉換成 thin pool
[root@srv00 ~]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta
WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to pool s data and metadata volumes.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Converted vgdocker/thinpool to thin pool.
設置 thinpool 的自動擴展參數, 并應用此 profile
[root@srv00 ~]# vi /etc/lvm/profile/docker-thinpool.profile
activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
[root@srv00 ~]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool
Logical volume thinpool changed.
當空間大于 80% 時進行擴展. 擴展的大小是空閑空間的 20%
查看 thinpool 是否是已監視狀態
[root@srv00 ~]# lvs -o+seg_monitor
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
root centos -wi-ao---- 35.47g
swap centos -wi-ao---- 4.00g
thinpool vgdocker twi-a-t--- 28.50g 0.00 0.02 monitored
3. 刪除 docker 存儲目錄
[root@srv00 ~]# rm -rf /var/lib/docker/*
注意備份重要鏡像等
4. 修改啟動參數并啟動
我們通過 systemd 的 drop-in 方式修改, 也是官方推薦的
[root@srv00 ~]# mkdir /etc/systemd/system/docker.service.d
[root@srv00 ~]# vi /etc/systemd/system/docker.service.d/daemon.conf
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/vgdocker-thinpool --storage-opt dm.use_deferred_removal=true
[root@srv00 ~]# systemctl daemon-reload
[root@srv00 ~]# systemctl start docker
ExecStart= 第一行是空. 否則啟動會報錯, 并且修改 daemon 參數需要 reload
5. 檢查確認
[root@srv00 docker]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.11.1
Storage Driver: devicemapper
Pool Name: vgdocker-thinpool
Pool Blocksize: 524.3 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
...
[root@srv00 docker]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 35.47g
swap centos -wi-ao---- 4.00g
[lvol0_pmspare] vgdocker ewi------- 304.00m
thinpool vgdocker twi-a-t--- 28.50g 0.07 0.02
[thinpool_tdata] vgdocker Twi-ao---- 28.50g
[thinpool_tmeta] vgdocker ewi-ao---- 304.00m
[root@srv00 docker]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 114.4M 0 rom
xvda 202:0 0 40G 0 disk
├─xvda1 202:1 0 500M 0 part /boot
└─xvda2 202:2 0 39.5G 0 part
├─centos-root 253:0 0 35.5G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
xvdb 202:16 0 30G 0 disk
├─vgdocker-thinpool_tmeta 253:2 0 304M 0 lvm
│ └─vgdocker-thinpool 253:5 0 28.5G 0 lvm
└─vgdocker-thinpool_tdata 253:3 0 28.5G 0 lvm
└─vgdocker-thinpool 253:5 0 28.5G 0 lvm
然后就可以正常的 docker run 了
devicemapper 的性能影響
Allocate-on-demand 性能影響
之前講說, 如果容器中要寫數據, 則會在容器層分配新的塊, 每個快 64k, 如果要寫的數據大于 64k, 則會分配多個塊. 如果容器中有許多小文件的寫操作.. 則會影響性能.
Copy-on-write 性能影響
容器中第一次更新一個已有數據時, 就會進行 cow 操作, 如果更新大文件的某一部分, 則只會 copy 相應的數據快, 這個性能提升很大. 如果更新大量小文件(=64k),devicemapper 的性能就比 AUFS 差.
其他
loop-lvm 模式的性能很差, 不推薦使用在生產環境. 生產環境使用 direct-lvm 模式, 它是直接操作 raw 設備.
使用 ssd 的話提升更明顯
devicemapper 內存使用不是最有效的. 運行 n 個容器會加載 n 次相同文件到內存. 所以不是運行 pass 平臺和高密度容器最好的選擇.
當然容器中寫操作多的話要盡量使用 data volume, 它是繞過 storage driver, 性能有保證
“怎么配置 docker 使用 devicemapper”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!