Docker 持久化存储配置

  • A+
所属分类:技术分享

docker安装完成,默认使用的是本地文件系统作为持久化存储设备,默认路径是,本地loop 方式,这种方式有缓存不适用于生产环境

/var/lib/docker/volumes

 
 

如果我们在创建容器时指定-v参数
并没有指定源目录或者配置文件中指定需要持久化存储没指定,就会在这个目录向创建一个文件夹进行映射,

docker run -d -v /data apache //像这样的

 
 

说明:容器是实时写入到持久化卷上

 
 

Docker Engine提供了docker-storage-setup服务来帮助配置docker服务的devicemapper存储驱动,如果该驱动自动配置失败,则docker服务的存储驱动会降级为lvm-loop驱动。由于loop设备的缓存问题,lvm-loop模式不适合生产环境。

Linux安装程序默认使用lvm模式管理磁盘,如果仅有一块磁盘,安装程序会在该物理卷(pv)上创建Linux卷组(vg), 并同时使用所有空间创建home和root逻辑卷(lv)。

服务docker-storage-setup默认会尝试使用root文件系统所属的vg, 即Linux vg,但是由于该vg上已经没有剩余空间,从而导致devicemapper驱动配置失败。

如何查看存储是不是lvm-loop可以使用以下方式

[root@registry /]# docker info | grep Pool

显示以下形式docker-253就是lvm-loop模式

110817 0854 Docker1 - Docker 持久化存储配置

 
 

以下是无法添加新的硬盘解决办法

减小home lvm的大小创建docker lvm

Linux默认安装程序创建的home lv空间一般比较大,先减小其大小:

这里已contos7为例

lvresize -L -50G /dev/centos/home
 重新创建并挂载home文件系

umount /home
mkfs.xfs /dev/centos/home
mount /home
 使用docker-storage-setup配置devicemapper驱动, 执行:

systemctl stop docker

rm -rf /var/lib/docker
systemctl start docker

 
 

以下是我们在额外添加一块硬盘单独来做的步骤

我们首先准备一个硬盘,一块空白的不需要做分区操作

110817 0854 Docker2 - Docker 持久化存储配置

 
 

[root@registry /]# vi /etc/sysconfig/docker-storage-setup

DEVS=/dev/sdb //LVM的设备

VG=docker //VG的名称

SETUP_LVM_THIN_POOL=yes //使用LVM瘦模式,我这里应为空间问题使用,生产中最好不要使用

110817 0854 Docker3 - Docker 持久化存储配置

 
 

修改完成后我们直接执行docker-storage-setup 会自动创建完成

 

110817 0854 Docker4 - Docker 持久化存储配置

 

 
 

查看LVM 会看到自动创建了一个docker的vg和一个docker-pool的LV

110817 0854 Docker5 - Docker 持久化存储配置

 
 

重启docker服务,查看持久化卷状态

[root@registry /]# systemctl restart docker

[root@registry /]# docker info | grep Pool

110817 0854 Docker6 - Docker 持久化存储配置

 
 

如果你以前运行过docker,那么重启服务会失败,以下错误

[root@registry /]# journalctl -xn

-- Logs begin at Fri 2017-11-03 13:24:03 CST, end at Wed 2017-11-08 16:46:42 CST. --

Nov 08 16:46:42 registry systemd[1]: docker-storage-setup.service: main process exited, code=exited, status=1/FAILURE

Nov 08 16:46:42 registry systemd[1]: Failed to start Docker Storage Setup.

-- Subject: Unit docker-storage-setup.service has failed

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

--

-- Unit docker-storage-setup.service has failed.

--

-- The result is failed.

Nov 08 16:46:42 registry systemd[1]: Unit docker-storage-setup.service entered failed state.

Nov 08 16:46:42 registry systemd[1]: Starting Docker Application Container Engine...

-- Subject: Unit docker.service has begun with start-up

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

--

-- Unit docker.service has begun starting up.

Nov 08 16:46:42 registry kernel: device-mapper: table: 253:3: thin: Couldn't open thin internal device

Nov 08 16:46:42 registry kernel: device-mapper: ioctl: error adding target to table

Nov 08 16:46:42 registry docker[4687]: time="2017-11-08T16:46:42.970075919+08:00" level=fatal msg="Error starting daemon: error initializing graphdriver: Base Device UUID verifica

Nov 08 16:46:42 registry systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE

Nov 08 16:46:42 registry systemd[1]: Failed to start Docker Application Container Engine.

-- Subject: Unit docker.service has failed

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

--

-- Unit docker.service has failed.

--

-- The result is failed.

Nov 08 16:46:42 registry systemd[1]: Unit docker.service entered failed state.

[root@registry /]#

 
 

解决办法删除旧的docker数据,在重启就OK了

[root@registry /]# rm -rf /var/lib/docker

注意:删除后镜像和容器就没了,请谨慎操作,重要东西一定记得备份

 
 

 
 

 
 

 
 

 
 

 
 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: