最近一直在研究Mesos, Marathon跟Docker結合的容器雲平臺,Mesos 框架已經搭好,並且Marathon也可以實現簡單的Docker應用管理了,然後今天嘗試搭建一下mesosphere公司的DC/OS平臺(https://dcos.io/),利用這個平臺可以很容易實現基於容器的雲計算平臺的資源調度,管理,應用分配,負載均衡,動態擴展,故障轉移等。DC/OS底層系統也是基於Docker的,根據官方文檔建議,我們把CentOS7系統上Docker默認的文件系統DeviceMapper改爲OverlayFS。
Docker最開始支持的文件系統是Aufs的,是一種Union File System,原理就是將多個目錄掛在到同一個虛擬目錄下,整個文件系統是一個分層的概念,請看圖:
然後RedHat系列的系統是不支持Aufs的,當Docker變得越來越流行的時候,RedHat公司發行我也得插一腳進去,然後RedHat公司就對這個Aufs研究了一下,然後說“恩,我們牛逼,我要開發一套新的文件系統用來運行Docker”。後來這套系統就是基於自家的在kernel2.6之後被引進的DeviceMapper技術。主要用到Docker上的就是Snapshot和Thinly-provisioned Snapshot, 這個Snapshot在LVM邏輯卷管理場景下用來創建虛擬快照的,Thin-Provisioning是一項利用虛擬化方法減少物理存儲部署的技術,可最大限度提升存儲空間利用率。當這兩個技術結合起來就是DeviceMapper給RedHat系統實現Docker文件系統的最後方案了。其實這個方案也是基於分層的理論給每一層鏡像創建快照。如圖:
然而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目前支持的文件系統
參考:
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