前言:因爲以前運行Docker系統了幾臺機器好久一直沒有更新,docker版本爲1.9.1。使用的docker存儲驅動爲Devicemapper。本次須要更新Docker的管理平臺,索性也就將底層的docker版本也升級到新版,並更改Devicemapper爲overlayfs。因爲操做系統是CentOS Linux release 7.1.1503 (Core),內核版本3.10.0-229.el7.x86_64,該內核版本已經支持overlayfs。可是因爲新的內核4.9已經發布,在4.9的內核版本中,對硬件和文件系統方面的改進也不少,涉及到 Btrfs、XFS、F2FS、OverlayFS 的 UBIFS 支持、FUSE 支持 POSIX ACL、OverlayFS SELinux 等方面。因此本次也將內核版本升級到4.9。linux
更新以下git
Kernel Version: 3.10.0-->4.9.0github
Docker Version: 1.9.1-->1.12.2docker
Storage Driver: DeviceMapper-->Overlayfsvim
一:升級Kernel版本centos
(1)安裝yum源bash
$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm Retrieving http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm warning: /var/tmp/rpm-tmp.X3PpyZ: Header V4 DSA/SHA1 Signature, key ID baadae52: NOKEY Preparing... ################################# [100%] Updating / installing... 1:elrepo-release-7.0-2.el7.elrepo ################################# [100%]
(2)安裝kernelapp
$ yum -y --enablerepo=elrepo-kernel install kernel-ml-devel-4.9.0 kernel-ml-4.9.0 ======================================================================= Package Arch Version Repository Size ======================================================================= Installing: kernel-ml x86_64 4.9.0-1.el7.elrepo elrepo-kernel 39 M kernel-ml-devel x86_64 4.9.0-1.el7.elrepo elrepo-kernel 11 M Transaction Summary ======================================================================== Install 2 Packages Installed: kernel-ml.x86_64 0:4.9.0-1.el7.elrepo kernel-ml-devel.x86_64 0:4.9.0-1.el7.elrepo
(3)檢查當前版本socket
$ uname -r 3.10.0-229.el7.x86_64
(4)檢查kernel啓動順序ide
$ awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (4.9.0-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (4.9.0-1.el7.elrepo.x86_64) 7 (Core) with debugging CentOS Linux 7 (Core), with Linux 3.10.0-229.el7.x86_64 CentOS Linux 7 (Core), with Linux 0-rescue-f7e36a944a3d4035a61da37d8d4e2313
(5)設置啓動kernel
根據上面檢查kernel啓動順序,自上而下,從0開始的順序。若是設置4.9啓動那麼以下命令
$grub2-set-default 0
重啓
$reboot
(6)檢查kernel版本
$ uname -r 4.9.0-1.el7.elrepo.x86_64
Kernel升級完畢!!!
二:升級Docker版本
(1)關閉docker進程,卸載老版本
$ systemctl stop docker $ rpm -qa|grep docker docker-engine-1.9.1-1.el7.centos.x86_64 docker-storage-setup-0.5-3.el7.centos.noarch docker-engine-selinux-1.9.1-1.el7.centos.noarch $ rpm -e docker-engine-1.9.1-1.el7.centos.x86_64 $ rpm -e docker-engine-selinux-1.9.1-1.el7.centos.noarch
(2)安裝新版本
$ wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.2-1.el7.centos.noarch.rpm $ wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.2-1.el7.centos.x86_64.rpm # 使用yum命令能夠解決依賴問題,若是直接rpm命令安裝可能會報錯。 $ yum install -y docker-engine-selinux-1.12.2-1.el7.centos.noarch.rpm $ yum install -y docker-engine-1.12.2-1.el7.centos.x86_64.rpm
(3)檢查新的docker版本
$ docker -v Docker version 1.12.2, build bb80604
Docker升級完畢!!!
三:使用overlayfs
(1)檢查是否有overlayfs模塊
$ lsmod | grep overlay overlay 49152 0
沒有的話下面命令加載
$ modprobe overlay
(2)爲overlayfs目錄掛一塊盤
由於以前沒有使用docker默認的loopback方式(由於不是物理塊設備,性能不好,大小也有限制),而是單獨拿了一塊物理盤來作Devicemapper。如今要將那塊盤掛載到overlayfs的目錄下使用。
注意:由於要改變存儲方式,格式化盤。因此原來的數據確定是沒有了。一會docker啓動後,原來的容器也是不存在的。
若是直接執行mkfs.xfs /dev/xvdb,確定會報錯device is busy,由於以前的devicemapper映射關係還在,磁盤被佔用,是沒法被格式化的。
1:查看分區狀況
$ cat /proc/partitions major minor #blocks name 202 0 68157440 xvda 202 1 512000 xvda1 202 2 5242880 xvda2 202 3 2097152 xvda3 202 4 1 xvda4 202 5 60303360 xvda5 202 16 104857600 xvdb 202 17 104856576 xvdb1 253 0 106496 dm-0 253 1 103698432 dm-1 253 2 103698432 dm-2
2:查看device mapper的狀態
$ dmsetup status docker--vg-docker--pool: 0 1159217152 thin-pool docker--vg-docker--pool_tdata: 0 1159217152 linear docker--vg-docker--pool_tmeta: 0 1179648 linear
3:查看device mapper設備依賴關係
$dmsetup deps docker--vg-docker--pool: 2 dependencies : (253, 1) (253, 0) docker--vg-docker--pool_tdata: 1 dependencies : (202, 17) docker--vg-docker--pool_tmeta: 1 dependencies : (202, 17)
輸出信息中(202, 17),對應了分區上的 xvdb這個設備,說明依賴的是xvdb
4:刪除掉device mapper映射出來的設備
$ dmsetup remove docker--vg-docker--pool $ dmsetup remove docker--vg-docker--pool_tdata $ dmsetup remove docker--vg-docker--pool_tmeta $ dmsetup status No devices found
5:格式化磁盤
$ mkfs.xfs -f /dev/xvdb
6:建立docker的數據目錄,掛載磁盤
$ mkdir -p /data/docker $ mount /dev/xvdb /data/docker $ df -h Filesystem Size Used Avail Use% Mounted ondevtmpfs 16G 0 16G 0% /dev/dev/xvda5 58G 2.3G 56G 4% //dev/xvda2 5.0G 40M 5.0G 1% /home/dev/xvda1 497M 161M 337M 33% /boot/dev/xvdb 100G 33M 100G 1% /data/docker
(3)修改docker啓動方式爲overlayfs
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/docker daemon --storage-driver=overlay --graph="/data/docker" --insecure-registry registry.cntv.net
(4)reload配置並啓動docker
$ systemctl daemon-reload $ systemctl start docker $ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ ls /data/dockercontainers p_w_picpath network overlay swarm tmp trust volumes
overlayfs配置完畢!!!
遇到的問題:
在修改docker啓動配置時docker.service原來的默認配置中是這樣的
ExecStart=/usr/bin/dockerd -H fd://
當我改爲
ExecStart=/usr/bin/dockerd --storage-driver=overlay --graph="/data/docker" --insecure-registry registry.cntv.net -H fd://
啓動的時候,docker報錯了。
報錯內容:no sockets found via socket activation: make sure the service was started by systemd.
在github查到了這個更新。1.12版本以後這個配置發生了改變。解決辦法中將-H fd://從ExecStart指令中刪除,改爲以下方式解決。
ExecStart=/usr/bin/dockerd --storage-driver=overlay --graph="/data/docker" --insecure-registry registry.cntv.net
地址:https://github.com/docker/docker/releases/tag/v1.12.5