Registry (https://github.com/docker/distribution) を利用すると誰でも気軽にDocker Private Repositoryを立てられるが, DockerはHTTPによる通信を非セキュアとして通常は許可しておらず, HTTPSによる通信を行なうためには証明書を取得する必要があり, そのためのコストが高かった.
ここで面倒臭くなって大分長いことPrivate Repositoryを立てたいと思いつつ, 実行に移せていなかったのだが, そういえば Let's Encrypt が 2016年4月に正式公開されたはずなので, これを利用すればオレオレ証明書をでっちあげたりしなくても, 簡単に認証付きRegistryを立てられることに気付いた.
この記事ではLet's Encrypt を利用して, 証明書を発行し,
認証付きのRegistryを立てる方法を簡単に紹介したいと思う.
準備
- Docker 1.6.0 or newer
- 自分の管理下にあるドメイン (この記事では
<my-domain>
と表記.)
Let's Encrypt から 証明書をひっぱってくる
参考記事: http://qiita.com/sawanoboly/items/9fdde1707de5e975dd15
以下のコマンドで/etc/letsencrypt以下に証明書をひっぱってくる.
docker run -it --rm -p 80:80 -p 443:443 \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
quay.io/letsencrypt/letsencrypt:latest certonly --standalone
mkdir -p certs
cp /etc.letsencrypt/live/<my-domain>/fullchain.pem certs/<mydomain>.crt
cp /etc.letsencrypt/live/<my-domain>/privkey.pem certs/<mydomain>.key
ドメイン名やメイルアドレスを聞かれるので素直に答える. 処理が終了すると /etc/letsencrypt/live/<my-domain>/
以下に必要なファイルが生成されている.
今回はこのうち, fullchain.pem
と privkey.pem
を利用する.
htpasswd を生成
パスワード認証用にhtpasswdを生成しておく. <user>
と <password>
にはそれぞれパスワード認証に使うidとpasswordを設定. >
が混ざって読みづらくなってしまって申しわけない.
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn <user> <password> > auth/htpasswd
Registryコンテナを立ち上げる
ホストのファイルシステム上のディレクトリ /tmp/registry
で コンテナイメージを管理することにしよう.
docker run -d -p 5000:5000 --restart=always --name registry \
-f /tmp/registry:/var/lib/registry
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/<my-domain>.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/<my-domain>.key \
registry:2
Ok.
Registryコンテナから push/pull してみる
docker pull ubuntu # これは今回作ったRegistryからpullしているわけではない. 実際なんでもいい.
docker login <my-domain>:5000 # user/password を聞かれるので素直に答える
docker tag ubuntu <my-domain>:5000/ubuntu
# push
docker push <my-domain>:5000/ubuntu
# pull
docker pull <my-domain>:5000/ubuntu
Ok.
参考資料
https://docs.docker.com/registry/
https://docs.docker.com/registry/deploying/