ようへいの日々精進XP

よかろうもん

docker-registry と Amazon S3 で作る自分だけのコンテナ倉庫(リポジトリ)

はじめに

  • コンテナイメージは index.docker.io にだけ保存出来ると思っていたら個人でもリポジトリを持てるらしい
  • しかも、コンテナイメージを Amazon S3保存出来るらしいので課金に注意しつつ*1そちらで試してみる!
  • 尚、リポジトリの環境自体もコンテナイメージで配布されているのでそちらを利用する
  • docker-registry は Gunicorn という pythonWSGI HTTP サーバーで実装されている

参考


準備

docker-registry コンテナイメージを pull してくる

せっかくなんで docker クライアント for MacOS X でやってみる。

docker pull registry

と言っても特に何が変わる訳でもない。pull が終わったら念のために docker images で確認。

registry                    0.6.3               c83860e35b87        2 days ago          486.2 MB
registry                    0.6.2               3ca16857b223        2 days ago          631.9 MB
registry                    0.6.1               66759ecd01fe        2 days ago          456.3 MB
registry                    0.6.0               b0b73ff92e85        2 days ago          631.9 MB
registry                    0.5.9               bbea61b447e3        2 days ago          631.6 MB
registry                    0.6.4               e623ba69ccc9        2 days ago          486.2 MB
registry                    latest              e623ba69ccc9        2 days ago          486.2 MB

S3 上にイメージ倉庫用バケットを作成する

これは awd-cli を使う。

aws s3api create-bucket --bucket dockercontainer

以下のようにバケット作成される。

{
    "Location": "/dockercontainer"
}

一応、確認。

aws s3api list-buckets | jq -r '.Buckets[]|select(.Name |contains("docker"))'

以下のように出力される。

{
  "Name": "dockercontainer",
  "CreationDate": "2014-01-25T09:56:47.000Z"
}

registry コンテナで S3 を利用出来るようにする

一旦、registry を起動して config.yml を修正する。

docker run -t -i registry /bin/bash

config.yml/docker-registry/config/config_s3.yml をコピーして利用する。

mv /docker-registry/config/config.yml /docker-registry/config/config.yml.original
cp /docker-registry/config/config_s3.yml /docker-registry/config/config.yml

config.ymlマニュアルに従い、以下のように設定する。

prod:
    storage: s3
    boto_bucket: dockercontainer
    s3_access_key: AK1234567890123
    s3_secret_key: ABCDEFGHIJKLMNOPQRSTUVWXYZ1
    s3_bucket: dockercontainer
    s3_encrypt: true
    s3_secure: true
    secret_key: hogehuga
    s3_encrypt: true
    s3_secure: true
    storage_path: /images

修正したらコンテナをコミットしておく。

docker commit ${CONTAINER_ID} inokappa/registry

以下のような Dockerfile を用意して docker build して良いかも。

FROM registry
#
MAINTAINER YOHEI KAWAHARA inokappa
#
ADD config_s3.yml /docker-registry/config/config.yml
#
EXPOSE 5000
CMD ["/docker-registry/run.sh"]

試してみる

構成

コンテナを起動することで以下のような構成となる。

f:id:inokara:20140126091525p:plain

registry コンテナを起動!

以下のようにして registry コンテナを起動する。

docker run -d -p 5000 -e SETTINGS_FLAVOR=prod inokappa/registry /docker-registry/run.sh

Dockerfile からビルドした場合には以下のように起動出来る。

docker run -d -p 5000 -e SETTINGS_FLAVOR=prod registry-test

起動したら念のために docker ps で確認する。

f:id:inokara:20140126084546p:plain

ゴージャスにコンテナを 2 つも起動した*2。動作確認として curl を使ってアクセスしてみる。

curl http://${DockerServer}:${BINDPORT}/

以下のように出力されればとりあえず起動はオッケー。

f:id:inokara:20140126092245p:plain

ubuntu コンテナを登録してみる

ubuntu コンテナを pull してくる。

docker pull ubuntu

docker tag でタグ付する。

docker tag ubuntu ${DockerServer}:${BINDPORT}/ubuntu

docker pull する。

docker pull ${DockerServer}:${BINDPORT}/ubuntu

以下のように S3push が開始する。

f:id:inokara:20140126094632p:plain

おお、並行して aws-cli を使って aws s3 ls を使って本当にアップロードされているかを確認する。

aws s3 ls s3://dockercontainer/images/repositories/library/

f:id:inokara:20140126095008p:plain

docker run してみる

以下のようにコンテナを起動する。

docker run -i -t ${DockerServer}:${BINDPORT}/ubuntu /bin/bash

起動したコンテナに apache2 をインストールする。

apt-get update
apt-get -y install apache2

commit して push してみる

apache2 をインストールしたコンテナを終了した後に以下のようにコミットする。

docker commit 6e7a44bf3804 ${DockerServer}:${BINDPORT}/ubuntu

さらに push する。

docker push ${DockerServer}:${BINDPORT}/ubuntu

f:id:inokara:20140126101035p:plain


最後に

  • docker-registry のコンテナを使うことで S3リポジトリする環境は意外に簡単に作ることが出来た
  • 但し、docker-registry 自体の実装についてはあまり理解出来ていない*3
  • プライベートリポジトリを持つことで docker pull が遅くてイライラすることが減ることを期待*4

*1:重要

*2:2 つも起動する必要は無い

*3:すいません

*4:S3 の課金に気をつけましょう