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認証とかで適切に対応する必要があります。
参考サイト: