November 28, 2015

Docker Registry v2 で Azure Blob をバックエンドにする(for RHEL7)

RHEL7.2 がリリースされましたね。今回もびっくりするくらい Rebase と New Packages がテンコ盛りなのですが、その中に Docker Registry v2 (docker-distribution @Extras) も含まれていました。

通常 Docker Registry は Docker Hub からコンテナとして起動することが多いかと思いますが、このパッケージ(v2: docker-distribution, v1: docker-registry)を使うと普通に構築することも出来ます。

んで、Azure Blob で使う話に戻るのだけど、Docker Registry v1 では別途ストレージドライバを入れなければいけなかったので、結構めんどくさかった訳です。それが v2 ですごく楽になったと。そう言う話です。

なお、この記事を書いてる時点では CentOS には来ていない模様。CentOS7.2(7.1511 or 7.1512) が来たら 一緒に来るんじゃないかなぁ。

インストールは基本的に yum ればよろしい。

$ sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
$ sudo yum install -y docker-distribution

デフォルト設定ではローカルストレージの /var/lib/registry にデータが置かれるので、storage ディレクティブ(セクション?)を Azure 用に書き換えてあげればよろしい。(もちろん s3swift においても良いだろう)

詳しくは Registry Configuration Reference を見ると良い。

/etc/docker-distribution/registry/config.yml
~~ snip ~~
storage:
  azure:
    accountname: AccountName
    accountkey: Base64EncodedAccountKey
    container: ContainerName
~~ snip ~~

ちなみに container: ContainerName のコンテナを事前に Azure 上に作っておく必要はない。初回起動時に勝手に作ってくれる模様。

$ sudo  systemctl start docker-distribution.service
$ sudo  systemctl enable docker-distribution.service

こんな感じで動いていれば良い。

$ sudo  systemctl status docker-distribution.service -l
docker-distribution.service - v2 Registry server for Docker
   Loaded: loaded (/usr/lib/systemd/system/docker-distribution.service; enabled)
   Active: active (running) since Thu 2015-11-26 07:07:57 UTC; 22h ago
 Main PID: 53523 (registry)
   CGroup: /system.slice/docker-distribution.service
           └─53523 /usr/bin/registry /etc/docker-distribution/registry/config.yml

これで基本的には終わりなのだが、このままだと SSL も認証もクソもないので、前段に Nginx を入れて認証させる。RH で揃えるならパッケージは Software Collections チャンネルの rh-nginx18 辺りがよさげ。

設定は次の様な雰囲気で。

# reg
upstream docker-registry-v2 {
  server localhost:5000;
}

server {
  listen 443;
  server_name reg.example.com;

  ssl on;
  ssl_certificate /path/to/ssl.crt;
  ssl_certificate_key /path/to/ssl.key;

  # disable any limits to avoid HTTP 413 for large image uploads
  client_max_body_size 0;
  chunked_transfer_encoding on;
  
  location /v2/ {
    auth_basic "registry";
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
    auth_basic_user_file /path/to/docker-registry.htpasswd;
    proxy_pass                          http://docker-registry-v2;
    proxy_set_header  Host              $http_host;   # required for docker client's sake
    proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
  }
}

これで OK、docker クライアントから longin して push なり pull なりすれば良い。

$ docker login reg.example.com
$ cat ~/.docker/config.json
{
	"auths": {
		"reg.example.com": {
			"auth": "XXXXXXXXXXXXXXXX",
			"email": "XXXX@example.com"
		}
	}
}

Azure Portal で見るとこの辺り。

Azure Portal

ストレージアカウント -> BLOB サービス -> コンテナ名 にある。コンテナ直下にある <名前なし> ディレクトリは謎。Docker Registry どうこうではなく、良くある話らしい?詳しいひと求む。

・・・と言うわけで簡単に自前レジストリが作れて良かったね、Amazon EC2 Container Registry (ECR) が来るまでの辛抱だ!という話。

© Kazuhisa Hara 2014-2018