前回に引き続き、プライベートレジストリです。
前回の方法では、レジストリのコンテナを載せたサーバー自体が落ちてしまったときに登録されたコンテナイメージが全てなくなってしまいます。
dockerのregistryコンテナには、設定ファイルが存在し、永続化のオプションとしてバックエンドにS3を使うことができます。
それでは早速試してみます。
レジストリ側の設定
レジストリのコンテナをbashで起動します。
$ docker run -t -i registry /bin/bash
レジストリに入ったら設定ファイルがある/docker-registry/config/フォルダに移動します。
S3用のサンプルがあるのでそれをconfig.ymlとして使います。
dockerのレジストリでは設定ファイルに_env:VARIABLENAMEとなっている部分があり、環境変数をセットしている部分です。起動時に-eオプションでその環境変数をコンテナに渡すことが出来ます。
このS3用のファイルは、AWSキーやバケット名などに環境変数をセットできるようになっているので起動時にパラメータ渡しが可能です。今回はそのまま変更なしで使います。
# cd /docker-registry/config # mv config.yml config.yml.org # cp config_s3.yml config.yml # cat config.yml ~(略)~ prod: storage: s3 boto_bucket: _env:AWS_BUCKET s3_access_key: _env:AWS_KEY s3_secret_key: _env:AWS_SECRET s3_bucket: _env:AWS_BUCKET s3_encrypt: true s3_secure: true secret_key: REPLACEME s3_encrypt: true s3_secure: true storage_path: /images
接続を終了し、コミットします。
# exit; # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e1e890b9647 registry:0.6.5 /bin/bash 6 minutes ago Exit 0 grave_wozniak # docker commit 1e1e890b9647 memorycraft/registry
コミットしたS3用のレジストリイメージを起動します。その際前述のように、-eオプションでAWSキーやバケット名などを環境変数として渡します。
また、SETTINGS_FLAVOR環境変数は、config.ymlのprodと対応しています。これによって設定ファイルの各モードを起動時に選択することができます。
# docker run -p 5000:5000 -e SETTINGS_FLAVOR=prod -e AWS_KEY=XXXXXXX -e AWS_SECRET=YYYYYYYYY -e AWS_BUCKET=memorycraft-docker-registry -d memorycraft/registry # # # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e1e890b9647 registry:0.6.5 /bin/bash 6 minutes ago Exit 0 grave_wozniak 413aa68a3ad1 memorycraft/registry:latest /docker-registry/run 9 hours ago Up 9 hours 0.0.0.0:5000->5000/tcp prickly_davinci
これで、S3対応のレジストリができました。
S3レジストリへの登録
それではクライアント側からこのレジストリにpushしてみます。流れは前回の記事と同じです。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee60c633c8f9 memorycraft/centos:latest /usr/bin/supervisord 3 days ago Up 3 days 0.0.0.0:49189->22/tcp, 0.0.0.0:49190->80/tcp happy_brattain c118bcc97b1e 539c0211cd76 /bin/bash 5 days ago Exit 0 # docker commit ee60c633c8f9 176.34.16.242:5000/memorycraft/centos b939188f4672b83d03e90ad12c4ad9e2ccdfa66d2f50fd44ae18ef314eee5c5b # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 176.34.16.242:5000/memorycraft/centos latest b939188f4672 14 seconds ago 443.8 MB memorycraft/centos latest d0c94b943ba2 4 days ago 437.9 MB # docker push 176.34.16.242:5000/memorycraft/centos The push refers to a repository [176.34.16.242:5000/memorycraft/centos] (len: 1) Sending image list Pushing repository 176.34.16.242:5000/memorycraft/centos (1 tags) 539c0211cd76: Image successfully pushed 380423464fbc: Image successfully pushed dc52da789c75: Image successfully pushed b2ab60219415: Image successfully pushed 52b555115035: Image successfully pushed a149f9038d0e: Image successfully pushed 3897f6889349: Image successfully pushed bd1a450e0e46: Image successfully pushed da6f1a424b7c: Image successfully pushed 4a8d2a1dab88: Image successfully pushed af06476dc08c: Image successfully pushed 65ec465a844b: Image successfully pushed 318326461017: Image successfully pushed fc6935aadec7: Image successfully pushed 9022a04f5b3f: Image successfully pushed 4787e46941f7: Image successfully pushed 30f9368972bb: Image successfully pushed dc6de6feb9a9: Image successfully pushed d0c94b943ba2: Image successfully pushed b939188f4672: Image successfully pushed Pushing tags for rev [b939188f4672] on {http://176.34.16.242:5000/v1/repositories/memorycraft/centos/tags/latest}
無事にpushできたようです。
それではS3バケットを覗いてみると、リポジトリのメタデータやイメージなどがアップされているのがわかります。
レジストリを消してみる
ここで、一度、レジストリ側のサーバーが壊れてしまった。もしくはインスタンスが消えてしまった場合を想定して、0から別のサーバーにレジストリを立てて見たいと思います。
# docker run -t -i registry /bin/bash # cd /docker-registry/config # mv config.yml config.yml.org # cp config_s3.yml config.yml # cat config.yml # exit # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 927bb1ccf9dc registry:0.6.5 /bin/bash About a minute ago Exit 0 trusting_mccarthy # docker commit 927bb1ccf9dc memorycraft/registry # docker run -p 5000:5000 -e SETTINGS_FLAVOR=prod -e AWS_KEY=XXXXXXXXXXXXXXXX -e AWS_SECRET=YYYYYYYYYYYYYYYY -e AWS_BUCKET=memorycraft-docker-registry -d memorycraft/registry /docker-registry/run.sh
S3からpull
念のためクライアント側もイメージもコンテナも消した状態で、S3レジストリを指定してrunしてみます。
# docker run -t -i 176.34.16.242:5000/memorycraft/centos /bin/bash Unable to find image '176.34.16.242:5000/memorycraft/centos' (tag: latest) locally Pulling repository 176.34.16.242:5000/memorycraft/centos b939188f4672: Download complete da6f1a424b7c: Download complete dc6de6feb9a9: Download complete af06476dc08c: Download complete b2ab60219415: Download complete 65ec465a844b: Download complete 4a8d2a1dab88: Download complete 3897f6889349: Download complete a149f9038d0e: Download complete 539c0211cd76: Download complete 30f9368972bb: Download complete 52b555115035: Download complete bd1a450e0e46: Download complete 318326461017: Download complete 4787e46941f7: Download complete 380423464fbc: Download complete dc52da789c75: Download complete d0c94b943ba2: Download complete 9022a04f5b3f: Download complete fc6935aadec7: Download complete bash-4.1#
ちゃんと取得できて、コンテナを立ち上げることが出来ました。
これで、S3の高い堅牢性可用性をバックエンドにしたレジストリができました。
以上です。