84
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CoreOS 上に Private Docker Registry を立てる

Last updated at Posted at 2014-09-07

はじめに

Private Docker Regisry を立てられる docker-registry というイメージ(docker-registry は python の gunicorn アプリケーションとして実装されてる)が docker 公式で用意されている。docker-registry は local, S3 や GCS 等色んなストレージをイメージの保存先として使うことができる。

docker-registry をどう使うか

docker-registry は 1 台でも冗長構成でも良いが、ある 1 つのエンドポイントを使おうとすると

  • SPOF になる
  • 利用元サーバが大量にある場合、負荷を気にする必要が出てくる
  • ローカルからも本番サーバからも利用しようとすると認証機構が必要になる
  • 本番サーバだけであれば同じネットワーク内のみ許可、のような形で制限はできるがローカルから pull/push できなくなる

そこで、docker-registry を全 Docker サーバで起動しておき localhost の registry に問い合わせるようにすることで

  • 認証機構を用意しないで済む
  • SPOF を作らない
  • 負荷もほとんど気にしなくて良い
  • ローカルの OSX でも CoreOS でも docker-registry イメージを使って同じ仕組みが使える

というメリットがある。

docker-registry 用の S3 bucket を用意する

docker-registry 用に新しく S3 bucket を用意する。作成後、特にディレクトリは作る必要はない。使い始めると

$ aws s3 ls s3://wantedly-docker-registry/
                           PRE images/
                           PRE repositories/

というディレクトリが自動で作られる。

docker-registry で利用する IAM User の権限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket-name",
        "arn:aws:s3:::your-bucket-name/*"
      ]
    }
  ]
}

コマンドラインから registry を起動する

core@core-01 ~ $ docker run \
  -d \
  --name registry \
  -e SETTINGS_FLAVOR=prod \
  -e AWS_BUCKET=your-bucket-name \
  -e AWS_KEY=XXXXXXXXXXXXXXXXXXX \
  -e AWS_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
  -e AWS_SECURE=true \
  -e DOCKER_REGISTRY_CONFIG=/docker-registry/config/config_sample.yml \
  -e STORAGE_PATH=/ \
  -e SEARCH_BACKEND=sqlalchemy \
  -e GUNICORN_WORKERS=3 \
  -p 5000:5000 \
  registry:0.7.3 \
  docker-registry

これで以下のように registry を利用出来る

$ docker pull localhost:5000/<user>/<repo>/<tag>
$ docker push localhost:5000/<user>/<repo>/<tag>

# 例
$ docker pull localhost:5000/wantedly/ubuntu:latest
$ docker push localhost:5000/wantedly/ubuntu:latest

Cloud-Config から registry を起動する

CoreOS クラスタの各マシンで起動しておく必要があるので以下のように書く。

#cloud-config
# 一部抜粋

coreos:
  units:
    - name: registry.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Private Docker Registry
        After=docker.service
        Requires=docker.service

        [Service]
        TimeoutStartSec=0
        ExecStartPre=-/usr/bin/docker kill registry
        ExecStartPre=-/usr/bin/docker rm registry
        ExecStartPre=/usr/bin/docker pull registry:0.7.3
        ExecStart=/usr/bin/docker run -d --name registry -e SETTINGS_FLAVOR=prod -e AWS_BUCKET=your-bucker-name -e AWS_KEY=XXXXXXXXXXXXX -e AWS_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -e AWS_SECURE=true -e DOCKER_REGISTRY_CONFIG=/docker-registry/config/config_sample.yml -e STORAGE_PATH=/ -e SEARCH_BACKEND=sqlalchemy -e GUNICORN_WORKERS=3 -p 5000:5000 registry:0.7.3 docker-registry

        [Install]
        WantedBy=multi-user.target

メモと感想

キャッシュ機能が追加されてる

最近キャッシュ機能が追加され redis と組み合わせと速度が上がるとのことで、近いうちに試そう

本番では Nginx か Apache と組み合わせる

What about a production environment にあるように本番では Nginx か Apache を前に置いた方が良い。apache コンテナか nginx コンテナを用意する。

常時起動でなくて都度起動するやり方もあり

gunicorn の worker 数にもよるが常時起動しておくと、500 MB 強 くらいのメモリは取るので、都度起動して、pull/push 終わったらコンテナ終了とするとマシンリソース的にはより効率的になる。常に起動しておいた方がシンプルではある

バージョンによってハマる

https://github.com/docker/docker-registry/issues/400 で色々と話されているが S3 をストレージにした際に docker-regisry がハングしたり、 region 指定しろと言われてエラーになったりとハマりどころがある... 0.8.x も使ってみたけどまた動かない...

docker hub と quay.io と private registry どれがいいか

これが正解、みたいにはなくても状況によってどれがよい、というのはありそう。別ポストで整理してみよう。ちょっと quay.io に惹かれている...

REF

84
85
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
84
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?