Docker存儲調(diào)整

概述

主要介紹docker的devicemapper和overlay2這兩種常用配置參數(shù),操作系統(tǒng)在7.4及docker版本在1.13.1以上建議使用overlay2存儲方式;以及docker存儲位置的調(diào)整,這些配置調(diào)整主要是為了應對客戶那里不同的環(huán)境,比如,有的客戶機器上沒有磁盤可以掛載,這就需要使用系統(tǒng)盤的額外空間了,這個空間可能是個目錄或者是個VG;再或者有的客戶docker默認路徑/var/lib/docker下是不允許放置數(shù)據(jù),所以這個空間非常小,需要調(diào)整位置;將以下參數(shù)根據(jù)客戶的不同需求進行排列組合應該就滿足大部分需求了。另外還有一些配置過程中產(chǎn)生的問題做個記錄。做個總結(jié)小記,怕又忘了。

修改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常用配置介紹

  • 這些參數(shù)用man docker-storage-setup就可以查看到了。
STORAGE_DRIVER: 指定存儲的種類,默認是devicemapper,可以修改為overlay2。
CONTAINER_THINPOOL: 這個值是給STORAGE_DRIVER為devicemapper時使用的,用于指定使用的lv名字
EXTRA_STORAGE_OPTIONS: 用于指定一些額外存儲參數(shù),這個就是作為docker的啟動參數(shù)。
DEVS: 用于指定設(shè)備,設(shè)備可以是一塊盤,一個分區(qū),如果沒有指定,那么VG字段就需要指定了,使用VG的空間。
VG: 在指定設(shè)備的前提下并且系統(tǒng)沒有對應的VG,則會自動創(chuàng)建;如果沒有指定設(shè)備,那么就需要先創(chuàng)建一下。
===============================================================================================
以下幾個參數(shù)比較少用,主要用于設(shè)置lv根據(jù)某個閾值進行動態(tài)擴容,不做介紹了,有興趣的可以用個man查看。
GROWPART:
AUTO_EXTEND_POOL:
POOL_AUTOEXTEND_THRESHOLD:
POOL_AUTOEXTEND_PERCENT:
===============================================================================================
CHUNK_SIZE:設(shè)置chunk的大小,一般也不怎么設(shè)置。
DEVICE_WAIT_TIMEOUT:在使用docker-storage-setup時等待創(chuàng)建的時間,默認60秒。
WIPE_SIGNATURES:有時候磁盤上有數(shù)據(jù),這個參數(shù)用于確認刪除,值有true/false,true是強制刪除。
===============================================================================================
接下來的幾個參數(shù)主要用來創(chuàng)建一個LV(需要先指定DEV),并且把這個LV創(chuàng)建為xfs的文件系統(tǒng)然后mount到指定的路徑下,其實這個參數(shù)跟docker沒有直接關(guān)系。
CONTAINER_ROOT_LV_NAME: 指定lv名字
CONTAINER_ROOT_LV_MOUNT_PATH: 指定mount路徑
CONTAINER_ROOT_LV_SIZE: 指定lv大小,默認是40%。
===============================================================================================
DATA_SIZE: 用于指定使用多少存儲,這個是docker會直接使用的lv大小,這個參數(shù)沒法指定百分比。
以下幾個參數(shù)也很少使用,沒有玩過,感興趣的可以去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的路徑就比較特殊了,其實這個相關(guān)的配置文件就是使用sdb創(chuàng)建一個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去查看存儲相關(guān)的配置進行驗證

配置overlay2單獨使用一個分區(qū)

使用已有的VG則只需要在使用一塊盤的方法之上把DEVS字段修改為某個分區(qū)即可。

配置overlay2使用已有VG

使用已有的VG則只需要在使用一塊盤的方法之上把DEVS字段刪除,VG字段修改為已有的VG即可,如果沒有指定默認使用根文件系統(tǒng)所在的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單獨一個分區(qū)

方法同配置devicemapper單獨使用一塊盤,只需要將DEVS指定為特定分區(qū)即可。

配置devicemapper使用已有VG

方法同配置devicemapper單獨使用一塊盤,將DEVS字段刪除,并將VG字段修改為已有的VG即可,如果沒有指定默認使用根文件系統(tǒng)所在的VG。

注意點

  1. 如果此前這塊盤被使用過,創(chuàng)建了pv,vg,lv,需依次刪除lv、vg、pv,然后再使用fdisk刪除sdb1分區(qū),執(zhí)行partprobe,最后再執(zhí)行docker-storage-setup。
  2. 在使用一塊盤、分區(qū)、VG,lv默認使用的是所在VG的40%空間,這個要看具體
  3. 執(zhí)行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. 如果再次執(zhí)行docker-storage-setup還會報如下錯,刪除/etc/sysconfig/docker-storage文件再次執(zhí)行即可。
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/,最后執(zhí)行docker-storage-setup
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容