Docker存储调整

概述

主要介绍docker的devicemapper和overlay2这两种常用配置参数,操作系统在7.4及docker版本在1.13.1以上建议使用overlay2存储方式;以及docker存储位置的调整,这些配置调整主要是为了应对客户那里不同的环境,比如,有的客户机器上没有磁盘可以挂载,这就需要使用系统盘的额外空间了,这个空间可能是个目录或者是个VG;再或者有的客户docker默认路径/var/lib/docker下是不允许放置数据,所以这个空间非常小,需要调整位置;将以下参数根据客户的不同需求进行排列组合应该就满足大部分需求了。另外还有一些配置过程中产生的问题做个记录。做个总结小记,怕又忘了。

修改docker存储的位置

  1. 停止docker服务
systemctl stop docker
  1. 编辑/usr/lib/systemd/system/docker.service文件
ExecStart=/usr/bin/dockerd-current \
          --graph=/opt/docker-data \
  1. 重启服务
systemctl daemon-reload 
systemctl start docker
  1. 检查Docker Root Dir字段的值是否为修改后的
docker info
...
Docker Root Dir: /opt/docker-data
...
  1. 注意点
如果开启了selinux,新建的目录需要配置selinux的上下文,否则docker 容器启动会有问题,如果selinux是permissive或disabled,则没问题。

/etc/sysconfig/docker-storage-setup常用配置介绍

  • 这些参数用man docker-storage-setup就可以查看到了。
STORAGE_DRIVER: 指定存储的种类,默认是devicemapper,可以修改为overlay2。
CONTAINER_THINPOOL: 这个值是给STORAGE_DRIVER为devicemapper时使用的,用于指定使用的lv名字
EXTRA_STORAGE_OPTIONS: 用于指定一些额外存储参数,这个就是作为docker的启动参数。
DEVS: 用于指定设备,设备可以是一块盘,一个分区,如果没有指定,那么VG字段就需要指定了,使用VG的空间。
VG: 在指定设备的前提下并且系统没有对应的VG,则会自动创建;如果没有指定设备,那么就需要先创建一下。
===============================================================================================
以下几个参数比较少用,主要用于设置lv根据某个阈值进行动态扩容,不做介绍了,有兴趣的可以用个man查看。
GROWPART:
AUTO_EXTEND_POOL:
POOL_AUTOEXTEND_THRESHOLD:
POOL_AUTOEXTEND_PERCENT:
===============================================================================================
CHUNK_SIZE:设置chunk的大小,一般也不怎么设置。
DEVICE_WAIT_TIMEOUT:在使用docker-storage-setup时等待创建的时间,默认60秒。
WIPE_SIGNATURES:有时候磁盘上有数据,这个参数用于确认删除,值有true/false,true是强制删除。
===============================================================================================
接下来的几个参数主要用来创建一个LV(需要先指定DEV),并且把这个LV创建为xfs的文件系统然后mount到指定的路径下,其实这个参数跟docker没有直接关系。
CONTAINER_ROOT_LV_NAME: 指定lv名字
CONTAINER_ROOT_LV_MOUNT_PATH: 指定mount路径
CONTAINER_ROOT_LV_SIZE: 指定lv大小,默认是40%。
===============================================================================================
DATA_SIZE: 用于指定使用多少存储,这个是docker会直接使用的lv大小,这个参数没法指定百分比。
以下几个参数也很少使用,没有玩过,感兴趣的可以去man一下看看。
ROOT_SIZE:
MIN_DATA_SIZE:
POOL_META_SIZE:

配置overlay2单独使用一块盘

  1. 停止docker服务
systemctl stop docker
rm -rf /var/lib/docker/
  1. 配置/etc/sysconfig/docker-storage-setup
STORAGE_DRIVER=overlay2
DEVS=/dev/sdb
CONTAINER_ROOT_LV_NAME=dockerlv
CONTAINER_ROOT_LV_SIZE=100%FREE
# 下面这个mount的路径就比较特殊了,其实这个相关的配置文件就是使用sdb创建一个pv、vg、lv,然后格式化成xfs,最后mount一下,docker只是去使用这个路径下空间,如果docker存储的路径需要改变,这个mount的路径也需要进行修改。
CONTAINER_ROOT_LV_MOUNT_PATH=/var/lib/docker
VG=dockervg
  1. 初始化docker存储启动docker
docker-storage-setup
systemctl start docker
  1. 最后通过docker info去查看存储相关的配置进行验证

配置overlay2单独使用一个分区

使用已有的VG则只需要在使用一块盘的方法之上把DEVS字段修改为某个分区即可。

配置overlay2使用已有VG

使用已有的VG则只需要在使用一块盘的方法之上把DEVS字段删除,VG字段修改为已有的VG即可,如果没有指定默认使用根文件系统所在的VG。

配置devicemapper单独使用一块盘

  1. 停止docker服务
systemctl stop docker
rm -rf /var/lib/docker/
  1. 配置/etc/sysconfig/docker-storage-setup
STORAGE_DRIVER=devicemapper
CONTAINER_THINPOOL=docker-pool
DEVS=/dev/sdb
VG=docker-vg
  1. 配置生效
