クラウド基盤チームの常田です。

Dockerを利用しているとプライベートレポジトリが欲しくなりますね。
特にバックアップの目的にも他のサーバへの可搬性も考えてもプライベートレポジトリがあって損はないように思います。

S3の資料は沢山あるのですがその他のObjectStorageをレポジトリにする資料が見当たりませんでしたので参考までに記載しておきます。
今回利用するSoftLayerのObjectStorageはSwiftのためレポジトリとして利用することが出来ます。

ObjectStorageの購入

SoftLayerにてObjectStorageを購入するためには、管理ポータル上から[Storage]→[ObjectStorage]を選択します。

図1: ObjectStorage一覧

SoftLayer Customer Portal Object Storage

次に画面の右上にある[Order Object Storage]をクリックするとダイヤログが表示されます。費用についてのダイヤログが表示された後に確認画面が出ますので購入します。

図1ではすでに2つ購入されています。ObjectStorageは専用のアカウントが払い出されこのように「アカウント名-NN」のような名称が付与されます。選択すると次にどのDataCenterを利用するかが問われます。ObjectStorageはDataCenterに紐付いたサービスであることがわかります。

SoftLayer Customer Portal Object Storage

この画面が表示されたら[ 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をファイルにエクスポートすることも可能です。しかし実際にはファイルの管理を考えると今回のプライベートレポジトリを利用する方がより簡単に利用することが出来るのがわかるかと思います。