centos7+ docker1.12 實踐部署docker及配置direct_lvm

前言

  Docker如今在後端是那麼的火熱..尤爲當筆者瞭解了docker是什麼、能作什麼以後,真的是感受特別的exciting,便火燒眉毛的去實踐部署一下. 可是在實際部署中,由於筆者使用的是阿里雲ecs服務器,centos7系統,由於centos7與ubuntu的差別性,因此,須要本身把後端存儲引擎devicemapper從loop_lvm模式配置爲direct_lvm模式。在這其中又遇到了坑,因此以爲頗有必要記錄下來,作個備忘.html

 

爲何要配置devicemapper

  幾點緣由:

    ubuntu與contos的差別: 在Ubuntu/Debian上有UnionFS可使用,如aufs或者overlay2,而CentOS和RHEL的內核中沒有相關驅動。linux

    Docker的背景: Docker最早就是跑在Ubuntu和Debian上的,使用的就是aufs存儲器.由於docker愈來愈流行,許多公司但願在rhel上使用,可是上游內核中並無包括aufs,因此rhel不能使用aufs. 最終,開發者們開發了一個新的後端存儲引擎devicemapper,基於已有的Device Mapper技術,而且使docker 支持可插拔,如今全世界有不少真實案例在生產環境中使用devicemapper. git

    loop_lvm和direct_lvm區別github

      由於上述的緣由,對於centos/rhel這類沒有相關驅動的系統,通常使用devicemapper驅動利用LVM的一些機制來模擬分層存儲。這樣的作法除了性能比較差以外,穩定性通常也很差,並且配置相對複雜。Docker安裝在CentOS/RHEL 上後,會默認選擇 devicemapper,可是爲了簡化配置,其 devicemapper 是跑在一個稀疏文件模擬的塊設備上,也被稱爲 loop-lvm。這樣的選擇是由於不須要額外配置就能夠運行 Docker,這是自動配置惟一能作到的事情。可是 loop-lvm 的作法很是很差,其穩定性、性能更差,不管是日誌仍是 docker info 中都會看到警告信息。官方文檔有明確的文章講解了如何配置塊設備給 devicemapper 驅動作存儲層的作法,這類作法也被稱爲配置 direct-lvmdocker

      除了前面說到的問題外,devicemapper + loop-lvm 還有一個缺陷,由於它是稀疏文件,因此它會不斷增加。用戶在使用過程當中會注意到 /var/lib/docker/devicemapper/devicemapper/data 不斷增加,並且沒法控制。不少人會但願刪除鏡像或者能夠解決這個問題,結果發現效果並不明顯。緣由就是這個稀疏文件的空間釋放後基本不進行垃圾回收的問題。所以每每會出現即便刪除了文件內容,空間卻沒法回收,隨着使用這個稀疏文件一直在不斷增加。json

  因此:

    對於 CentOS/RHEL 的用戶來講,在沒有辦法使用 UnionFS 的狀況下,必定要配置 direct-lvm 給 devicemapper,不管是爲了性能、穩定性仍是空間利用率。ubuntu

      或許有人注意到了 CentOS 7 中存在被 backports 回來的 overlay 驅動,不過 CentOS 裏的這個驅動達不到生產環境使用的穩定程度,因此不推薦使用。後端

  (參考自:Docker--從入門到實踐)centos

 

安裝及運行docker

  比較easy,本身參考Docker--從入門到實踐,在其中講的有具體步驟,很詳細了。本文的重點是direct_lvm模式的配置,這裏就再也不細說。服務器

爲生產環境配置direct_lvm模式

  生產環境下應該使用direct_lvm,若是以前有鏡像在loop_lvm模式下建立,須要切換,則須要把鏡像作備份(push到hub或者私有registry).因此最好的作法,仍是: 在剛剛給centos服務器安裝docker的時候,直接作好配置.

  1.中止docker daemon

[root@srv00 ~]# systemctl stop docker

  2.建立相關的邏輯卷和thinpool

  檢查磁盤

[root@iZ28uvczcf6Z mapper]# fdisk -l   <==檢查下磁盤

Disk /dev/xvda: 107.4 GB, 107374182400 bytes, 209715200 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
Disk label type: dos
Disk identifier: 0x635e6c7d

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048   209713151   104855552   8e  Linux LVM

Disk /dev/xvdb: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x021dd279

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdb1            2048    41943039    20970496   8e  Linux LVM

  建立pv

