はじめに
Azureでコンテナ運用をする場合選択肢として
(1)イメージを直接実行するサービス
- azure k8s
- azure container instance
- azure container apps
- azure app services for container
(2)VMにdockerを導入してコンテナー実行
と考えられます。今回は、システムの規模感、月額費用、運用スキルの学習コストなどの要件で、(2)構成を選んだ場合のお話になります
dockerで永続化したいデータをどこに配置するか検討の余地がありますが、永続化データをAzure Filesに配置すると、データ量の増加やコンテナ実行するVM追加の容易さなど、拡張性についてメリットがあります。
docker volumeについて
dockerで永続化したいデータの保管先としては
(1)bind mountにより、dockerデーモンを実行するホストOS上の任意のディレクトリーをコンテナー内にマウント
(2)docker voluneを利用し、永続化するデータを、ボリュームという単位にカプセル化して取り扱う
の選択肢があります。
(2)の場合、永続化データはdocker上でボリュームとして管理されることで、明示的にコンテナーから永続化データを取り扱うことになり、運用時の操作ミス(取り違え)などのリスクが低減されるメリットがあるので、こちらを採用することにします。
Azure Filesについて
Azure Filesは、マネージドNASのサービスとなります。以下のようにいくつかグレードがあります
performance | tiar | 想定される用途 | ベースラインIOPS | SMB | NFS | |
Premium | SSD | ー | アプリケーションの作業フォルダーやDBファイルなど、高パフォーマンスが要求されるもの | 3000 + GB数 | サポート | サポートしない |
Standard | HDD | transaction | コスト要件もあるが、高頻度アクセスが想定されるデータなど | サポート | サポート | |
hot | データ保管用途 | |||||
cool | アクセスが少ないデータ保管用途 |
ホストOS(Linux)から、Azure FilesをCIFSプロトコルでマウントした場合は、POSIX準拠のuid、gid、パーミッションがサポートされません。そのため、すべてのディレクトリとファイルが、mountオプションで指定したものとなってしまいます。
今回は、docker volumeの配置先として、POSIX準拠のパーミッションをサポートしている必要があるため、ホストOS(Linux)から、Azure FilesをNFS4.1プロトコルにてマウントを行いたいという要件があり、Premiumを選択します。
構築(1)
ストレージ アカウントの 追加をします
「Premiumアカウントの種類」は、「ファイル共有」を選択します
「REST API操作の安全な転送を必須にする」のチェックを外します。
上記以外については、デフォルト設定ですすめます。(セキュリティ要件などの必要に応じて、適宜変更を加えます)
作成されたストレージアカウントを開きます。左側のサイドメニューから「ファイル共有」を選びます。
「ファイル共有の追加」をクリックします
共有名、サイズを入力し、プロトコルでNFSを選択します
作成されたファイル共有を開くと、接続に必要な手順、mountコマンドのサンプルがありますので、メモしておきます
構築(2)
ホストOS上で以下のコマンドを実行し、nfsクライアント機能を有効化します
sudo apt-get -y update
sudo apt-get install nfs-common
テストとして、/mntに手動でマウントしてみます
sudo mount -t nfs [ストレージアカウント名].file.core.windows.net:/[ストレージアカウント名]/[共有名] /mnt/ -o vers=4,minorversion=1,sec=sys,nconnect=4
うまくマウントできたか、ファイルを作ってみます
touch /mnt/testfile
アンマウントします
umount /mnt
構築(3)
すでに、dockerは導入済みの想定をしています
そこに、docker volumeが配置されるディレクトリーに、先ほどのAzure Files共有が、起動時にマウントするように設定します
dockerデーモンが起動していると、関連するディレクトリーに対する操作ができないので、停止します
systemctl stop docker
既存のディレクトリーをリネームして予備として残しておき、新しくマウントポイントとなるディレクトリーを作成します
sudo mv /var/lib/docker/volumes /var/lib/docker/volumes.bak
sudo mkdir /var/lib/docker/volumes
sudo chmod 701 /var/lib/docker/volumes
/etc/fstabに、以下の内容を追記します
[ストレージアカウント名].file.core.windows.net:/[ストレージアカウント名]/[共有名] /var/lib/docker/volumes nfs4 vers=4,minorversion=1,_netdev,sync,soft,timeo=30,retrans=3,rsize=1048576,wsize=1048576,sec=sys,nconnect=4 0 0
正常にマウントされるかテストします
mount -a
ls -l /var/lib/docker/volumes
既存ディレクトリにあった内容をコピーします。
sudo cp -a /var/lib/docker/volumes.bak/* /var/lib/docker/volumes/
この際、ブロックデバイスファイルがコピーできない旨のエラーは無視します。
構築(4)
最後にdockerデーモンを起動し、docker volumeの操作ができるか確認します
systemctl start docker
docker volumeを作成する
docker volume create test-volume
docker volumeを確認する
docker volume ls
docker volume inspect test-volume
docker volumeを削除する
docker volume rm test-volume
以上で完了です。