クラウド基盤チームの常田です。
Dockerを利用しているとプライベートレポジトリが欲しくなりますね。
特にバックアップの目的にも他のサーバへの可搬性も考えてもプライベートレポジトリがあって損はないように思います。
S3の資料は沢山あるのですがその他のObjectStorageをレポジトリにする資料が見当たりませんでしたので参考までに記載しておきます。
今回利用するSoftLayerのObjectStorageはSwiftのためレポジトリとして利用することが出来ます。
ObjectStorageの購入
SoftLayerにてObjectStorageを購入するためには、管理ポータル上から[Storage]→[ObjectStorage]を選択します。
図1: ObjectStorage一覧
次に画面の右上にある[Order Object Storage]をクリックするとダイヤログが表示されます。費用についてのダイヤログが表示された後に確認画面が出ますので購入します。
図1ではすでに2つ購入されています。ObjectStorageは専用のアカウントが払い出されこのように「アカウント名-NN」のような名称が付与されます。選択すると次にどのDataCenterを利用するかが問われます。ObjectStorageはDataCenterに紐付いたサービスであることがわかります。
この画面が表示されたら[ View Credentials]をクリックすると接続するためのアカウントなどの情報が表示されます。
Docker Registry の Build
ObjectStorageが用意出来たので次はプライベートレポジトリサーバを構築します。とは言ってもそこはDokcer。
Dockerのレポジトリサーバは、コンテナ形式で提供されているのでレポジトリを保存したいコンテナが動いているサーバなどで動かす必要があります。
以下のDockerFileを作成してRegistryサーバを起動します。今回利用している docker-registry-driver-swift ですが先日出ている 0.1.0 だと上手く以下の環境変数が出来ませんでしたので以前から出ている 0.0.1 を指定しています。
参考:http://mindtrove.info/docker-registry-softlayer-object-storage/
# start from a registry release known to work
FROM registry:0.7.3
# get the swift driver for the registry
RUN pip install docker-registry-driver-swift==0.0.1
# SoftLayer uses v1 auth and the sample config doesn't have an option
# for it so inject one
RUN sed -i '91i swift_auth_version: _env:OS_AUTH_VERSION' /docker-registry/config/config_sample.yml
参考までに 0.1.0の場合には以下のように直接swift.pyの中のVersion指定を書き換えると上手く動きました。0.0.1のように環境変数だとなぜか適切に渡せませんでした。
FROM registry:latest
RUN apt-get -y install libxml2-dev libxslt1-dev zlib1g-dev
RUN pip install docker-registry-driver-swift
# SoftLayer uses v1 auth and the sample config doesn't have an option
# for it so inject one
RUN sed -i "s/swift_auth_version', 2/swift_auth_version', 1/" /usr/local/lib/python2.7/dist-packages/docker_registry/drivers/swift.py
次に、Buildしておきます。
$ docker build -t parente/registry-swift:0.7.3 .
結果としては以下のように成ります
root@test01:~/registry# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
parente/registry-swift 0.7.3 295e64a14254 11 minutes ago 553.9 MB
コンテナの起動時に環境変数でSwiftの設定をわたします。OS_AUTH_URL
は、SoftLayer上のサーバで利用する場合にはプライベート側のエンドポイントにつなぐのが良いと思います。
#!/bin/sh
docker run -it -d ¥
-e SETTINGS_FLAVOR=swift
-e OS_AUTH_URL='https://hkg02.objectstorage.service.networklayer.com/auth/v1.0' ¥
-e OS_AUTH_VERSION=1 ¥
-e OS_USERNAME='SLOS12345-3:SL12345' ¥
-e OS_PASSWORD='API KEY' ¥
-e OS_CONTAINER='docker-registry' ¥
-e GUNICORN_WORKERS=8 ¥
-p 5000:5000 ¥
parente/registry-swift:0.7.3
起動を確認します。--name
を指定していないので適当にコンテナ名は割り振られています。コンテナの5000ポートがフォワードされている事を確認します。
root@test01:~/registry# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74a075aca8cf parente/registry-swift:0.7.3 /bin/sh -c 'exec doc 11 minutes ago Up 11 minutes 0.0.0.0:5000->5000/tcp grave_ritchie
Private RepositoryへのPull
次に実際にアップしたいImagesにTagをつけます。
$ docker tag 2fb9b826dcc8 127.0.0.1:5000/tokida/redmine:1.1
このタグの付いたImagesをアップします。
$ docker push 127.0.0.1:5000/tokida/redmine:1.1
The push refers to a repository [127.0.0.1:5000/tokida/redmine] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/tokida/redmine (1 tags)
Image 511136ea3c5a already pushed, skipping
(以下省略)
これでObjectStorage側の方でアップロードされているのがわかります。
うまくいかない場合などは docker logs [id] 等でログを参照してみると問題解決のヒントが見えてくるかもしれません。
別のサーバなどからプライベートレポジトリを通じて先ほど保管したコンテナイメージをダウンロードして利用することが可能になっています。新規のサーバ上で再度またプライベートレポジトリのRegistryサーバを起動してもよいですが当然リモートアクセスも可能ですのでこのまま利用してみたいと思います。
(別のサーバ)$ docker pull <registoryサーバのIPアドレス>:5000/tokida/redmine:1.1
で取得することが出来ます。
Dockerではプライベートレポジトリを利用する以外にImageをファイルにエクスポートすることも可能です。しかし実際にはファイルの管理を考えると今回のプライベートレポジトリを利用する方がより簡単に利用することが出来るのがわかるかと思います。