最近 Nutanix から、Acropolis Hypervisor で Docker を使うときのベストプラクティスが公開されました。ここから DL できます。
AHV 上で Docker host VM を起動して、その上で Docker エンジンが動作します。そして Docer host には、CentOS 7 を使用して説明しています。
Docker は極めて普通な使い方をしているのではないかと思いますが、あえて特徴的な点を挙げると下記のあたりではないかと思います。
- Docker のコンテナイメージを格納するストレージ領域は、デフォルトのループバックデバイスではなく、vDisk を LVM で管理した LV を使用する。(direct-lvm Mode)
- Nutanix 側ですでに冗長化されているため、LV 側では冗長化せず、ただストライピングしている。
ということで、ためしにやってみました。
今回の環境
Nutanix CE 2015.11.05-stable を使っています。
nutanix@NTNX-bb10a8de-A-CVM:10.1.1.11:~$ cat /etc/nutanix/release_version
el6-release-ce-2015.11.05-stable-130f29ce4bc788169965a2fcfc5b1a21386b389a
Docker Host は、CentOS 7 に近い Oracle Linux 7 で試してみました。
[root@vm01 ~]# cat /etc/oracle-release Oracle Linux Server release 7.2 [root@vm01 ~]# uname -r 4.1.12-32.1.2.el7uek.x86_64
Docker は 1.9 です。デフォルトでは、Docker ストレージとして、
/var/lib/docker/devicemapper/devicemapper/data ファイルを作成しています。
[root@vm01 ~]# docker info Containers: 0 Images: 0 Server Version: 1.9.1 Storage Driver: devicemapper Pool Name: docker-251:0-21415491-pool Pool Blocksize: 65.54 kB Base Device Size: 107.4 GB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 53.74 MB Data Space Total: 107.4 GB Data Space Available: 7.491 GB Metadata Space Used: 606.2 kB Metadata Space Total: 2.147 GB Metadata Space Available: 2.147 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2015-10-14) Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 4.1.12-32.1.2.el7uek.x86_64 Operating System: Oracle Linux Server 7.2 CPUs: 1 Total Memory: 991 MiB Name: vm01 ID: 264Z:SS76:ZFJQ:NNOW:F3BS:5DJ4:WSKJ:BWHX:UPE2:5ZIS:F3R4:7CZ4
Docker host VM の Docker イメージストア削除
まず docker サービスを停止して、デフォルトで作成される Docker イメージのストアを削除します。
[root@vm01 ~]# systemctl stop docker [root@vm01 ~]# rm -rf /var/lib/docker/*
CVM での vDisk 追加
Docker Host VM (vm01)に、vDisk を追加します。
Nutanix NDFS の、ストレージコンテナ名を確認しておきます。
nutanix@NTNX-bb10a8de-A-CVM:10.1.1.11:~$ ncli container list | grep Name Name : default-container-8686408302021983973 VStore Name(s) : default-container-8686408302021983973
下記のacli コマンドで、vm01 に 50GB の vDisk を6つ追加します。
acli vm.disk_create vm01 create_size=50g container=<NDFSのコンテナ名>
nutanix@NTNX-bb10a8de-A-CVM:10.1.1.11:~$ for i in {1..6}; do acli vm.disk_create vm01 create_size=50g container=default-container-8686408302021983973 ; done DiskCreate: pending DiskCreate: complete DiskCreate: pending DiskCreate: complete DiskCreate: pending DiskCreate: complete DiskCreate: pending DiskCreate: complete DiskCreate: pending DiskCreate: complete DiskCreate: pending DiskCreate: complete
vDisk が追加されました。
nutanix@NTNX-bb10a8de-A-CVM:10.1.1.11:~$ acli vm.disk_get vm01 addr { bus: "ide" index: 0 } cdrom: true empty: true addr { bus: "scsi" index: 0 } vmdisk_uuid: "bf05ce7b-ea79-4e8d-a0f0-f451f1bc57ac" source_vmdisk_uuid: "cbc83864-2b5a-4b06-bfb9-00a9282f9095" container_id: 4 vmdisk_size: 10737418240 addr { bus: "scsi" index: 1 } vmdisk_uuid: "d0f47dbd-6051-4543-96f2-5b053c7315f6" container_id: 4 vmdisk_size: 50000000000 addr { bus: "scsi" index: 2 } vmdisk_uuid: "d971b084-d536-4e7d-b62b-9c0087e65031" container_id: 4 vmdisk_size: 50000000000 addr { bus: "scsi" index: 3 } vmdisk_uuid: "a83c059a-8f00-4775-b15a-b280d42813f4" container_id: 4 vmdisk_size: 50000000000 addr { bus: "scsi" index: 4 } vmdisk_uuid: "d3973c26-6834-4fa0-b560-297f62c5484f" container_id: 4 vmdisk_size: 50000000000 addr { bus: "scsi" index: 5 } vmdisk_uuid: "7b9df47a-5c9b-4b1c-abd2-e6e5f23530dd" container_id: 4 vmdisk_size: 50000000000 addr { bus: "scsi" index: 6 } vmdisk_uuid: "28694723-b0cf-4b07-9bfa-aba97b36fca8" container_id: 4 vmdisk_size: 50000000000
Docker host VM でのイメージストア作成
Docker Host VM 側の Oracle Linux 7 では、オンラインでディスク認識されます。
lsscsi コマンドで確認すると、NUTANIX VDISK だと表示されています。
/dev/sdb~/dev/sdg として認識されました。
lsscsi コマンドで確認すると、NUTANIX VDISK だと表示されています。
/dev/sdb~/dev/sdg として認識されました。
[root@vm01 ~]# lsscsi [0:0:0:0] cd/dvd QEMU QEMU DVD-ROM 2.1. /dev/sr0 [2:0:0:0] disk NUTANIX VDISK 0 /dev/sda [2:0:1:0] disk NUTANIX VDISK 0 /dev/sdb [2:0:2:0] disk NUTANIX VDISK 0 /dev/sdc [2:0:3:0] disk NUTANIX VDISK 0 /dev/sdd [2:0:4:0] disk NUTANIX VDISK 0 /dev/sde [2:0:5:0] disk NUTANIX VDISK 0 /dev/sdf [2:0:6:0] disk NUTANIX VDISK 0 /dev/sdg
journalctl コマンドや dmesg コマンドでも、Disk 認識している様子がわかります。
[root@vm01 ~]# journalctl -k -f (省略) Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: Direct-Access NUTANIX VDISK 0 PQ: 0 ANSI: 5 Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: alua: supports implicit TPGS Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: alua: port group 01 rel port ffffffff Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: alua: rtpg failed with 8000002 Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: alua: port group 01 state A preferred supports tolusna Jan 31 14:17:56 vm01 kernel: scsi 2:0:6:0: alua: Attached Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: [sdg] 97656250 512-byte logical blocks: (50.0 GB/46.5 GiB) Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: Attached scsi generic sg7 type 0 Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: [sdg] Write Protect is off Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: [sdg] Mode Sense: 6f 00 00 00 Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: [sdg] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA Jan 31 14:17:56 vm01 kernel: sd 2:0:6:0: [sdg] Attached SCSI disk
LVM で、PV を作成します。
[root@vm01 ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg Physical volume "/dev/sdb" successfully created Physical volume "/dev/sdc" successfully created Physical volume "/dev/sdd" successfully created Physical volume "/dev/sde" successfully created Physical volume "/dev/sdf" successfully created Physical volume "/dev/sdg" successfully created
PV ができました。
[root@vm01 ~]# pvs /dev/sd[b-g] PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 46.57g 46.57g /dev/sdc lvm2 --- 46.57g 46.57g /dev/sdd lvm2 --- 46.57g 46.57g /dev/sde lvm2 --- 46.57g 46.57g /dev/sdf lvm2 --- 46.57g 46.57g /dev/sdg lvm2 --- 46.57g 46.57g
VG を作成します。VG 名は「direct-lvm」にしています。
[root@vm01 ~]# vgcreate direct-lvm /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg Volume group "direct-lvm" successfully created
VG ができました。
[root@vm01 ~]# vgs direct-lvm VG #PV #LV #SN Attr VSize VFree direct-lvm 6 0 0 wz--n- 279.38g 279.38g
LV を作成します。
direct-lvm VG の 95%で data LV、5%で metadata LV を作成しています。
ストライプ数は、vDisk 数にあわせて 6 にしています。
direct-lvm VG の 95%で data LV、5%で metadata LV を作成しています。
ストライプ数は、vDisk 数にあわせて 6 にしています。
[root@vm01 ~]# lvcreate -n data -i6 -l 95%VG direct-lvm Using default stripesize 64.00 KiB. Logical volume "data" created. [root@vm01 ~]# lvcreate -n metadata -i6 -l 5%VG direct-lvm Using default stripesize 64.00 KiB. Logical volume "metadata" created.
ストライプ数 6 の LV ができました。
[root@vm01 ~]# lvs direct-lvm --segments LV VG Attr #Str Type SSize data direct-lvm -wi-ao---- 6 striped 265.41g metadata direct-lvm -wi-ao---- 6 striped 13.97g
作成した LV を Docker のストレージとして利用するため、
/etc/sysconfig/docker-storage ファイルを編集します。
DOCKER_STORAGE_OPTIONSには、3つオプションを指定しています。
--storage-opt dm.datadev=/dev/direct-lvm/data
--storage-opt dm.metadatadev=/dev/direct-lvm/metadata
--storage-opt dm.fs=xfs
/etc/sysconfig/docker-storage ファイルを編集します。
DOCKER_STORAGE_OPTIONSには、3つオプションを指定しています。
--storage-opt dm.datadev=/dev/direct-lvm/data
--storage-opt dm.metadatadev=/dev/direct-lvm/metadata
--storage-opt dm.fs=xfs
[root@vm01 ~]# vi /etc/sysconfig/docker-storage [root@vm01 ~]# grep ^DOCKER_STORAGE_OPTIONS /etc/sysconfig/docker-storage DOCKER_STORAGE_OPTIONS=--storage-opt dm.datadev=/dev/direct-lvm/data --storage-opt dm.metadatadev=/dev/direct-lvm/metadata --storage-opt dm.fs=xfs
Docker のサービスを起動すると、イメージストアが初期化されます。
[root@vm01 ~]# systemctl start docker [root@vm01 ~]# ls -l /var/lib/docker/ total 12 drwx------. 2 root root 6 Jan 31 14:34 containers drwx------. 3 root root 21 Jan 31 14:33 devicemapper drwx------. 2 root root 6 Jan 31 14:34 graph -rw-r--r--. 1 root root 5120 Jan 31 14:34 linkgraph.db drwxr-x---. 3 root root 18 Jan 31 14:34 network -rw-------. 1 root root 19 Jan 31 14:34 repositories-devicemapper drwx------. 2 root root 6 Jan 31 14:34 tmp drwx------. 2 root root 6 Jan 31 14:34 trust drwx------. 2 root root 6 Jan 31 14:34 volumes
direct-lvm な、/dev/direct-lvm/data、/dev/direct-lvm/metadata が
Docker のイメージストアとして認識されました。
[root@vm01 ~]# docker info Containers: 0 Images: 0 Server Version: 1.9.1 Storage Driver: devicemapper Pool Name: docker-251:0-4514767-pool Pool Blocksize: 65.54 kB Base Device Size: 107.4 GB Backing Filesystem: xfs Data file: /dev/direct-lvm/data Metadata file: /dev/direct-lvm/metadata Data Space Used: 53.67 MB Data Space Total: 285 GB Data Space Available: 284.9 GB Metadata Space Used: 2.085 MB Metadata Space Total: 15 GB Metadata Space Available: 15 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Library Version: 1.02.107-RHEL7 (2015-10-14) Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 4.1.12-32.1.2.el7uek.x86_64 Operating System: Oracle Linux Server 7.2 CPUs: 1 Total Memory: 991 MiB Name: vm01 ID: 264Z:SS76:ZFJQ:NNOW:F3BS:5DJ4:WSKJ:BWHX:UPE2:5ZIS:F3R4:7CZ4
とりあえず、Docker コンテナ起動。
ドキュメントでは Dockerfile で build していますが、
ここでは Docker Hub オフィシャルのイメージを pull しました。
ドキュメントでは Dockerfile で build していますが、
ここでは Docker Hub オフィシャルのイメージを pull しました。
[root@vm01 ~]# docker run -d --name=web01 -p 80:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx dbacfa057b30: Pull complete 7a01cc5f27b1: Pull complete 104c4623b777: Pull complete 69dae048f762: Pull complete 4ceb6d63a417: Pull complete f9eccb0773ba: Pull complete 3fccd2a0664c: Pull complete 1a908c5b60b5: Pull complete Digest: sha256:98347b2021741be3e2de82b21efeb5cbe713420e63d9345835ec9f12ebc7177d Status: Downloaded newer image for nginx:latest f5b55f1dd2b1044721a0954f1e161b216b86eb137ca91419f9a3a47bfb11607c [root@vm01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5b55f1dd2b1 nginx "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 443/tcp web01
とりあえず Nginx コンテナが起動されました。
curl で「Welcome to nginx!」ページが取得できます。
curl で「Welcome to nginx!」ページが取得できます。
[root@vm01 ~]# curl http://localhost:80/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Docker host VM に 6つの vDisk を接続してストライピングしている意味合いは、
正直まだわかりません・・・1つでもいいような気もします。
正直まだわかりません・・・1つでもいいような気もします。
以上。