Help us understand the problem. What is going on with this article?

Docker を LVM シンプールで使う

More than 3 years have passed since last update.

[Docker][CentOS]Docker を LVM シンプールで使う

はじめに

  • CentOS 7.1.1503
  • docker 1.6.2

ループバックデバイスの警告抑止

いつからか docker run で次のような警告が表示されるようになっていました。

$ docker run centos /bin/echo hoge
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
hoge

ループバックデバイスは本番環境ではとても奨励されないので --storage-opt dm.thinpooldev を使うか --storage-opt dm.no_warn_on_loop_devices=true でこの警告を抑止してね!

ってことだと思います。

試しに --storage-opt dm.no_warn_on_loop_devices=true を付けてみると。

$ docker --storage-opt dm.no_warn_on_loop_devices=true run centos /bin/echo hoge
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
hoge

なにも変わらない・・・こういう使い方ではないようです。

/etc/sysconfig/docker-storage を編集する必要がありました。

$ vim /etc/sysconfig/docker-storage

次のように DOCKER_STORAGE_OPTIONS に追記します。

DOCKER_STORAGE_OPTIONS="--storage-opt dm.no_warn_on_loop_devices=true"

docker サービスを再起動します。

$ systemctl restart docker.service

もう一度 docker run してみると・・警告が表示されなくなりました。

$ docker run centos /bin/echo hoge
hoge

LVM シンプールを使う

そもそも、シンプールをループバックデバイスに作ると性能が良くないのでやめてってことだと思うので --storage-opt dm.thinpooldev を使って普通の LVM シンプールを使ってみます。

Docker を止めます。

$ systemctl stop docker.service

Docker の既存データをすべて削除します。

