Docker 持久化存储配置
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模式
以下是无法添加新的硬盘解决办法
减小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
以下是我们在额外添加一块硬盘单独来做的步骤
我们首先准备一个硬盘,一块空白的不需要做分区操作
[root@registry /]# vi /etc/sysconfig/docker-storage-setup
DEVS=/dev/sdb //LVM的设备
VG=docker //VG的名称
SETUP_LVM_THIN_POOL=yes //使用LVM瘦模式,我这里应为空间问题使用,生产中最好不要使用
修改完成后我们直接执行docker-storage-setup 会自动创建完成
查看LVM 会看到自动创建了一个docker的vg和一个docker-pool的LV
重启docker服务,查看持久化卷状态
[root@registry /]# systemctl restart docker
[root@registry /]# docker info | grep Pool
如果你以前运行过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
注意:删除后镜像和容器就没了,请谨慎操作,重要东西一定记得备份
- 本文标签: 技术分享
- 本文链接: http://www.iamlk.cn/article/80
- 版权声明: 本文由Leonidax原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权