2017年3月16日木曜日

docker のデータボリュームの領域を s3 として使用する方法

概要

これまでにコンテナでデータボリュームを使用する方法として

  1. 単独でデータボリュームを作成する方法
  2. 別のコンテナの領域をデータボリュームとして利用する方法
  3. ホストマシンの領域をデータボリュームとして利用する方法

を紹介しました
今回は s3 の領域をデータボリュームとして利用する方法を紹介します

環境

  • Mac OS X 10.12.3
  • Docker on Mac 17.03.0-ce, build 60ccb22
  • goofys 0.0.9

goofys のインストール

  • brew tap homebrew/fuse
  • brew cask install osxfuse
  • brew install goofys

.aws/credentials などの設定は事前に行っておいてください
また us-east-1 に適当にバケットを作成しておいてください
今回は「c1-bd10c735e495」とします

データボリューム領域の追加

事前に Docker on Mac の設定で /data-volume をデータボリューム領域として追加しておきます
Preferences から File Sharing で「/data-volume」を追加します
docker_datavolume_s3.png

s3 のマウント

  • sudo mkdir /data-volume
  • sudo chown -R kakakikikeke:staff /data-volume/
  • goofys c1-bd10c735e495 /data-volume
  • df -h
c1-bd10c735e495  1.0Pi    0Bi  1.0Pi     0%       0 1000000000    0%   /data-volume

こんな感じでマウントできれば OK です
試しにファイルを作成してバケット上にもファイルができるか確認してみてください
アンマウントする場合は

  • umount /data-volume

で OK です

データボリュームとしてコンテナで使ってみる

  • cd /data-volume
  • docker run --name c1 -p 8080:80 -v $(pwd):/test-volume nginx

でコンテナを起動しましょう
そして

  • docker exec -it c1 /bin/bash

でログインして

  • ls /test-volume

すると s3 にあるオブジェクトを確認できると思います
ただ、コンテナから

  • echo fuga > /test-volume/fuga

という感じでデータボリューム領域に書き込もうとしても「bash: fuga: No such file or directory」と怒られてしまいました
なので

s3 -> file -> container

の GET の流れはうまく行ったのですが

container -> file -> s3

の POST の流れはうまく行きませんでした

最後に

データボリュームで s3 を使う方法を紹介しました
ホストマシン側で s3 をマウントしその領域をコンテナのデータボリュームとして利用しています

結果として GET の流れはコンテナ上でもできたのですが、POST の流れはコンテナからはできませんでした
(環境依存という可能性もありますが、、)
これを試していて思ったのですが、おそらくホストでマウントした s3 を更に docker のデータボリュームとしてマウントするのではなく、コンテナはコンテナで s3 をマウントしてホストはホストで s3 をマウントするようにしたほうが良いと思いました

今回 POST ができなかった原因は不明なのですが、おそらく権限とか docker 内部のデータボリュームの流れと goofys の流れがごっちゃになってしまっているせいかなと思います
コンテナ上でも goofys 的なのを動かして s3 をマウントすることはできると思うので、そうしたほうが良いかなと思った次第です

ただ調べてみるとそれも結構大変そうであまりおすすめできる感じではありませんでした、、、
http://qiita.com/kochizufan/items/e0253eeda0cd470c6dc8

あとは「そもそも dockerd 側のデータボリュームの領域を s3 にできないのか」という疑問を抱くと思います
実は dockerd 用のデータボリューム領域には様々なプラグインが用意されています
https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

これを dockerd に組み込めばデーモン側のデータボリューム領域としてクラウドサービスなどを使うことができます
Docker on Mac の場合デフォルトで「local」というプラグインが使われています
docker info コマンドを使えば確認することができます

これまでは dockerd 周りの拡張や検証はほとんど行ってこなかったので、その辺の dockerd 周りの検証もそのうちやりたいなと思っています

参考サイト

0 件のコメント:

コメントを投稿