Private Docker Registryを冗長化するためのDockerイメージ

前回、Private Docker Registryを立てる話を書きましたが、冗長構成じゃなかったのでしてみたって話。

stormcat.hatenablog.com

冗長構成用のDockerイメージ

レジストリのDockerイメージに公式のlibrary/registryを使っていて、イメージの保存先はS3にすれば並列にすれば冗長化できだろと高をくくってましたが、こいつが地味にインデックスデータストアとしてsqliteを使ってるという罠に気づいたわけです。

じゃあどうすればよいかというと簡単に言うと、

  • Dockerレジストリの実装としては色々な種類のDBに対応してるので向き先を変えれば良い。AWSを利用してるのでRDSのMulti-AZ構成でMySQLを用意する
  • インデックスDBとして利用するMySQLの情報をdocker runの変数(ECSだとTask Definitionsの変数)に差し込めるようにする

となります。しかし、library/registryにはPythonMySQLのドライバが入っていなくて動かないってのがわかり、DockerHub漁ったらMySQL対応したRegistryのイメージがあったのでこれを使います。

registry.hub.docker.com

このイメージを利用して、Docker起動時の環境変数として、SQLALCHEMY_INDEX_DATABASEを加えてやります。今回はMySQLなので以下のような設定に。

SQLALCHEMY_INDEX_DATABASE=mysql://username:password@rdshost/schema
SEARCH_BACKEND=sqlalchemy

レジストリはORMとしてSQLAlchemyを使ってるので、SEARCH_BACKENDはsqlalchemyが前提ですね。

ELBにぶらさげる

あとはELBにぶらさげれば完了です。今のプロジェクトではECS構成で作ったので

  • ECS Clusterにap-northeast-1a/ap-northeast-1cに属するEC2インスタンスをジョインさせる
  • クラスタの利用可能リソースからDesired Countを決める。今回は2インスタンスのリソースをフルフル使い、Desired Count=2にした。こうすれば、ECS Agentが常に2つのタスクを走らせてくれるように制御してくれる
  • 2つのインスタンスにELBを振り分ける

今回はとりあえずここまでしました。ClusterのEC2インスタンスをAutoScaleグループで構成すれば、さらに可用性が増します。