docker
letsencrypt

Registry v2 と Let's Encryptを使ってDocker Private Repositoryを構築

More than 1 year has passed since last update.

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.pemprivkey.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/