前言
Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么、能做什么之后,真的是感觉特别的exciting,便迫不及待的去实践部署一下. 但是在实际部署中,因为笔者使用的是阿里云ecs服务器,centos7系统,因为centos7与ubuntu的差异性,所以,需要自己把后端存储引擎devicemapper从loop_lvm模式配置为direct_lvm模式。在这其中又遇到了坑,所以觉得很有必要记录下来,做个备忘.
为什么要配置devicemapper
几点原因:
ubuntu与contos的差异: 在Ubuntu/Debian上有UnionFS可以使用,如aufs或者overlay2,而CentOS和RHEL的内核中没有相关驱动。
Docker的背景: Docker最先就是跑在Ubuntu和Debian上的,使用的就是aufs存储器.因为docker越来越流行,许多公司希望在rhel上使用,但是上游内核中并没有包括aufs,所以rhel不能使用aufs. 最终,开发者们开发了一个新的后端存储引擎devicemapper,基于已有的Device Mapper技术,并且使docker 支持可插拔,现在全世界有很多真实案例在生产环境中使用devicemapper.
loop_lvm和direct_lvm区别:
因为上述的原因,对于centos/rhel这类没有相关驱动的系统,一般使用devicemapper驱动利用LVM的一些机制来模拟分层存储。这样的做法除了性能比较差之外,稳定性一般也不好,而且配置相对复杂。Docker安装在CentOS/RHEL 上后,会默认选择 devicemapper
,但是为了简化配置,其 devicemapper
是跑在一个稀疏文件模拟的块设备上,也被称为 loop-lvm
。这样的选择是因为不需要额外配置就可以运行 Docker,这是自动配置唯一能做到的事情。但是 loop-lvm
的做法非常不好,其稳定性、性能更差,无论是日志还是 docker info
中都会看到警告信息。官方文档有明确的文章讲解了如何配置块设备给 devicemapper
驱动做存储层的做法,这类做法也被称为配置 direct-lvm
。
除了前面说到的问题外,devicemapper
+ loop-lvm
还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到 /var/lib/docker/devicemapper/devicemapper/data
不断增长,而且无法控制。很多人会希望删除镜像或者可以解决这个问题,结果发现效果并不明显。原因就是这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。
所以:
对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS
的情况下,一定要配置 direct-lvm
给 devicemapper
,无论是为了性能、稳定性还是空间利用率。
或许有人注意到了 CentOS 7 中存在被 backports 回来的 overlay
驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。
(参考自:Docker--从入门到实践)
安装及运行docker
比较easy,自己参考Docker--从入门到实践,在其中讲的有具体步骤,很详细了。本文的重点是direct_lvm模式的配置,这里就不再细说。
为生产环境配置direct_lvm模式
生产环境下应该使用direct_lvm,如果之前有镜像在loop_lvm模式下创建,需要切换,则需要把镜像做备份(push到hub或者私有registry).所以最好的做法,还是: 在刚刚给centos服务器安装docker的时候,直接做好配置.
1.停止docker daemon
[root@srv00 ~]# systemctl stop docker
2.创建相关的逻辑卷和thinpool
检查磁盘
[root@iZ28uvczcf6Z mapper]# fdisk -l <==检查下磁盘 Disk /dev/xvda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x635e6c7d Device Boot Start End Blocks Id System /dev/xvda1 * 2048 209713151 104855552 8e Linux LVM Disk /dev/xvdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x021dd279 Device Boot Start End Blocks Id System /dev/xvdb1 2048 41943039 20970496 8e Linux LVM
创建pv
[root@srv00 ~]# pvcreate /dev/xvdb1 Physical volume "/dev/xvdb" successfully created
注意: pvcreate 指令后面配置的硬盘(此处为"xvdb1")必须为独立的挂载硬盘,而不能是系统盘,否则会报错,创建失败.
(关于挂载新硬盘后,如何对硬盘进行"初始化"、"分区" ,在本文最后会单独讲解。(比如在本代码中,把Disk "/dev/xvdb"初始化成一块分区 "/dev/xvdb1",大小等同于磁盘大小(约20G)。)
创建vg
[root@srv00 ~]# vgcreate vgdocker /dev/xvdb1 Volume group "vgdocker" successfully created
创建一个thin pool,名字叫thinpool
,先来创建逻辑卷
[root@srv00 ~]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker Logical volume "thinpool" created. [root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker Logical volume "thinpoolmeta" created. [root@srv00 ~]# lvscan ACTIVE '/dev/centos/swap' [4.00 GiB] inherit ACTIVE '/dev/centos/root' [35.47 GiB] inherit ACTIVE '/dev/vgdocker/thinpool' [28.50 GiB] inherit ACTIVE '/dev/vgdocker/thinpoolmeta' [304.00 MiB] inherit
"剩余的4%留给它们自动扩展"
转换成thin pool
[root@srv00 ~]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted vgdocker/thinpool to thin pool.
设置thinpool的自动扩展参数,并应用此profile
[root@srv00 ~]# vi /etc/lvm/profile/docker-thinpool.profile activation { thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 } [root@srv00 ~]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool Logical volume "thinpool" changed.
"当空间大于80%时进行扩展.扩展的大小是空闲空间的20%"
查看thinpool是否是已监视状态
[root@srv00 ~]# lvs -o+seg_monitor LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor root centos -wi-ao---- 35.47g swap centos -wi-ao---- 4.00g thinpool vgdocker twi-a-t--- 28.50g 0.00 0.02 monitored
3.备份并删除docker存储目录(是否备份,根据自己需求)
备份
$ mkdir /var/lib/docker.bk $ mv /var/lib/docker/* /var/lib/docker.bk
删除原存储目录
[root@srv00 ~]# rm -rf /var/lib/docker/*
"注意备份重要镜像等"
4.修改启动参数并启动
我们通过systemd的drop-in方式修改,也是官方推荐的
编辑config文件
[root@srv00 ~]# mkdir /etc/systemd/system/docker.service.d [root@srv00 ~]# vi /etc/systemd/system/docker.service.d/daemon.conf [Service] ExecStart= ExecStart=/usr/bin/dockerd
"ExecStart=
第一行是空.否则启动会报错; "
实际启动时,是需要一些参数的,我们把它配置在daemon.json文件中。文件的位置是/etc/docker/daemon.json 通过vi指令编辑、保存,即可. daemon.json文件内容如下:
{ "storage-driver": "devicemapper", "storage-opts": [ "dm.thinpooldev=/dev/mapper/vgdocker-thinpool", "dm.use_deferred_removal=true", "dm.use_deferred_deletion=true" ] }
重新reload
[root@srv00 ~]# systemctl daemon-reload
[root@srv00 ~]# systemctl start docker
"修改daemon参数需要reload"
5.检查确认
可以看到,direct_lvm模式已经配置成功.
注: 因为笔者机器已经配置完毕,无法重新配置前面的步骤,所以前面的一些代码,均是从一篇他人的博客(点击访问)中粘贴过来的,并进行了一些整理。 不过差别只是硬盘名称不一样,流程和输入指令完全可以直接照搬.
[root@iZ28uvczcf6Z mapper]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 1 Server Version: 1.12.5 Storage Driver: devicemapper Pool Name: vgdocker-thinpool Pool Blocksize: 524.3 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: Metadata file: Data Space Used: 990.4 MB Data Space Total: 20.4 GB Data Space Available: 19.41 GB Metadata Space Used: 233.5 kB Metadata Space Total: 213.9 MB Metadata Space Available: 213.7 MB Thin Pool Minimum Free Space: 2.039 GB Udev Sync Supported: true Deferred Removal Enabled: true Deferred Deletion Enabled: true Deferred Deleted Device Count: 0 Library Version: 1.02.135-RHEL7 (2016-09-28) Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: null host bridge overlay Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: seccomp Kernel Version: 3.10.0-514.2.2.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 991.2 MiB Name: iZ28uvczcf6Z ID: KJ44:XNL6:W5KM:VYDQ:WN4C:FDPF:U52P:27SJ:MCWA:Q6JA:D76Z:JXVC Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: bridge-nf-call-iptables is disabled Insecure Registries: 127.0.0.0/8 [root@iZ28uvczcf6Z mapper]#
有哪些坑?
硬盘挂载
一定不能是系统盘
"Docker 1.12 on CentOS no longer uses socket activation"
因为Docker 1.12的一些新变化,基于网上的一些博客、文章,在配置时,就要有一些改变,否则你可能会遇到错误:"no sockets found via socket activation: make sure the service was started by systemd"。这个错误的解决方式,感兴趣的可以自行查看此链接: "docker daemon -H fd://" fails with message "No sockets found" under Ubuntu 15.10 #22847
挂载硬盘的初始化和分区方式
$ fdisk /dev/xvdb Command(m for help): n n之后,根据自己需要配置,也可以连着3次enter就可以完成配置,初始化为一块分区,分区大小=硬盘大小 Command (m for help): t t是个改类型的指令 Partition number (1-3,default 3): Partition type (type L to list all types): 8e 最好是给配置为支持LVM的8e类型 Command ( m for help): w 保存 partprobe 用partprobe可以使kernel重新读取分区信息,从而避免重启 //以下的指令非必须,仅做一个备录 pvcreate /dev/sda3 vgextend vg00 /dev/sda3 vgdisplay lvextend -L +80G /dev/vg00/lv_root lvdisplay resize2fs /dev/vg00/lv_root df -h
后言
站在前人的肩膀上
笔者学习时也是参考了一些博客、文章, 在它们的基础上,做了整理,并修改掉过时的配置信息. 其中一些笔者自己觉得说的挺清晰的,罗列在下面,方便参考:
Docker官方教程 : 官方教程,不用多说,只是英文阅读起来费些力气
Docker--从入门到实践 :gitbook书籍,讲的很详细
以及几篇不错的文章:
http://www.linuxtechi.com/thin-provisioned-logical-volumes-centos-7-rhel-7/
一种简单的方式,配置direct_lvm模式
本文主要讲的是自己手动配置direct_lvm模式的方式,还有一种简单些的配置方式.如 Docker Device Mapper 使用direct_lvm,文章提到了一个工具: docker-storage-setup,貌似基于这个脚本可以比较便捷的进行配置,但是感觉文中内容,笔者看的不是很明白,所以就没有继续了. docker-storage-setup的github网址,笔者也已经找到了:projectatomic/docker-storage-setup 。如果你感兴趣,研究有结果之后,欢迎回来在下方分享给笔者^_^。
http://www.cnblogs.com/Andrew-XinFei/p/6245330.html
相关推荐
该项目环境基于 Centos 7,使用 Git(Gitee)版本控制系统。整个过程可以分为四个步骤:安装 Docker、安装 Jenkins、配置 Jenkins 基本信息、使用 Dockerfile 和 shell 脚本实现项目自动拉取打包并运行。 安装 ...
Linux 下 CentOS 7 部署 Docker 在本文中,我们将详细介绍如何在 Linux 下的 CentOS 7 系统中部署 Docker。 Docker 是一个开源的容器化平台,能够帮助用户快速部署、运行和管理应用程序。 CentOS 7 是一个流行的 ...
本文将详细介绍如何在 CentOS 系统中使用 Docker 部署 .NET Core 项目,涵盖 Docker 的安装、 .NET Core 程序的安装、Nginx 的配置等重要知识点。 一、基本知识储备 在开始部署 .NET Core 项目之前,需要具备一些...
CentOS 中实现基于 Docker 部署 BI 数据分析 本文档将指导您在 CentOS 中实现基于 Docker 部署 BI 数据分析。我们将从了解 CentOS 和 Docker 的基本概念开始,然后逐步介绍如何在 CentOS 中安装 Docker,安装 Wyn ...
在Linux系统,特别是CentOS环境下,使用Docker技术可以方便地构建和运行容器化应用程序。NVIDIA-Docker2是专为在Docker容器内利用NVIDIA GPU进行计算设计的工具,它允许用户在GPU驱动支持的环境中运行计算密集型任务...
Docker 安装在 Centos7.6 上 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植...通过这些步骤,可以成功地在 Centos7.6 上安装 Docker,并可以使用 Docker 容器来部署应用程序。
Linux系统中的安装方法(以CentOS7为例): 更新系统软件包并安装必要的软件包,如yum-utils、device-mapper-persistent-data和lvm2等。 添加Docker的yum仓库,以便下载并安装Docker。可以通过访问Docker...
Linux系统中的安装方法(以CentOS7为例): 更新系统软件包并安装必要的软件包,如yum-utils、device-mapper-persistent-data和lvm2等。 添加Docker的yum仓库,以便下载并安装Docker。可以通过访问Docker...
总的来说,这个过程涵盖了Docker的安装与管理,MySQL的部署以及SkyWalking-OAP服务器的配置,提供了一套完整的可观测性解决方案,使你能够在微服务环境中监控和诊断应用程序的性能。在实际操作中,请确保根据你的...
本教程将深入讲解如何在CentOS 7.2系统上离线安装Docker CE(Community Edition)17.06.0.ce-1.el7.centos版本,以及处理相关依赖。 首先,我们需要理解CentOS 7.2作为Linux发行版,它支持Docker的运行。Docker CE...
在本文中,我们将深入探讨如何在CentOS 7系统中离线安装Docker。Docker是一种流行的开源容器化平台,它允许开发人员打包他们的应用程序及其依赖项到一个可移植的容器中,以便在任何环境中轻松运行。对于那些无法连接...
本篇文章将详细介绍如何在CentOS 7.9系统上离线安装Docker CE(社区版)服务,主要利用RPM包进行操作。首先,我们需要理解Docker的基本概念:Docker是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖打包成...
在Linux系统,特别是CentOS上安装Docker Compose是一个重要的步骤,因为它可以帮助我们管理和运行基于Docker容器的应用程序。Docker Compose是一个工具,它允许我们通过YAML配置文件来定义和运行多容器的Docker应用...
Linux系统中的安装方法(以CentOS7为例): 更新系统软件包并安装必要的软件包,如yum-utils、device-mapper-persistent-data和lvm2等。 添加Docker的yum仓库,以便下载并安装Docker。可以通过访问Docker...
在IT领域,特别是服务器管理和容器化技术中,CentOS是一个广泛应用的Linux发行版,而Docker CE(Community Edition)和NVIDIA Docker2是用于构建、部署和运行应用程序的开源平台。离线安装这些组件在没有互联网连接...
Docker是一种开放源代码的软件平台,用于构建、部署和运行应用程序,它利用容器来打包、分发和运行应用程序,这些容器是轻量级的,能够在几乎任何系统上运行。Docker容器与虚拟机类似,但容器的启动时间更快、资源...
在离线环境下安装Docker,首先需要下载适用于CentOS 7的Docker RPM包。"docker_rpm_next.zip"中就包含这些必要的RPM文件,它们可能是如`docker-engine`, `docker-ce`, `docker-ce-cli`等组件的特定版本。在没有网络...
【标题】"docker-compose_install.tar.gz" 是一个针对 CentOS 7 的 Docker 和 Docker Compose 的离线一键部署包。这个压缩文件提供了在没有网络连接或者网络环境受限的情况下,安装 Docker 和 Docker Compose 的便捷...
在IT行业中,Docker是一个非常重要的容器化技术,它允许开发者打包他们的应用及依赖环境到一个可...通过以上步骤,即使在没有网络的情况下,也能成功在CentOS 7上部署Docker 24.0.5,确保了服务的稳定运行和持续更新。