Docker for AWSの永続ストレージプラグインCloudstorでEFSをマウント

  • 4
    いいね
  • 0
    コメント

Docker for AWS(以下D4a)はGAの際、永続化ストレージをサポートするCloudstorというプラグインを添付するようになりました。

https://docs.docker.com/docker-for-aws/persistent-data-volumes/

D4aの17.06.0-ceでどのように使うのか試して見たので使用感など。

Cloudstorがサポートするストレージのタイプ

  • EBSにデバイスを作成してマウント
    • k8sでのPersistent Volumesのような感じ。
    • 複数コンテナからの同時利用ははなし。
  • EFSで任意のディレクトリをマウント
    • 対象のEFSはテンプレートパラメータで自動作成。
    • dockerdが環境変数EFS_ID_REGULAR, EFS_ID_MAXIOで対象を決めるので、一応既存のEFSも使えなくはない。
    • 複数コンテナからの同時利用OK。

つかってみる

ドキュメントではswarmモード(service)での使い方しか出ていませんが、単発のdocker runでも普通に機能します。

次のようにvolume-driverにcloudstor:awsを指定、デフォルトはEFS。

$ docker run -it --rm \
  --volume-driver=cloudstor:aws \
  -v sharedvol1:/shareddata \
  alpine:latest

これで、EFSにsharedvol1ディレクトリが作成され、Dockerコンテナからは/shareddataで参照できます。

EFS側に親ディレクトリがない場合もソース指定可能です。

$ docker run -it --rm \
  --volume-driver=cloudstor:aws \
  -v sharedvol5/1/2/3:/shareddata \
  alpine:latest touch /shareddata/touchfile

この場合、Dockerコンテナ起動時にEFSに対してsharedvol5/1/2/3というディレクトリを作ります。

なおマウント時にサブディレクトリを指定した場合も、VOLUME名はトップのディレクトリが使われます。

$ docker volume ls
DRIVER              VOLUME NAME
cloudstor:aws       sharedvol1
cloudstor:aws       sharedvol2
cloudstor:aws       sharedvol5
local               sshkey

挙動はこんな感じです。基本的にはdocker service/volumeで作成し、全ノードで参照できるようにしておくとよいでしょう。

このとき、EFSの中身

他のEC2インスタンスから/mnt/efsにEFSをマウントして、中の様子を見てみます。
VOLUME名のディレクトリが作られているだけでした。シンプルですね。

$ find /mnt/efs
/mnt/efs
/mnt/efs/sharedvol2
/mnt/efs/sharedvol1
/mnt/efs/sharedvol1/testfile
/mnt/efs/sharedvol5
/mnt/efs/sharedvol5/1
/mnt/efs/sharedvol5/1/2
/mnt/efs/sharedvol5/1/2/3/touchfile
/mnt/efs/fs-ef07xxxx:sharedvol1

一番下にあるやつは、EFSのID指定できないかなと考えたけど、とりあえずやってみて失敗に終わったディレクトリです。
Cloudstorはソースが非公開なので、-v fs-ef07xxxx:sharedvol1:/shareddataなどと実行したらこんなことに。

docker volume rm で、データも消える

volumeの詳細をチェック。

$ docker volume inspect sharedvol5
[
    {
        "Driver": "cloudstor:aws",
        "Labels": null,
        "Mountpoint": "/mnt/efs/reg/sharedvol5",
        "Name": "sharedvol5",
        "Options": {},
        "Scope": "local"
    }
]

いたって普通です。EFSレギュラー/MAXIO用の親ディレクトリを作り、そこにマウントと。
D4aではちょっとわからないけども、ホストから見るとEFSをマウントしっぱなのでしょうね。

最後に消したらどうなるのかと、docker volume rm sharedvol5してみました。
まずdocker管理下のvolumeは消えます、そしてEFS側も綺麗さっぱりです。

# 他インスタンスからEFSの中身を参照
$ find /mnt/efs
/mnt/efs
/mnt/efs/sharedvol2
/mnt/efs/sharedvol1
/mnt/efs/sharedvol1/testfile
/mnt/efs/fs-ef07xxxx:sharedvol1

ここ連動して消えちゃうのか。。Docker視点ならそれでよいけど、コンフィグの共有とかでマウントするとかのNFSな視点だと違和感はあります。
マウントが外れるだけという選択肢があってもよいとおもって、フォーラムに投稿しておきました。

終わりに

Docker Swarmが安定していればこの作りでも維持していけそうな気はしますが、なんだかんだでまだ不安定になったりします。
なにか手当をして回復するよりたいてい作り直した方が早いのですが、そういう運用ではvolumeのエントリーが巻き込まれてデータを消しそうな予感がしているため、(自分の用途では)フィードバックしつつもう少し様子見かなあ。

EBSも少しだけ触って見る

volume-optにbacking=relocatableを渡すと単体コンテナ用のEBSボリュームを作れます。

$ docker volume create -d cloudstor:aws \
  --opt backing=relocatable \
  --opt size=8 ebs1

=> ebs1

コマンド実行すると、ちゃんとEBSができていました。最初の紹介の通り、k8sのpvみたい。
こちらもdocker volume rm ebs1などとすると、EBSごと消えます。