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 用に書き換えてあげればよろしい。(もちろん s3
や swift
においても良いだろう)
詳しくは 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 で見るとこの辺り。
ストレージアカウント -> BLOB サービス -> コンテナ名
にある。コンテナ直下にある <名前なし>
ディレクトリは謎。Docker Registry どうこうではなく、良くある話らしい?詳しいひと求む。
・・・と言うわけで簡単に自前レジストリが作れて良かったね、Amazon EC2 Container Registry (ECR) が来るまでの辛抱だ!という話。