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  image  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

时间: 2024-08-11 03:22:46

Docker主机升级到4.9版本内核,使用Overlayfs取代Devicemapper的相关文章

centos7 docker升级到最新稳定版本

原文:centos7 docker升级到最新稳定版本 一.前言 docker的版本分为社区版docker-ce和企业版dokcer-ee社,区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器.插件,当然docker的版本更新比较快,截止2018.12最新版本是18.09,如果你的机器上安装了老版本的docker,那么就需要卸载,本文介绍如何完全的卸载老版本以及安装新版本docker. 二.删除老版本 停止docker服务 systemc

linux系统内核从3.2.0-100-generic升级到3.13版本

Docker 官网上要求Docker需要在64位版本的Ubuntu上安装,并且还要保证 Ubuntu 内核的最小版本不低于 3.10. 查看系统相关信息可使用命令uname -a .uname -r .lsb_release -a 查看: $ uname -a Linux zabbix 3.2.0-29-generic #140-Ubuntu SMP Tue Feb 23 02:23:59 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ uname -r Li

可以将TCP BBR算法模块化到低版本内核取代锐速吗

上周的文章引发了比较火爆的争论并带来了争议,我比较满意或者遗憾,尽管如此,如果有人真的能明白在文章的背后我真正想表达的意思,我也就深感欣慰了.还像往常一样,我花周末的时间来总结结束,写点技术散文,同时我希望能在技术上引发同样的争论.        在跟温州皮鞋厂老板聊天时,老板让我从非技术角度重新思考了Google的BBR算法.        很多测试似乎表明BBR的表现非常不错,虽不能保证包打天下,至少相比锐速而言,它是免费的啊,那么疑问也就随之而来了,既然BBR是免费的,且效果不错,那么那些

从Windows 10家庭版升级到更高版本

从Windows 10家庭版升级到更高版本 在Windows 7.Windows 8及Windows 8.1中,Windows的企业版与其他版本(家庭版.专业版)是不同的安装镜像,而且也不能从家庭版或专业版升级到企业版.而在Windows 10中,其基础版本(家庭版.专业版.教育版.专业版),从本质上来说,是用的相同的安装镜像,所以可以从低版本(家庭版.专业版)升级到企业版或教育版. 在7月29号,MSDN订阅用户可以下载到企业版.专业版与家庭版的ISO镜像,此时人们下载不到教育版的镜像(开始能

ubuntu16.04 安装指定版本Node,升级npm到指定版本

一.安装配置Node 1.下载(64位系统) wget https://nodejs.org/download/release/v4.4.7/node-v4.4.7-linux-x64.tar.gz 2.解压配置环境变量 export NODE_HOME=/opt/node-v4.4.7-linux-x64export PATH=$NODE_HOME/bin:$PATH 3.查看node版本 [email protected]:~$ node -vv4.4.7 二.升级NPM到指定版本 npm

CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms1  不可使用 也就是说所有浏览器都是支持document.forms["form1"]这样的写法的. 微软4.0之前是document.form1也能获取, 升级到4.0之后 取值方式为document.forms["form1"] 或者document.forms[

友盟在线参数+自动更新升级SDK实现指定版本强制更新升级

项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级. 友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位. 不过友盟的开发人员也给出了勉强可行的方案: 使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要 相关的内容如下: 1.在线参数配置: http://dev.umeng.com/analytics/android/advanced-integration-guide#3 2.强制更新官方代码: https://github.com/nxzhou

[转]mac下Python升级到指定的版本

以2.7升级到3.3为例1.删除原版本a)删除系统库中的版本sudo rm -R /System/Library/Frameworks/Python.framework/Versions/2.7 b)删除Current版本sudo rm /System/Library/Frameworks/Python.framework/Versions/Currentc)删除/usr/bin目录下的python相关文件find . -name "py*" -print| xargs rm -rf

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器. 有状态是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器. 简单来讲,状态(state)就是数据,如果容器需要处理并存储数据,它就是有状态的,反之则无状态. 对于有状态的容器,如何保存数据呢? 前面在 Docker 存储章节我们学习