Docker主机升级到4.9版本内核,使用Overlayfs取代Devicemapper
前言:由于之前运行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。 更新如下 Kernel Version: 3.10.0-->4.9.0 Docker Version: 1.9.1-->1.12.2 Storage Driver: DeviceMapper-->Overlayfs 一:升级Kernel版本 (1)安装yum源 $rpm-Uvhhttp://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm Retrievinghttp://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm warning:/var/tmp/rpm-tmp.X3PpyZ:HeaderV4DSA/SHA1Signature,keyIDbaadae52:NOKEY Preparing...#################################[100%] Updating/installing... 1:elrepo-release-7.0-2.el7.elrepo#################################[100%] (2)安装kernel $yum-y--enablerepo=elrepo-kernelinstallkernel-ml-devel-4.9.0kernel-ml-4.9.0 ======================================================================= PackageArchVersionRepositorySize ======================================================================= Installing: kernel-mlx86_644.9.0-1.el7.elrepoelrepo-kernel39M kernel-ml-develx86_644.9.0-1.el7.elrepoelrepo-kernel11M TransactionSummary ======================================================================== Install2Packages Installed: kernel-ml.x86_640:4.9.0-1.el7.elrepo kernel-ml-devel.x86_640:4.9.0-1.el7.elrepo (3)检查当前版本 $uname-r 3.10.0-229.el7.x86_64 (4)检查kernel启动顺序 $awk-F\''$1=="menuentry"{print$2}'/etc/grub2.cfg CentOSLinux(4.9.0-1.el7.elrepo.x86_64)7(Core) CentOSLinux(4.9.0-1.el7.elrepo.x86_64)7(Core)withdebugging CentOSLinux7(Core),withLinux3.10.0-229.el7.x86_64 CentOSLinux7(Core),withLinux0-rescue-f7e36a944a3d4035a61da37d8d4e2313 (5)设置启动kernel 根据上面检查kernel启动顺序,自上而下,从0开始的顺序。如果设置4.9启动那么如下命令 $grub2-set-default0 重启 $reboot (6)检查kernel版本 $uname-r 4.9.0-1.el7.elrepo.x86_64 Kernel升级完毕!!! 二:升级Docker版本 (1)关闭docker进程,卸载老版本 $systemctlstopdocker $rpm-qa|grepdocker 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-edocker-engine-1.9.1-1.el7.centos.x86_64 $rpm-edocker-engine-selinux-1.9.1-1.el7.centos.noarch (2)安装新版本 $wgethttps://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.2-1.el7.centos.noarch.rpm $wgethttps://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.2-1.el7.centos.x86_64.rpm #使用yum命令可以解决依赖问题,如果直接rpm命令安装可能会报错。 $yuminstall-ydocker-engine-selinux-1.12.2-1.el7.centos.noarch.rpm $yuminstall-ydocker-engine-1.12.2-1.el7.centos.x86_64.rpm (3)检查新的docker版本 $docker-v Dockerversion1.12.2,buildbb80604 Docker升级完毕!!! 三:使用overlayfs (1)检查是否有overlayfs模块 $lsmod|grepoverlay overlay491520 没有的话下面命令加载 $modprobeoverlay (2)为overlayfs目录挂一块盘 因为之前没有使用docker默认的loopback方式(因为不是物理块设备,性能很差,大小也有限制),而是单独拿了一块物理盘来做Devicemapper。现在要将那块盘挂载到overlayfs的目录下使用。 注意:因为要改变存储方式,格式化盘。所以原来的数据肯定是没有了。一会docker启动后,原来的容器也是不存在的。 如果直接执行mkfs.xfs /dev/xvdb,肯定会报错device is busy,因为之前的devicemapper映射关系还在,磁盘被占用,是无法被格式化的。 1:查看分区情况 $cat/proc/partitions majorminor#blocksname 202068157440xvda 2021512000xvda1 20225242880xvda2 20232097152xvda3 20241xvda4 202560303360xvda5 20216104857600xvdb 20217104856576xvdb1 2530106496dm-0 2531103698432dm-1 2532103698432dm-2 2:查看device mapper的状态 $dmsetupstatus docker--vg-docker--pool:01159217152thin-pool docker--vg-docker--pool_tdata:01159217152linear docker--vg-docker--pool_tmeta:01179648linear 3:查看device mapper设备依赖关系 $dmsetupdeps docker--vg-docker--pool:2dependencies:(253,1)(253,0) docker--vg-docker--pool_tdata:1dependencies:(202,17) docker--vg-docker--pool_tmeta:1dependencies:(202,17) 输出信息中(202, 17),对应了分区上的 xvdb这个设备,说明依赖的是xvdb 4:删除掉device mapper映射出来的设备 $dmsetupremovedocker--vg-docker--pool $dmsetupremovedocker--vg-docker--pool_tdata $dmsetupremovedocker--vg-docker--pool_tmeta $dmsetupstatus Nodevicesfound 5:格式化磁盘 $mkfs.xfs-f/dev/xvdb 6:创建docker的数据目录,挂载磁盘 $mkdir-p/data/docker $mount/dev/xvdb/data/docker $df-h FilesystemSizeUsedAvailUse%Mountedondevtmpfs 16G016G0%/dev/dev/xvda5 58G2.3G56G4%//dev/xvda2 5.0G40M5.0G1%/home/dev/xvda1 497M161M337M33%/boot/dev/xvdb 100G33M100G1%/data/docker (3)修改docker启动方式为overlayfs vim/usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerdaemon--storage-driver=overlay--graph="/data/docker"--insecure-registryregistry.cntv.net (4)reload配置并启动docker $systemctldaemon-reload $systemctlstartdocker $dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES $ls/data/dockercontainersp_w_picpathnetworkoverlayswarmtmptrustvolumes overlayfs配置完毕!!! 遇到的问题: 在修改docker启动配置时docker.service原来的默认配置中是这样的 ExecStart=/usr/bin/dockerd-Hfd:// 当我改成 ExecStart=/usr/bin/dockerd--storage-driver=overlay--graph="/data/docker"--insecure-registryregistry.cntv.net-Hfd:// 启动的时候,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-registryregistry.cntv.net 地址:https://github.com/docker/docker/releases/tag/v1.12.5