[root@srv00 ~]# pvcreate /dev/xvdb1
  Physical volume "/dev/xvdb" successfully created

  注意: pvcreate 指令後面配置的硬盤(此處爲"xvdb1")必須爲獨立的掛載硬盤,而不能是系統盤,不然會報錯,建立失敗.

  (關於掛載新硬盤後,如何對硬盤進行"初始化"、"分區" ,在本文最後會單獨講解。(好比在本代碼中,把Disk "/dev/xvdb"初始化成一塊分區 "/dev/xvdb1",大小等同於磁盤大小(約20G)。)

  建立vg

[root@srv00 ~]# vgcreate vgdocker /dev/xvdb1
  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存儲目錄(是否備份,根據本身需求)

   備份

$ mkdir /var/lib/docker.bk
$ mv /var/lib/docker/* /var/lib/docker.bk

   刪除原存儲目錄

[root@srv00 ~]# rm -rf /var/lib/docker/*

"注意備份重要鏡像等"

  4.修改啓動參數並啓動

   咱們經過systemd的drop-in方式修改,也是官方推薦的

  編輯config文件
[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/dockerd

"ExecStart= 第一行是空.不然啓動會報錯; "  


  實際啓動時,是須要一些參數的,咱們把它配置在daemon.json文件中。文件的位置是/etc/docker/daemon.json 經過vi指令編輯、保存,便可. daemon.json文件內容以下:
{
  "storage-driver": "devicemapper",
   "storage-opts": [
     "dm.thinpooldev=/dev/mapper/vgdocker-thinpool",
     "dm.use_deferred_removal=true",
     "dm.use_deferred_deletion=true"
   ]
}
  從新reload
[root@srv00 ~]# systemctl daemon-reload
[root@srv00 ~]# systemctl start docker
 

"修改daemon參數須要reload"

  5.檢查確認

   能夠看到,direct_lvm模式已經配置成功.

   注: 由於筆者機器已經配置完畢,沒法從新配置前面的步驟,因此前面的一些代碼,均是從一篇他人的博客(點擊訪問)中粘貼過來的,並進行了一些整理。 不過差異只是硬盤名稱不同,流程和輸入指令徹底能夠直接照搬.

[root@iZ28uvczcf6Z mapper]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 1.12.5
Storage Driver: devicemapper
 Pool Name: vgdocker-thinpool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 990.4 MB
 Data Space Total: 20.4 GB
 Data Space Available: 19.41 GB
 Metadata Space Used: 233.5 kB
 Metadata Space Total: 213.9 MB
 Metadata Space Available: 213.7 MB
 Thin Pool Minimum Free Space: 2.039 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.135-RHEL7 (2016-09-28)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-514.2.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 991.2 MiB
Name: iZ28uvczcf6Z
ID: KJ44:XNL6:W5KM:VYDQ:WN4C:FDPF:U52P:27SJ:MCWA:Q6JA:D76Z:JXVC
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
Insecure Registries:
 127.0.0.0/8
[root@iZ28uvczcf6Z mapper]#

  

有哪些坑?

  硬盤掛載

    必定不能是系統盤

  "Docker 1.12 on CentOS no longer uses socket activation"

    由於Docker 1.12的一些新變化,基於網上的一些博客、文章,在配置時,就要有一些改變,不然你可能會遇到錯誤:"no sockets found via socket activation: make sure the service was started by systemd"。這個錯誤的解決方式,感興趣的能夠自行查看此連接: "docker daemon -H fd://" fails with message "No sockets found" under Ubuntu 15.10 #22847

  

    

掛載硬盤的初始化和分區方式

  

$ fdisk /dev/xvdb
    
    Command(m for help): n   n以後,根據本身須要配置,也能夠連着3次enter就能夠完成配置,初始化爲一塊分區,分區大小=硬盤大小
    Command (m for help): t   t是個改類型的指令
    Partition number (1-3,default 3):
    Partition type (type L to list all types): 8e 最好是給配置爲支持LVM的8e類型
    Command ( m for help): w  保存

partprobe  用partprobe可使kernel從新讀取分區信息,從而避免重啓

//如下的指令非必須,僅作一個備錄
pvcreate /dev/sda3
vgextend vg00 /dev/sda3
vgdisplay
lvextend -L +80G /dev/vg00/lv_root
lvdisplay
resize2fs /dev/vg00/lv_root
df -h

 

 

後言

  站在前人的肩膀上

    筆者學習時也是參考了一些博客、文章, 在它們的基礎上,作了整理,並修改掉過期的配置信息. 其中一些筆者本身以爲說的挺清晰的,羅列在下面,方便參考:

    devicemapper 最佳實踐

    Docker官方教程 : 官方教程,不用多說,只是英文閱讀起來費些力氣

     Docker--從入門到實踐 :gitbook書籍,講的很詳細

    

    以及幾篇不錯的文章:

    http://www.linuxtechi.com/thin-provisioned-logical-volumes-centos-7-rhel-7/ 

    Docker一些啓動安裝指令

  一種簡單的方式,配置direct_lvm模式

    本文主要講的是本身手動配置direct_lvm模式的方式,還有一種簡單些的配置方式.如 Docker Device Mapper 使用direct_lvm,文章提到了一個工具: docker-storage-setup,貌似基於這個腳本能夠比較便捷的進行配置,可是感受文中內容,筆者看的不是很明白,因此就沒有繼續了. docker-storage-setup的github網址,筆者也已經找到了:projectatomic/docker-storage-setup 。若是你感興趣,研究有結果以後,歡迎回來在下方分享給筆者^_^。

 

 

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利;

本文出自:博客園--別問是誰

相關文章
相關標籤/搜索