NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix Acropolis Hypervisor の Docker Best Practices Guide を試してみる。

最近 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 として認識されました。
[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 にしています。
[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
[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 しました。
[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!」ページが取得できます。
[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つでもいいような気もします。
 
以上。