docker volumeを、Azure Filesに配置する話


はじめに

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のサービスとなります。以下のようにいくつかグレードがあります

performancetiar想定される用途ベースラインIOPSSMBNFS
PremiumSSDアプリケーションの作業フォルダーやDBファイルなど、高パフォーマンスが要求されるもの3000 + GB数サポートサポートしない
StandardHDDtransactionコスト要件もあるが、高頻度アクセスが想定されるデータなどサポートサポート
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

以上で完了です。