$ rm -fr /var/lib/docker/*

LVM のシンプロビジョニングなら前にやったので、以下を参考にシンプールを作ります。

$ parted -s /dev/sdb -- mklabel gpt mkpart primary 1 -1 set 1 lvm on
$ pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
$ vgcreate -s 32MB vg0 /dev/sdb1
  Volume group "vg0" successfully created
$ lvcreate --thin -L 16GB vg0/docker
  Logical volume "docker" created.

シンプールが作成されています。

$ lvs
  LV     VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker vg0  twi-a-tz-- 16.00g             0.00   0.31

/etc/sysconfig/docker-storage を編集します。

$ vim /etc/sysconfig/docker-storage

次のようにシンプールを指定します。

DOCKER_STORAGE_OPTIONS="--storage-opt dm.thinpooldev=/dev/mapper/vg0-docker"

docker サービスを開始します。

$ systemctl start docker.service

docker info でそれっぽく表示されていることを確認します。

$ docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: vg0-docker
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 307.2 MB
 Data Space Total: 17.18 GB
 Data Space Available: 16.87 GB
 Metadata Space Used: 245.8 kB
 Metadata Space Total: 33.55 MB
 Metadata Space Available: 33.31 MB
 Udev Sync Supported: true
 Library Version: 1.02.93-RHEL7 (2015-01-28)
  :

docker run してみます。

$ docker run centos /bin/echo hoge
Unable to find image 'centos:latest' locally
latest: Pulling from docker.io/centos
f1b10cd84249: Pull complete 
c852f6d61e65: Pull complete 
7322fbe74aa5: Already exists 
docker.io/centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:57554136c655abb33ecb7bb790b1db0279668d3763c3b81f31bc6c4e60e4a1f3
Status: Downloaded newer image for docker.io/centos:latest
hoge

lsblk すると次のようになりました。

$ lsblk /dev/sdb1
NAME                          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb1                            8:17   0  20G  0 part 
├─vg0-docker_tmeta            253:0    0  32M  0 lvm  
│ └─vg0-docker                253:2    0  16G  0 lvm  
│   └─docker-8:1-9643532-base 253:3    0  10G  0 dm   
└─vg0-docker_tdata            253:1    0  16G  0 lvm  
  └─vg0-docker                253:2    0  16G  0 lvm  
    └─docker-8:1-9643532-base 253:3    0  10G  0 dm   

docker-storage-setup でシンプールをセットアップ

↑では自分でシンプールを作成して /etc/sysconfig/docker-storage を編集しましたが、docker-storage-setup を使えばそのあたりを自動で作成してくれるようです。

Docker を止めてすべてのデータを削除します。

$ systemctl stop docker.service
$ rm -fr /var/lib/docker/*

↑で作っていたシンプールも削除します。

$ lvremove /dev/vg0/docker
Do you really want to remove active logical volume docker? [y/n]: y
  Logical volume "docker" successfully removed

/etc/sysconfig/docker-storage-setup で、シンプールに使うボリュームグループを指定します。

$ cat <<EOS> /etc/sysconfig/docker-storage-setup
VG=vg0
EOS

docker-storage-setup を実行します。

$ docker-storage-setup
  Volume group "sda1" not found
  Cannot process volume group sda1
  Rounding up size to full physical extent 32.00 MiB
  Logical volume "docker-poolmeta" created.
WARNING: ext4 signature detected on /dev/vg0/docker-pool at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/vg0/docker-pool.
  Logical volume "docker-pool" created.
  WARNING: Converting logical volume vg0/docker-pool and vg0/docker-poolmeta to pool's data and metadata volumes.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
  Converted vg0/docker-pool to thin pool.
  Logical volume "docker-pool" changed.

シンプールが作成されています。

$ lvs
  LV          VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool vg0  twi-a-t--- 11.94g             0.00   0.12

/etc/sysconfig/docker-storage も作成されています。

$ cat /etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS=-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/vg0-docker--pool

docker サービスを開始します。

$ systemctl start docker.service

docker run してみます。

$ docker run centos /bin/echo hoge
Unable to find image 'centos:latest' locally
latest: Pulling from docker.io/centos
f1b10cd84249: Pull complete 
c852f6d61e65: Pull complete 
7322fbe74aa5: Already exists 
docker.io/centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:57554136c655abb33ecb7bb790b1db0279668d3763c3b81f31bc6c4e60e4a1f3
Status: Downloaded newer image for docker.io/centos:latest
hoge

ちなみに、この docker-storage-setup ですが、多分 これ だと思うんですけど、systemctl show docker-storage-setup.service してみた感じ、ブート時に自動で実行されるようになっているようです。

docker-storage-setup でシンプールをセットアップ:改

Docker のストレージ用のディスクを別に設けるなら、パーティションの作成やボリュームグループの作成も docker-storage-setup にやらせることができました。

Docker を止めてすべてのデータを削除します。

$ systemctl stop docker.service
$ rm -fr /var/lib/docker/*

↑で作っていたシンプールとかボリュームグループとかパーティションとかを削除します。

$ lvremove /dev/vg0/docker-pool
Do you really want to remove active logical volume docker-pool? [y/n]: y
  Logical volume "docker-pool" successfully removed

$ vgremove /dev/vg0
  Volume group "vg0" successfully removed

$ parted -s /dev/sdb rm 1

/etc/sysconfig/docker-storage-setup でディスクのデバイスと、作成するボリュームグループの名前を指定します。

$ cat <<EOS> /etc/sysconfig/docker-storage-setup
DEVS=/dev/sdb
VG=vg-docker
EOS

docker-storage-setup を実行します。

$ docker-storage-setup
  Volume group "sda1" not found
  Cannot process volume group sda1

  ...snip...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
  Physical volume "/dev/sdb1" successfully created
  Volume group "vg-docker" successfully created
  Rounding up size to full physical extent 24.00 MiB
  Logical volume "docker-poolmeta" created.
  Logical volume "docker-pool" created.
  WARNING: Converting logical volume vg-docker/docker-pool and vg-docker/docker-poolmeta to pool's data and metadata volumes.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
  Converted vg-docker/docker-pool to thin pool.
  Logical volume "docker-pool" changed.

シンプールが作成されています。

$ lvs
  LV          VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool vg-docker twi-a-t--- 11.98g             0.00   0.16

/etc/sysconfig/docker-storage も作成されています。

$ cat /etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS=-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/vg--docker-docker--pool

docker サービスを開始します。

$ systemctl start docker.service

docker run してみます。

$ docker run centos /bin/echo hoge
Unable to find image 'centos:latest' locally
latest: Pulling from docker.io/centos
f1b10cd84249: Pull complete 
c852f6d61e65: Pull complete 
7322fbe74aa5: Already exists 
docker.io/centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:57554136c655abb33ecb7bb790b1db0279668d3763c3b81f31bc6c4e60e4a1f3
Status: Downloaded newer image for docker.io/centos:latest
hoge

さいごに

うーん?
ループバックデバイスのほうがコンテナの作成が明らかに早いのだけれども・・・なにか根本的に間違っているのかもしれません。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした