Dockerを本番環境で使う機会を今か今かと待ちわびているエンジニアの九岡です。今回は、先日参加したAWS re:Invent 2015で知った、Dockerボリュームを透過的にEBSでポータブルにするFlockerというOSSについて調べてみました。
TL;DR;
- Dockerのデータボリュームをホスト間で移動させる/ステートフルなDockerコンテナを別ホストへ移動させたりするのに便利
- AWS ECSには未対応(´・ω・`)
Docker Volumeの永続化について
Dockerのデータボリュームは通常、Dockerホストが削除されると消えてしまいます。ステートフルなDockerコンテナをホスト間で移動させたり、ボリュームのバックアップをとったりリストアしたりするためには、Dockerの外でスクリプトなどの作り込みが必要になります。EC2上でやるなら、EBSボリュームのプールから必要なものをマウントして、それをデータボリュームとしてDockerに使わせるようなスクリプトを書くとか。でも、面倒ですよね。
Docker 1.8からVolume Pluginが追加されて、上記のようなことをスクリプトではなく、Dockerのプラグインレベルで行えるようになりました。データボリュームの移動やバックアップ・リストアをしたいという目的に照らし合わせると、スクリプトでやるかプラグインでやるかは単に実装の違いですが、プラグインの方は必要とする機能をDocker利用者から透過的に提供できる、などのメリットはありそうです。
Flocker
DockerのデータボリュームをポータブルにするためのOSSです。Flocker AgentとFlocker Control Serviceで構成されています。
Flocker AgentはDockerホストで動くデーモンでもあり、Docker Volume Pluginでもあります。 Flocker Control Serviceは、Dockerホストとは別のmaster的なノード(Swarmを使う場合はSwarm masterに同居させる構成がFlockerのドキュメントで紹介されています)で動くデーモンで、Flockerクラスタ内部向けのAPIや、Flockerを外部からコントロールするためのWeb API、Flockerクラスタの設定を保存するためのストレージ、などの機能を提供します。
制限
現状は素のDockerやCompose、Swarmなどに対応していますが、Amazon ECSには対応していません(re:Inventで話したCloudHQブースの方は「組み合わせられる」と言っていた気がするけど…)。 ECSではDockerのVolume Driverを指定することができないので、必然的にFlocker Docker Pluginも使えないからです。
re:InventでComposeに対応したecs-cliが発表されました。FlockerはComposeに対応しているので、ecs-cliからならFlockerを使えるのでは?と思うかもしれませんが、無理です。ecs-cliはdocker-compose.ymlをECSのTask Definitionに変換してECSに渡すことでComposeに対応をしていますが、結局ECSがDocker Volume Pluginに対応していないためです。
似ているOSS
"A Docker volume plugin, managing persistent container volumes."を標榜しているConvoyというOSSがあります。 Device Mapper、NFS、EBSをバックエンドに選べるDockerのVolume DriverとCLIの組み合わせとして提供されています。CLIを使うと、Convoyで管理しているボリュームをNFSやS3などにバックアップしたり、復元したりすることができます。
ただし、Flockerとは違ってComposeやSwarm等への対応はしていません。Flockerと同じ理由で、ECSにも対応していません。
まとめ
Dockerのデータボリュームについて、またそれをポータブルにするFlockerというOSSについて調査してみました。 ECSに対応したら試してみたいですね!