# docker-storage-setup
INFO: Writing zeros to first 4MB of device /dev/sdb
4+0 records in
4+0 records out
4194304 bytes (4.2 MB) copied, 0.00860744 s, 487 MB/s
INFO: Device node /dev/sdb1 exists.
  Physical volume "/dev/sdb1" successfully created.
  Volume group "docker-vg" successfully created
  Using default stripesize 64.00 KiB.
  Rounding up size to full physical extent 24.00 MiB
  Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
  Logical volume "docker-pool" created.
  Logical volume docker-vg/docker-pool changed.
  1. 启动docker
systemctl start docker
  1. 默认情况下docker-pool这个lv只会使用vg的40%空间,这个可以通过指定DATA_SIZE或者后面再通过lvextend去扩容lv。

配置devicemapper单独一个分区

方法同配置devicemapper单独使用一块盘,只需要将DEVS指定为特定分区即可。

配置devicemapper使用已有VG

方法同配置devicemapper单独使用一块盘,将DEVS字段删除,并将VG字段修改为已有的VG即可,如果没有指定默认使用根文件系统所在的VG。

注意点

  1. 如果此前这块盘被使用过,创建了pv,vg,lv,需依次删除lv、vg、pv,然后再使用fdisk删除sdb1分区,执行partprobe,最后再执行docker-storage-setup。
  2. 在使用一块盘、分区、VG,lv默认使用的是所在VG的40%空间,这个要看具体
  3. 执行docker-storage-setup报错如下错误时,将WIPE_SIGNATURES=true追加至/etc/sysconfig/docker-storage-setup文件后。
ERROR: Found dos signature on device /dev/sdb at offset 0x1fe. Wipe signatures using wipefs or use WIPE_SIGNATURES=true and retry.
  1. 如果再次执行docker-storage-setup还会报如下错,删除/etc/sysconfig/docker-storage文件再次执行即可。
INFO: Wipe Signatures is set to true. Any signatures on /dev/sdb will be wiped.
/dev/sdb: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdb: calling ioclt to re-read partition table: Success
INFO: Writing zeros to first 4MB of device /dev/sdb
4+0 records in
4+0 records out
4194304 bytes (4.2 MB) copied, 0.00307498 s, 1.4 GB/s
INFO: Device node /dev/sdb1 exists.
  Physical volume "/dev/sdb1" successfully created.
  Volume group "docker-vg" successfully created
INFO: Found an already configured thin pool /dev/mapper/docker--vg-docker--pool in /etc/sysconfig/docker-storage
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 60 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 55 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 50 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 45 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 40 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 35 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 30 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 25 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 20 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 15 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 10 seconds
INFO: Waiting for device /dev/mapper/docker--vg-docker--pool to be available. Wait time remaining is 5 seconds
INFO: Timed out waiting for device /dev/mapper/docker--vg-docker--pool
ERROR: Already configured thin pool /dev/mapper/docker--vg-docker--pool is not available. If thin pool exists and is taking longer to activate, set DEVICE_WAIT_TIMEOUT to a higher value and retry. If thin pool does not exist any more, remove /etc/sysconfig/docker-storage and retry
  1. 当配置好存储后,启动docker时报如下错,我是使用restart去启动docker解决的。
# systemctl status docker.service -l
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2018-12-14 07:10:49 EST; 36s ago
     Docs: http://docs.docker.com
  Process: 2983 ExecStart=/usr/bin/dockerd-current --graph=/opt/docker-data --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --authorization-plugin=rhel-push-plugin --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
 Main PID: 2983 (code=exited, status=1/FAILURE)

Dec 14 07:10:47 test4 systemd[1]: Starting Docker Application Container Engine...
Dec 14 07:10:47 test4 dockerd-current[2983]: time="2018-12-14T07:10:47.476880833-05:00" level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
Dec 14 07:10:48 test4 dockerd-current[2983]: time="2018-12-14T07:10:48.028808212-05:00" level=info msg="libcontainerd: new containerd process, pid: 2991"
Dec 14 07:10:49 test4 dockerd-current[2983]: time="2018-12-14T07:10:49.037685204-05:00" level=error msg="devmapper: Unable to delete device: devicemapper: Error running DeleteDevice dm_task_run failed"
Dec 14 07:10:49 test4 dockerd-current[2983]: Error starting daemon: error initializing graphdriver: devmapper: Base Device UUID and Filesystem verification failed: devicemapper: Error running deviceCreate (ActivateDevice) dm_task_run failed
Dec 14 07:10:49 test4 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Dec 14 07:10:49 test4 systemd[1]: Failed to start Docker Application Container Engine.
Dec 14 07:10:49 test4 systemd[1]: Unit docker.service entered failed state.
Dec 14 07:10:49 test4 systemd[1]: docker.service failed.
  1. 有时候遇到一些问题解决不了,那就重新来一次,进行删除lv、vg、pv、fdisk、partprobe、rm -f /etc/sysconfig/docker-storage、rm -rf /var/lib/docker/,最后执行docker-storage-setup

你可能感兴趣的:(Docker存储调整)