修改CentOs7 上Docker默認文件系統DeviceMapper爲OverlayFS

最近一直在研究Mesos, Marathon跟Docker結合的容器雲平臺,Mesos 框架已經搭好,並且Marathon也可以實現簡單的Docker應用管理了,然後今天嘗試搭建一下mesosphere公司的DC/OS平臺(https://dcos.io/),利用這個平臺可以很容易實現基於容器的雲計算平臺的資源調度,管理,應用分配,負載均衡,動態擴展,故障轉移等。DC/OS底層系統也是基於Docker的,根據官方文檔建議,我們把CentOS7系統上Docker默認的文件系統DeviceMapper改爲OverlayFS。

Docker最開始支持的文件系統是Aufs的,是一種Union File System,原理就是將多個目錄掛在到同一個虛擬目錄下,整個文件系統是一個分層的概念,請看圖:

wKiom1dIIWXAoDIbAAJ5OoZjH4s479.png

然後RedHat系列的系統是不支持Aufs的,當Docker變得越來越流行的時候,RedHat公司發行我也得插一腳進去,然後RedHat公司就對這個Aufs研究了一下,然後說“恩,我們牛逼,我要開發一套新的文件系統用來運行Docker”。後來這套系統就是基於自家的在kernel2.6之後被引進的DeviceMapper技術。主要用到Docker上的就是Snapshot和Thinly-provisioned Snapshot, 這個Snapshot在LVM邏輯卷管理場景下用來創建虛擬快照的,Thin-Provisioning是一項利用虛擬化方法減少物理存儲部署的技術,可最大限度提升存儲空間利用率。當這兩個技術結合起來就是DeviceMapper給RedHat系統實現Docker文件系統的最後方案了。其實這個方案也是基於分層的理論給每一層鏡像創建快照。如圖:

wKioL1dIJdHwqFDHAAD_qU7DrCc141.jpg

然而DeviceMapper的性能並不是那麼的好,DC/OS官網給出的解釋是會出現unknown issue並且不能再Docker裏面運行Docker,DeviceMapper默認情況下創建loop-lvm的方式來構建鏡像和容器的snapshots。但是在生產環境下Docker官方建議採用直連的lvm捲來構建鏡像和容器,然後在啓動Docker Daemon的時候使用如下方式來加載:

{
     "storage-driver": "devicemapper",
     "storage-opts": [         "dm.thinpooldev=/dev/mapper/docker-thinpool",         "dm.use_deferred_removal=true"
     ]
 }

在系統裏運行docker info即可查看到使用的是什麼文件系統:

這是Cent6.5系統的,發現使用的是devicemapper,而且Data File是loop0:


# docker info
Containers: 11
Images: 63
Storage Driver: devicemapper
 Pool Name: docker-252:1-679218-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 2.221 GB
 Data Space Total: 107.4 GB
 Data Space Available: 9.648 GB
 Metadata Space Used: 4.166 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.143 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.95-RHEL6 (2015-09-08)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-573.22.1.el6.x86_64
Operating System: <unknown>
CPUs: 2
Total Memory: 2.819 GiB
Name: bastion.shanker
ID: SJVK:KAXO:ZDAB:XWSM:O45I:EF6U:GE2T:RU3Y:NW6B:K4IQ:DYEN:B4BJ


這臺是Ubuntu12.04的,使用的Aufs系統:


# docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 38
Server Version: 1.10.3
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 101
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Plugins: 
 Volume: local
 Network: host bridge null
Kernel Version: 3.13.0-24-generic
Operating System: Ubuntu 14.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.463 GiB
Name: dbslave.shanker
ID: IDR4:IA4B:3GDE:O6KF:IACI:BQE2:5SJL:25CA:4KV3:OCIG:RGYC:N22G
Username: shanker
Registry: https://index.docker.io/v1/
WARNING: No swap limit support


這臺是CentOS7.2系統,使用的是我更改後的OverlayFS系統:


# docker info
Containers: 3
 Running: 0
 Paused: 0
 Stopped: 3
Images: 5
Server Version: 1.11.1
Storage Driver: overlay
 Backing Filesystem: xfs
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge null host
Kernel Version: 3.10.0-327.18.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 3.703 GiB
Name: ukcent2.novalocal
ID: 7Q46:GGPP:HOLP:5ICX:WXV7:ZC73:S45I:HVC2:UEWX:FL6L:DMSC:TVYH
Docker Root Dir: /var/lib/docker
Debug mode (client): false
Debug mode (server): false
Registry: https://index.docker.io/v1/

然後我們今天要做的是放棄DeviceMapper,使用OverlayFS來作爲默認的存儲系統。首先要升級到CentOS7.2,有一個XFS的Bug在7.2系統被修復了。


1.    將OverlayFS加到module目錄下

echo "overlay" > /etc/modules-load.d/overlay.conf


2.    reboot 系統,執行lsmod看時候看到overlay

# lsmod | grep over
overlay                42451  0


3.    將Docker源添加到系統裏

cat >/etc/yum.repos.d/docker.repo<<E
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
E


4.    配置Docker Daemon用OverlayFS啓動

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo cat >/etc/systemd/system/docker.service.d/override.conf <<E
[Service] 
ExecStart= 
ExecStart=/usr/bin/docker daemon --storage-driver=overlay -H fd:// 
E


5.    安裝Docker,設置開機自啓動

sudo yum -y install docker-engine
sudo sysctemctl start docker
sudo systemctl enable docker


6.    Docker info 看一下,如果看到

Storage Driver: overlay

那就證明更改成功,已經從Devicemapper換到了ovelay了。


附:Docker目前支持的文件系統

wKioL1dIS1Lx3I0CAAA02T6uBaQ601.png


參考:

https://docs.docker.com/engine/userguide/storagedriver/selectadriver/

https://docs.docker.com/engine/userguide/storagedriver/aufs-driver/

https://dcos.io/docs/1.7/administration/installing/custom/system-requirements/#docker

http://coolshell.cn/articles/17200.html

http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章