2014-04-26

DockerのPrivateなリポジトリをs3に作る

Dockerはhttps://index.docker.io/にPublicなリポジトリを持てるんだけど

docker-registryっていうのをdockerイメージを使えば

Privateなリポジトリを超簡単に持てる&S3に永続保持できるらしいので試してみた。

 

Publicなところに、AWSのClientIDとかSecretKeyとかうっかり保存しそうな私みたいな人には超オススメ。

 

やりかたは超簡単でregistry立ててpushするだけ!

1. docker-registryをpullしてコンテナー化

$ docker pull registry
$ docker run -i -t registry /bin/bash

registryもdockerで提供されているっていう。

 

2. registryのconfigファイル設定

$ cd /docker-registry/config
$ mv config.yml config.yml.original
$ cp config_s3.yml config.yml
$ vim config.yml

 

config.ymlはこんな感じで。(S3の例)

prod:
    storage: s3
    boto_bucket: test-docker
    s3_access_key: AKI*************
    s3_secret_key: ****************************
    s3_bucket: test-docker
    s3_encrypt: true
    s3_secure: true
    secret_key: xxxxx
    storage_path: /images

 

サンプルは何故かs3_encryptとs3_secureが2つずつあったので

1つずつ削除しました。(ちゃんと動いているので多分OKだと思います。)

storage_pathは実際にS3に格納される時のサブディレクトリを指定します。

上記の例だと、test-docker/images/ ディレクトリ直下に実際のimageやらrepositoryが配置される感じです。

環境によって向き先を変更できるみたいで、例ではprod(本番)環境の設定をしています。

 

3. registryをcommitして再度立ち上げ

$ docker commit ***** tzmfree/registry
$ docker run -i -p 5000:5000 -e SETTINGS_FLAVOR=prod tzmfree/registry /docker-registry/run.sh

 

ここで環境変数SETTINGS_FLAVORをprodに設定しておかないとダメ。

ここで設定しない場合はデフォルトdevになって、

上記のconfig.ymlだとdevの定義が書いていないので楽勝でエラーになります。

(私の場合、”Config error: `secret_key’ is not set”というエラーが出て小一時間ハマりましたorz)

 

4. 既存のimageにtagを付けてpushする

$ docker images | grep tzmfree/testimage

とかでimageIDを調べた後

$ docker tag {imageID} localhost:5000/tzmfree/testimage

でtagを付けて

$ docker push localhost:5000/tzmfree/testimage

でpush!ここでs3にイメージが保存されます。

 

pullとかpushするときには明示的にRegistryにホスト名とポートを指定しないと

docker公式のrepositoryやユーザのpublic repositoryが置いてあるindex.docker.ioを利用して

明示的に指定した場合は対象のregistryを利用する形になります。

 

つまり、docker pull ubuntu って書くと

index.docker.ioにホスティングされたregistryから公式imageのubuntuを取得し

docker pull tzmfree/ubuntuって書くと、index.docker.ioの

ユーザtzmfreeのpublic repositoryからimageを取得します。

 

一方、docker pull localhost:5000/tzmfree/ubuntu とホストとポートを指定すると

localhost:5000のregistryからtzmfree/ubuntuというimageを取得します。

 

pushするためにはimageにlocalhost:5000というreigstryの指定が必要だから

docker tagでタグを付けてます。

(私もここらへんよくわかんないですが、とりあえずこういう書き方になるっていうことで!)

 

あと、tzmfreeというユーザ指定部分ですが、ユーザ名なので短い名前だったりすると

Invalid namespace name (tzm), only [a-z0-9_] are allowed, size between 4 and 30

って感じで怒られます。

imageの名前は何でも良いですが、付けるtagの名前はここらへんの命名規則に従う必要があるみたいです。

 

これでprivateなimageもデプロイ出来ます!

しかもimageはS3に永続的に保持される!

 

ちなみにDockerfile使えばbitbucketとかのprivateレポジトリ使えば

registryを使わずにprivateなimageをデプロイできるみたいです。

本当はgitとかでDockerfile管理しつつコードとして保持しておいて

imageをs3とかに保持しておくのが良いのかもですが

自分用のdockerであればimageオンリーってのは有りだと思います。

 

あと、今回のサンプルだとホストOSのポート5000を開けているので

別PCの別dockerクライアントでもpushできちゃうpublicなregistryになっちゃってるので

private registryにするにはiptablesとかhttps + basic認証とかで適切に対応する必要があります。

 

参考サイト:

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

社内用Docker Registryを立てる

Private Docker Registryを、あっさりセットアップする

このエントリーをはてなブックマークに追加