Edited at

プライベートなDockerレジストリサーバーをコンテナで立てる

More than 1 year has passed since last update.

Docker Hubではなく自分だけのレジストリが欲しい場合はレジストリサーバーをコンテナで立てましょう。

大抵は以下の様な時に使いたくなると思います。


  • DockerHub以外でプライベートのレジストリを作りたい(お金払いたくない!)

  • オンプレミスで使いたい(会社内だけで使いたい)

Docker Hubでアカウントを持っていれば1リポジトリだけプライベートリポジトリが使えますが、それ以上はお金を払う必要があります。

参考:Billing Information & Pricing Plans


用語

似てる用語が出てくるのでまとめておきます

用語
意味

レジストリ
DockerHubのような複数のリポジトリ・イメージを格納しておくサーバー

リポジトリ
イメージが保存されている領域。レジストリの中にいくつも存在する。Docker Hubでユーザーが作るのはリポジトリ

パブリックレジストリ/リポジトリ
誰でも見れて、取得して使用することができるレジストリ/リポジトリ

プライベートレジストリ/リポジトリ
制限された範囲の人しか見れないし使うことができないレジストリ/リポジトリ


プライベートレジストリ選択肢


  • Registryコンテナ

  • Docker Trusted Registry


Registryコンテナ

Docker環境さえあればすぐに作れる、DockerHubで公式に配布


  • 評価目的のために調整されている

  • 本番環境へのデプロイ時は自分でビルドして調整が必要


    • TLS認証設定

    • ストレージのバックエンド選択



  • 管理インターフェイスが標準ではついてない

自分で使ってみる、社内にとりあえず構築してみるにはこれで十分。

本記事は主にこちらについて記載。

DockerHub/registry


Docker Trusted Registry

お金を払って構築できるレジストリ


  • 商用サポートライセンスが必要


    • Dockerエンジンは商用(CSエンジン)

    • Docker Hub上で入手



  • ブラウザでの管理インターフェイス


    • リソース管理

    • ログ

    • ユーザー認証(Basic or LDAP)



  • よりセキュア


    • TLSが有効(HTTPS通信)

    • CA証明書使用



  • サポート環境


    • Ubuntu14.04 LTS

    • RHEL 7.0/7.1



安定して使いたい場合は素直にこっちを使いましょう。

フリートライアルもあるので試してみることもできます

docker-trusted-registry


Registryコンテナの構築

ではさっそくたててみましょう


必要なもの・環境

以下を使います


  • Docker環境

  • インターネット接続環境

DockerHubと通信でき、コンテナを実行できる環境があればOKです。

※インターネットと接続できない人はregistryイメージをtarなどで入手して環境にloadしておいても構いません。

検証したときのバージョンは以下となります


  • Docker Client 1.10.1

  • Docker Engine 1.10.1

  • registry:2.3.0

  • docker-registry-frontend:v2


構築

Dockerコマンドが実行できる状態で、レジストリを取得します。

$ docker pull registry:2.3.0

docker runしてRegistryのコンテナをたてましょう。

ただしRegistry上のイメージを永続化したいのでホストのディレクトリをコンテナにマウントさせます

$ docker run -d -p 5000:5000 -v /var/opt:/var/lib/registry registry:2.3.0

ホスト側、コンテナ側共に5000番ポートでつないでいます。これでlocalhost:5000などとするとコンテナの5000番ポートにフォワードされます

また、Registry:2.3.0では/var/lib/regstry上にpushされたイメージが保管されます。そのため、ホスト側の/var/optをコンテナ上の/var/lib/registryにマウントしてます。

構築はこれだけでOKです。


使ってみる


push

ではレジストリにイメージをpushしてみましょう。

ここではubuntu:14.04のイメージをダウンロードした状態とします。プライベートレジストリにpushするためにはイメージの名前を変える必要があります。

docker tag <イメージ名>:<tag> <レジストリのIP>:<ポート>/<任意のリポジトリ名>/<イメージ名>:<tag>

