今回は
Docker では基本的にコンテナを削除すると一緒にデータも削除されてしまいます。
しかし、Docker Volume とよばれる仕組みを利用することで
コンテナの削除にかかわらずデータを永続化することができます。
そして vSphere 環境での Docker にその永続的なストレージ(Volume)を提供する
Project Hatchway というプロジェクトがあります。
Hatchway では Docker / Kubernetes などに、vSphere のデータストアの仮想ディスクを Volume として提供します。
https://storagehub.vmware.com/t/vsphere-storage/project-hatchway/
それでは vDVS をセットアップしてみます。
vDVS では、Docker ホストになる VM と ESXi との両方での対応が必要です。
- ESXi への VIB のインストール。
- Docker ホスト(ゲスト OS)への Docker Plugin のインストール。
今回の環境。
すでに vCenter 6.5 U1 / ESXi 6.5 U1 の環境を構築ずみです。
このクラスタの ESXi は、vSAN / NFS データストアを接続しています。
- vSAN データストア: vsanDatastore-04
- NFS データストア: ds-nfs-vmdk-01
ESXi は 2台(hv-n41 / hv-n42)あり、それぞれ VM が1台ずつ(vm41 / vm42)起動しています
今回の ESXi は、6.5 U1 です。
[root@hv-n41:~] vmware -vl
VMware ESXi 6.5.0 build-7388607
VMware ESXi 6.5.0 Update 1
Docker ホスト(ゲスト OS)は、Photon OS 2.0 にしました。
root@vm41 [ ~ ]# cat /etc/photon-release
VMware Photon OS 2.0
PHOTON_BUILD_NUMBER=304b817
root@vm41 [ ~ ]# uname -r
4.9.90-1.ph2-esx
今回の Docker バージョンは 17.06 です。
root@vm41 [ ~ ]# docker version
Client:
Version: 17.06.0-ce
API version: 1.30
Go version: go1.8.1
Git commit: 02c1d87
Built: Thu Oct 26 06:33:23 2017
OS/Arch: linux/amd64
Server:
Version: 17.06.0-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.1
Git commit: 02c1d87
Built: Thu Oct 26 06:34:46 2017
OS/Arch: linux/amd64
Experimental: false
ESXi への VIB のインストール。
ESXi ホストそれぞれ(今回は 2台)で、VIB をインストールします。
vDVS の VIB は、Bintray からダウンロードできます。
最新版は下記の URL から入手できます。
https://bintray.com/vmware/vDVS/VIB/_latestVersion
今回は、Version 0.21.1 を利用します。
https://bintray.com/vmware/vDVS/VIB/0.21.1
VIB のオフラインバンドルは、vSAN データストアに配置しました。
vSAN データストアに osfs-mkdir コマンドでディレクトリを作成して・・・
[root@hv-n41:~] /usr/lib/vmware/osfs/bin/osfs-mkdir /vmfs/volumes/vsanDatastore-04/vib
VIB のオフラインバンドル「VDVS_driver-0.21.1-offline_bundle-7812185.zip」を配置してあります。
VIB の名前は「esx-vmdkops-service」になっています。
[root@hv-n41:~] ls /vmfs/volumes/vsanDatastore-04/vib
VDVS_driver-0.21.1-offline_bundle-7812185.zip
[root@hv-n41:~] esxcli software sources vib list -d /vmfs/volumes/vsanDatastore-04/vib/VDVS_driver-0.21.1-offline_bundle-7812185.zip
Name Version Vendor Creation Date Acceptance Level Status
------------------- ------------------ ------ ------------- ---------------- ------
esx-vmdkops-service 0.21.c420818-0.0.1 VMWare 2018-02-13 VMwareAccepted New
esxcli でインストールします。
[root@hv-n41:~] esxcli software vib install -d /vmfs/volumes/vsanDatastore-04/vib/VDVS_driver-0.21.1-offline_bundle-7812185.zip
Installation Result
Message: Operation finished successfully.
Reboot Required: false
VIBs Installed: VMWare_bootbank_esx-vmdkops-service_0.21.c420818-0.0.1
VIBs Removed:
VIBs Skipped:
インストールした VIB の情報です。
[root@hv-n41:~] esxcli software vib get -n esx-vmdkops-service
VMWare_bootbank_esx-vmdkops-service_0.21.c420818-0.0.1
Name: esx-vmdkops-service
Version: 0.21.c420818-0.0.1
Type: bootbank
Vendor: VMWare
Acceptance Level: VMwareAccepted
Summary: [Fling] ESX-side daemon supporting basic VMDK operations requested by a guest
Description: Executes VMDK operations requested by an in-the-guest application.
ReferenceURLs:
Creation Date: 2018-02-13
Depends: esx-version >= 6.0.0
Conflicts:
Replaces:
Provides:
Maintenance Mode Required: False
Hardware Platforms Required:
Live Install Allowed: True
Live Remove Allowed: True
Stateless Ready: False
Overlay: False
Tags:
Payloads: vmdkops
hostd を再起動しておきます。
[root@hv-n41:~] /etc/init.d/hostd restart
watchdog-hostd: Terminating watchdog process with PID 67445
hostd stopped.
hostd started.
Docker ホスト(ゲスト OS)への Docker Plugin のインストール。
Dcoker ホストそれぞれ(今回は 2台)に、Docker Plugin をインストールします。
はじめは、Docker Plugin が登録されていない状態です。
root@vm41 [ ~ ]# docker plugin ls
ID NAME DESCRIPTION ENABLED
root@vm41 [ ~ ]#
Docker Plugin は、Docker Store からインストールします。
root@vm41 [ ~ ]# docker plugin install --grant-all-permissions --alias vsphere vmware/vsphere-storage-for-docker:latest
latest: Pulling from vmware/vsphere-storage-for-docker
05da47b7b6ce: Download complete
Digest: sha256:a20bcdfef99ebf017bf3cabd815f256430bf56d8cb7881048150e7c918e0c4c6
Status: Downloaded newer image for vmware/vsphere-storage-for-docker:latest
Installed plugin vmware/vsphere-storage-for-docker:latest
Plugin がインストールされました。
root@vm41 [ ~ ]# docker plugin ls
ID NAME DESCRIPTION ENABLED
5bb66ae50bbd vsphere:latest VMWare vSphere Docker Volume plugin true
設定ファイルを作成しておきます。
内容は主にログ出力設定ですが、このファイルがなくてもとりあえず vDVS はログ出力します。
cat << EOF > /etc/vsphere-storage-for-docker.conf
{
"Driver": "vsphere",
"MaxLogAgeDays": 28,
"MaxLogFiles": 10,
"MaxLogSizeMb": 10,
"LogPath": "/var/log/vsphere-storage-for-docker.log",
"LogLevel": "info",
"GroupID": "root"
}
EOF
Volume を利用してみる。
1台目の Docker ホスト「vm41」で、Docker Volume を作成してみます。
docker volume create コマンドで vsphere ドライバを指定して、ボリュームを作成します。
今回の環境では vSAN と NFS のデータストアがありますが、特にデータストアを作成しない場合は
vSAN データストアにボリュームが作成されました。
root@vm41 [ ~ ]# docker volume create --driver=vsphere --name=vol01 -o size=1gb
vol01
root@vm41 [ ~ ]# docker volume ls
DRIVER VOLUME NAME
vsphere:latest vol01@vsanDatastore-04
NFS データストアを指定して、ボリュームを作成してみます。
root@vm41 [ ~ ]# docker volume create --driver=vsphere --name=vol02@ds-nfs-vmdk-01 -o size=1gb
vol02@ds-nfs-vmdk-01
root@vm41 [ ~ ]# docker volume ls
DRIVER VOLUME NAME
vsphere:latest vol01@vsanDatastore-04
vsphere:latest vol02@ds-nfs-vmdk-01
それぞれのデータストアにファイルが作成されています。
[root@hv-n41:~] ls -l /vmfs/volumes/vsanDatastore-04/dockvols/_DEFAULT/
total 8
-rw------- 1 root root 4096 Apr 16 16:52 vol01-1d8b22d5cfe8e28a.vmfd
-rw------- 1 root root 586 Apr 16 16:52 vol01.vmdk
[root@hv-n41:~] ls -l /vmfs/volumes/ds-nfs-vmdk-01/dockvols/_DEFAULT/
total 33436
-rw------- 1 root root 4096 Apr 16 17:06 vol02-256a299ab1ad11b3.vmfd
-rw------- 1 root root 1073741824 Apr 16 17:06 vol02-flat.vmdk
-rw------- 1 root root 558 Apr 16 17:06 vol02.vmdk
vSAN データストアに作成された Volume を接続して、コンテナを起動してみます。
コンテナ イメージは Docker Hub オフィシャルの Photon OS のイメージです。
ボリューム「vol01」は、/dir01 ディレクトリにマウントします。
root@vm41 [ ~ ]# docker container run -it -v vol01@vsanDatastore-04:/dir01 photon
root [ / ]# uname -n
e58556770d1b
root [ / ]# cat /etc/photon-release
VMware Photon OS 2.0
PHOTON_BUILD_NUMBER=304b817
コンテナの中での df コマンドで、ボリュームが接続されていことがわかります。
root [ / ]# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 16G 420M 15G 3% /
tmpfs 122M 0 122M 0% /dev
tmpfs 122M 0 122M 0% /sys/fs/cgroup
/dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:1:0 976M 2.5M 973M 1% /dir01
/dev/root 16G 420M 15G 3% /etc/resolv.conf
shm 64M 0 64M 0% /dev/shm
tmpfs 122M 0 122M 0% /sys/firmware
ためしに、Volume をマウントしたディレクトリ /dir01 に適当なデータを書き込んでおきます。
root [ / ]# echo "yo-soro-!" > /dir01/test.f
root [ / ]# cat /dir01/test.f
yo-soro-!
コンテナを抜けて、Docker ホストに戻ります。
Volume は、Docker ホストに /dev/sdb として接続されています。
root@vm41 [ ~ ]# LANG=C lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 16G 0 disk
|-sda1 8:1 0 3M 0 part
`-sda2 8:2 0 16G 0 part /
sdb 8:16 0 1G 0 disk /var/lib/docker/plugins/5bb66ae50bbdd237a3205a6051e6f51c88042f1a71c44e49170fef601d9ab9ab/propagated-mount/vol01@vsanDatastore-04
sr0 11:0 1 1024M 0 rom
VM から見ても、Docker Volume にあたる「ハード ディスク 2」が
vSAN データストアにあることがわかります。
「仮想マシン ストレージ ポリシー」は Volume 作成時に
指定していないので空欄になっています。
別の Docker ホストでの Volume 利用。
コンテナを削除しても、Volume が消えない様子を確認してみます。
まず、これまで Volume を利用していた Docker コンテナを削除します。
root@vm41 [ ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58556770d1b photon "/bin/bash" 11 minutes ago Up 11 minutes determined_khorana
root@vm41 [ ~ ]# docker container rm -f e58556770d1b
e58556770d1b
root@vm41 [ ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@vm41 [ ~ ]#
Docker ホストの VM から、Volume にあたる「ハード ディスク 2」が切断されました。
vm41 には、「ハード ディスク 1」だけが残っています。
そして、別の ESXi で起動している Docker ホストで
先ほどの Volume「vol01」を接続したコンテナを起動してみます。
Docker ホスト「vm42」でも、vDVS の Docker Plugin はインストールずみです。
root@vm42 [ ~ ]# docker plugin ls
ID NAME DESCRIPTION ENABLED
3e561e744610 vsphere:latest VMWare vSphere Docker Volume plugin true
この Docker ホストでも、vm41 で作成した Volume が見えます。
root@vm42 [ ~ ]# docker volume ls
DRIVER VOLUME NAME
vsphere:latest vol01@vsanDatastore-04
vsphere:latest vol02@ds-nfs-vmdk-01
Volume「vol01」を接続して、コンテナを起動します。
Volume はコンテナとは独立してデータが永続化されているので、
先ほど Volume に作成したファイルが残っています。
root@vm42 [ ~ ]# docker container run -it -v vol01@vsanDatastore-04:/dir01 photon
Unable to find image 'photon:latest' locally
latest: Pulling from library/photon
d3603a6287f0: Pull complete
Digest: sha256:9cdad7d78710eed3dd4fc5e565bf783aec99ece689d8ab9771b629fd4e5d0ed1
Status: Downloaded newer image for photon:latest
root [ / ]# uname -n
cd2ba7d55444
root [ / ]# cat /dir01/test.f
yo-soro-!
このように vDVS では、コンテナで利用するデータを永続化して、
別の ESXi で起動する Docker ホスト(の VM)でもデータを利用することができます。
そして VMFS / NFS / vSAN といった、どのデータストアでも同様に Docker Volume を作成できます。
以上、vDVS を使用してみる話でした。