久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么配置docker使用devicemapper

160次閱讀
沒有評論

共計 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 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計5690字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 科技| 杂多县| 兴山县| 沐川县| 乐业县| 滨海县| 娄底市| 邮箱| 大宁县| 清徐县| 视频| 崇文区| 甘肃省| 宝兴县| 佛山市| 长沙市| 龙井市| 拜泉县| 南皮县| 陆川县| 安义县| 伽师县| 江永县| 台北市| 广水市| 景泰县| 金坛市| 临武县| 汤原县| 宜章县| 濮阳市| 德江县| 汪清县| 漳浦县| 昌宁县| 申扎县| 临洮县| 伊通| 射洪县| 九寨沟县| 营口市|