自分の環境に当てはめると以下です

$ docker tag ubuntu:14.04 localhost:5000/rsakao/ubuntu:14.04

ubuntuイメージ名の前にレジストリ名をつけた形ですね。<レジストリのIP>:<ポート>は同じDockerエンジン上で実行させているのでlocalhost:5000となります

<任意のリポジトリ名>には自分のアカウント名をつけました。Docker Hubの<リポジトリ名>/<イメージ名>と同じで個人や企業などを入れておけばよいでしょう

docker imagesでイメージ一覧を確認してみてください。ubuntu:14.04と同じコンテナIDで、あたらしいイメージ名が登録されていますね

$ docker images

REPOSITORY TAG IMAGE ID
ubuntu 14.04 14b59d36bae0
localhost:5000/rsakao/ubuntu 14.04 14b59d36bae0

pushします

$ docker push localhost:5000/rsakao/ubuntu:14.04 

ネットワーク通信が正常であれば、pushが完了します


pull

ついでにpullも試してみましょう

いったん先ほどのtagを削除します

$ docker rmi localhost:5000/rsakao/ubuntu:14.04

docker imagesでイメージ一覧から消えていることを確認してください

実際にpullしてみます

$ docker pull localhost:5000/rsakao/ubuntu:14.04

再度docker imagesでイメージ一覧を確認してください。pullできていたら成功です

pullしたあとはdocker tagで名前を変更したりして使ってみてください


DockerデーモンがTLS動作してる場合

Docker ToolBox、Docker Machineなどを使っている場合、DockerデーモンのTLS設定が有効となっています。そのためRegistryでTLS設定を有効にしていないとHTTPS通信ができず、pushやpullができません。

クライントとレジストリが同じDockerデーモン上で動作している場合はこの限りではありませんが、レジストリである限り複数人で使うことが多いと思います。

セキュアではありませんが、とりあえず動かしたい場合はDockerデーモン側で設定を変えて起動します。

Docker Machineで起動したDockerデーモンの場合、以下のようにします。

$ Docker-machine ssh default #Dockerデーモンが動いているサーバーに接続

$ sudo vi /var/lib/boot2docker/profile #ubuntuなどは/etc/default/dockerを編集

一行追加します。


/var/lib/boot2docker/profile

EXTRA_ARGS='

--label provider=virtualbox
--insecure-registry 192.168.0.1:5000 ←行追加
'

192.168.0.1:5000の部分は<レジストリのIP>:<ポート>です。

ubuntuなど/etc/default/dockerを編集する場合はDOCKER_OPTS="--insecure-registry <レジストリのIP>:<ポート>"と追記するみたいです(こちらは未検証)。

Dockerデーモンを再起動します。

$ sudo /etc/init.d/docker restart

あるいは

$ sudo service docker restart

以上でpush, pullができるようになります。


ブラウザでレジストリを確認したい場合(docker-registry-frontend)

簡易的なレジストリコンテナですが、何が入っているか可視化したいことがあります。その場合はdocker-registry-frontendを使ってみましょう

GitHubによると

以下のように実行すれば動くことがわかります

$ docker run \

-d \
-e ENV_DOCKER_REGISTRY_HOST=ENTER-YOUR-REGISTRY-HOST-HERE \
-e ENV_DOCKER_REGISTRY_PORT=ENTER-PORT-TO-YOUR-REGISTRY-HOST-HERE \
-p 8080:80 \
konradkleine/docker-registry-frontend:v2

ENV_DOCKER_REGISTRY_HOST=にはレジストリコンテナのIPを指定します。環境変数なのでlocalhostはだめでした。IPにしてください。ENV_DOCKER_REGISTRY_HOST=192.168.0.1という形です

ENV_DOCKER_REGISTRY_PORT=にはポート番号を入れます。上記の例では5000番ですのでENV_DOCKER_REGISTRY_PORT=5000という形です

起動後はブラウザでアクセスしてみましょう

「Browse repositories」からリポジトリをたどることができます

以上です