Docker Private Registry with Let's Encrypt on Ubuntu 20.04


はじめに

DockerのプライベートRegistryを作る方法。Let's Encryptも使う。
サイトでApacheやNginxなど導入すると書いてあるところがあったけど、大げさなので利用しない。
なるべくシンプルな方法を記載。

certbotは次の通りインストール

$ sudo add-apt-repository ppa:certbot/certbot -y
$ sudo apt update
$ sudo apt install certbot -y

Dockerは公式のインストール方法を推奨する。
https://docs.docker.com/engine/install/ubuntu/

Docker レジストリの作成

# 以下は全部rootでやる
$ sudo su

# certbotでファイルを取得
$ certbot certonly --standalone --preferred-challenges http --non-interactive  --staple-ocsp --agree-tos -m [email protected] -d registry.octopt.com

# Let's Encryptの自動更新の設定
$ cat <<EOF > /etc/cron.d/letencrypt
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 2 * * 1 root /usr/bin/certbot renew >> /var/log/letsencrypt-renew.log && cd /etc/letsencrypt/live/example.com && cp privkey.pem domain.key && cat cert.pem chain.pem > domain.crt && chmod 777 domain.*
EOF

# SSL certificatesのリネーム
$ cd /etc/letsencrypt/live/registry.octopt.com && \
cp privkey.pem domain.key && \
cat cert.pem chain.pem > domain.crt && \
chmod 777 domain.*

#ログインしてPushするようにする。usernameはfoouser, passwordはbazzpassとする。
$ mkdir -p /mnt/docker-registry
$ docker run --entrypoint htpasswd registry:latest -Bbn foouser bazzpass > /mnt/docker-registry/passfile

docker run -d -p 443:5000 --restart=always --name registry \
  -v /etc/letsencrypt/live/registry.octopt.com:/certs \
  -v /mnt/docker-registry:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/var/lib/registry/passfile \
  registry:2.7.0

以上。
ポート443は開けておくこと。
外部から無事できているか確認してみる。

$ curl https://foouser:[email protected]/v2/_catalog

{"repositories":[]}
がかえってこればOK

Pushしてみる

まずdocker ログインする必要がある。

$ docker login -u foouser -p bazzpass registry.octopt.com:443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

となる。その後はPushできる。手元にあったmyalpineをpushする。pushする前に一度docker tagしてpush する

$ docker tag alpine:latest registry.octopt.com:443/myalpine
$ docker push registry.octopt.com:443/myalpine
The push refers to repository [registry.octopt.com:443/myalpine]
50644c29ef5a: Pushed 
latest: digest: sha256:a15790640a6690aa1730c38cf0a440e2aa44aaca9b0e8931a9f2b0d7cc90fd65 size: 528

OK.

参考文献