Docker Registryでプライベートなリポジトリを立てる

Jun 10, 2015   #docker 

Docker Hubはパブリックなリポジトリなので、社内限りの情報など外部公開できないイメージを管理する場合はプライベートなリポジトリを使う必要があります。サービスとして提供されているプライベートリポジトリを使う方法もありますが、今回はDocker Registryを使って自分の環境にリポジトリを構築してみます。

※Docker Hubは、無料アカウントで1リポジトリまで使用可能。それ以上は有料プランになります。

プライベートリポジトリの種類

記事執筆時点では、下記のサービスでプライベートリポジトリを使用することができます(漏れがあったら教えてください)。

  • CoreOS Enterprise Registry
  • Quay.io
  • Google Container Registry(現時点ではベータ)
  • Docker Registry

上記の中で、Docker Registryだけはサービスではありません。 Docker Registryとは、公式から提供されているリポジトリ構築用のコンテナイメージです。 Dockerの環境を作ってDocker Registryのコンテナを立ち上げると、コンテナがそのままリポジトリとして動きます。

Docker Registryを立ち上げる

使ってみる前に注意点について。 インターネット上の環境でDocker Registryを使う場合、URLがバレるとアクセスし放題になってしまいます。 送信元のIPで制限かけたり、認証機能を持たせるなど別途対策が必要です。

では、使ってみましょう。とても簡単です。

sudo yum install docker
docker run -p 5000:5000 -d -v /var/registry:/tmp/registry registry

これでリポジトリが使える状態になりました。 コンテナ上でイメージが格納される/tmp/registryと、ホストの/var/registryをマウントしています。 Docker Registryはコンテナを止めると蓄積していたイメージが消えるため、基本的にホストとのマウントが必要です。

イメージをpushする

テストに使うベースイメージをDocker Hubからpullします。

sudo docker pull ubuntu

これからubuntuのイメージをDocker Registryにpushします。 どのリポジトリにpushするかはタグに書かれているリポジトリ名で判断されますので、docker tagコマンドでタグを付与します。

sudo docker tag docker.io/ubuntu localhost:5000/ubuntu
sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu        latest              fa81ed084842        8 days ago          188.3 MB
localhost:5000/ubuntu   latest              fa81ed084842        8 days ago          188.3 MB
docker.io/registry      latest              d849e35be7b0        13 days ago         413.9 MB

タグを付けたらpushします。 localhost:5000を参照していることがログに出ています。

sudo docker push localhost:5000/ubuntu
The push refers to a repository [localhost:5000/ubuntu] (len: 1)
Sending image list
Pushing repository localhost:5000/ubuntu (1 tags)
e118faab2e16: Image successfully pushed
7e2c5c55ef2c: Image successfully pushed
e04c66a223c4: Image successfully pushed
fa81ed084842: Image successfully pushed
Pushing tag for rev [fa81ed084842] on {http://localhost:5000/v1/repositories/ubuntu/tags/latest}

pullできることも確認してみます。 まずはpushしたイメージを削除してからpullします。

sudo docker rmi localhost:5000/ubuntu
Untagged: localhost:5000/ubuntu:latest

sudo docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu     latest              fa81ed084842        8 days ago          188.3 MB
docker.io/registry   latest              d849e35be7b0        13 days ago         413.9 MB

sudo docker pull localhost:5000/ubuntu
Trying to pull repository localhost:5000/ubuntu ...
fa81ed084842: Download complete
fa81ed084842: Pulling image (latest) from localhost:5000/ubuntu
e118faab2e16: Download complete
7e2c5c55ef2c: Download complete
Status: Image is up to date for localhost:5000/ubuntu:latest

sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/ubuntu        latest              fa81ed084842        8 days ago          188.3 MB
localhost:5000/ubuntu   latest              fa81ed084842        8 days ago          188.3 MB
docker.io/registry      latest              d849e35be7b0        13 days ago         413.9 MB

pullできたでしょうか? 単純な使い方であれば、それほど手間もかからずプライベートなリポジトリを作ることができます。

リポジトリの中を見る

せっかくリポジトリを作ったので、もう少し踏み込みます。 ホスト側の/var/registryの中を辿ってみてください。

ls -l /var/registry
total 4
drwxr-xr-x. 6 root root 4096 Jun  9 09:52 images
drwxr-xr-x. 3 root root   20 Jun  9 09:51 repositories

ls -l /var/registry/images/
total 0
drwxr-xr-x. 2 root root 60 Jun  9 09:52 7e2c5c55ef2cd7675dcc9e9cc012dc2f759ceaf0f36c950b672af6df87af5070
drwxr-xr-x. 2 root root 60 Jun  9 09:52 e04c66a223c45a6247237510c40117cef92acb0a4355f1ba90580ef6274b490d
drwxr-xr-x. 2 root root 60 Jun  9 09:52 e118faab2e16f9d858fcec0d86c9148e9b0fa021697239745f3253f367941dcc
drwxr-xr-x. 2 root root 60 Jun  9 09:52 fa81ed084842076d1b39b56d084d99ec0011cd4a5ade1056be359486a8b213e4

/var/registry/imagesの中に、変な名前のファイルが入っていますね。 これらは、イメージの断片(差分)です。

差分に関してご存じない方は、Dockerイメージの差分管理についてまとめてみたを見て頂けると嬉しいです。

次はちょっとした実験をしてみます。

差分管理の恩恵を受けてみる

localhost:5000/ubuntuをベースにコンテナを立ち上げます。 立ち上げたら、何でも良いのでコンテナ上でファイルを追加します。

sudo docker run --name test -it localhost:5000/ubuntu
root@375e60a18751:/# echo registrytest > testfile

デタッチしたら、docker commitでイメージ化し、docker pushします。

sudo docker commit test localhost:5000/test
6ad9c592ae617e3401aab005e1cccb0c77041810ded7fad35785dbb838fd45bd

sudo docker push localhost:5000/test
The push refers to a repository [localhost:5000/test] (len: 1)
Sending image list
Pushing repository localhost:5000/test (1 tags)
Image e118faab2e16 already pushed, skipping
Image 7e2c5c55ef2c already pushed, skipping
Image e04c66a223c4 already pushed, skipping
Image fa81ed084842 already pushed, skipping
6ad9c592ae61: Image successfully pushed
Pushing tag for rev [6ad9c592ae61] on {http://localhost:5000/v1/repositories/test/tags/latest}

pushが終わったら、ホストの/var/registry/imagesを見ます。

ls -l /var/registry/images/
total 0
drwxr-xr-x. 2 root root 60 Jun  9 09:58 6ad9c592ae617e3401aab005e1cccb0c77041810ded7fad35785dbb838fd45bd
drwxr-xr-x. 2 root root 60 Jun  9 09:52 7e2c5c55ef2cd7675dcc9e9cc012dc2f759ceaf0f36c950b672af6df87af5070
drwxr-xr-x. 2 root root 60 Jun  9 09:52 e04c66a223c45a6247237510c40117cef92acb0a4355f1ba90580ef6274b490d
drwxr-xr-x. 2 root root 60 Jun  9 09:52 e118faab2e16f9d858fcec0d86c9148e9b0fa021697239745f3253f367941dcc
drwxr-xr-x. 2 root root 60 Jun  9 09:52 fa81ed084842076d1b39b56d084d99ec0011cd4a5ade1056be359486a8b213e4

あれ?一行だけしか増えていませんね。 Docker Registryは同じ差分情報を複数保持しません。

そのため、最初にpushしたイメージと次にpushしたイメージの差分だけが記録されました。 素敵な感じで差分管理してくれます。