修改CentOs7 上Docker默认文件系统DeviceMapper为OverlayFS

本文主要是介绍修改CentOs7 上Docker默认文件系统DeviceMapper为OverlayFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://shanker.blog.51cto.com/1189689/1783910

最近一直在研究Mesos, Marathon跟Docker结合的容器云平台,Mesos 框架已经搭好,并且Marathon也可以实现简单的Docker应用管理了,然后今天尝试搭建一下mesosphere公司的DC/OS平台(https://dcos.io/),利用这个平台可以很容易实现基于容器的云计算平台的资源调度,管理,应用分配,负载均衡,动态扩展,故障转移等。DC/OS底层系统也是基于Docker的,根据官方文档建议,我们把CentOS7系统上Docker默认的文件系统DeviceMapper改为OverlayFS。

Docker最开始支持的文件系统是Aufs的,是一种Union File System,原理就是将多个目录挂在到同一个虚拟目录下,整个文件系统是一个分层的概念,请看图:

wKiom1dIIWXAoDIbAAJ5OoZjH4s479.png

然后RedHat系列的系统是不支持Aufs的,当Docker变得越来越流行的时候,RedHat公司发行我也得插一脚进去,然后RedHat公司就对这个Aufs研究了一下,然后说“恩,我们牛逼,我要开发一套新的文件系统用来运行Docker”。后来这套系统就是基于自家的在kernel2.6之后被引进的DeviceMapper技术。主要用到Docker上的就是Snapshot和Thinly-provisioned Snapshot, 这个Snapshot在LVM逻辑卷管理场景下用来创建虚拟快照的,Thin-Provisioning是一项利用虚拟化方法减少物理存储部署的技术,可最大限度提升存储空间利用率。当这两个技术结合起来就是DeviceMapper给RedHat系统实现Docker文件系统的最后方案了。其实这个方案也是基于分层的理论给每一层镜像创建快照。如图:

wKioL1dIJdHwqFDHAAD_qU7DrCc141.jpg

然而DeviceMapper的性能并不是那么的好,DC/OS官网给出的解释是会出现unknown issue并且不能再Docker里面运行Docker,DeviceMapper默认情况下创建loop-lvm的方式来构建镜像和容器的snapshots。但是在生产环境下Docker官方建议采用直连的lvm卷来构建镜像和容器,然后在启动Docker Daemon的时候使用如下方式来加载:

1
2
3
4
5
{
      "storage-driver" "devicemapper" ,
      "storage-opts" : [          "dm.thinpooldev=/dev/mapper/docker-thinpool" ,          "dm.use_deferred_removal=true"
      ]
  }

在系统里运行docker info即可查看到使用的是什么文件系统:

这是Cent6.5系统的,发现使用的是devicemapper,而且Data File是loop0:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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系统:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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系统:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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目录下

1
echo  "overlay"  /etc/modules-load .d /overlay .conf


2.    reboot 系统,执行lsmod看时候看到overlay

1
2
# lsmod | grep over
overlay                42451  0


3.    将Docker源添加到系统里

1
2
3
4
5
6
7
8
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启动

1
2
3
4
5
6
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,设置开机自启动

1
2
3
sudo  yum -y  install  docker-engine
sudo  sysctemctl start docker
sudo  systemctl  enable  docker


6.    Docker info 看一下,如果看到

1
Storage Driver: overlay

那就证明更改成功,已经从Devicemapper换到了ovelay了。


附:Docker目前支持的文件系统

wKioL1dIS1Lx3I0CAAA02T6uBaQ601.png


参考:

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

这篇关于修改CentOs7 上Docker默认文件系统DeviceMapper为OverlayFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371236

相关文章

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默