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 -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)安裝kernel

$ 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)檢查當前版本

$ uname -r
3.10.0-229.el7.x86_64


(4)檢查kernel啓動順序

$ 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.


wKiom1hd__CTpon5AABP1mUbVds685.png


在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


wKiom1heB7KC6yADAADsyjqBEO8809.png

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