Docker Registry とは
要は自前で立てる Docker Hub です。公式に提供されています。
結論
以下のような docker-compose.yml
になりました。
docker-compose.yml
と同じディレクトリに registry
ディレクトリと certs
ディレクトリと auth
ディレクトリを作っておきます。そして、 certs
ディレクトリ内に証明書のファイルを2つ入れ、auth
ディレクトリには htpasswd のファイルを入れます*1。
version: '2' services: registry: # https://hub.docker.com/_/registry?tab=tags&page=1&ordering=last_updated image: registry:2.7.1 container_name: my_docker_registry environment: REGISTRY_HTTP_SECRET: ABCDEF1234567890 REGISTRY_HTTP_TLS_CERTIFICATE: /certs/certificate.crt REGISTRY_HTTP_TLS_KEY: /certs/private.key REGISTRY_HTTP_RELATIVEURLS: "true" REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd volumes: - ./registry:/var/lib/registry - ./certs:/certs - ./auth:/auth ports: - 12345:5000 restart: always
設置環境
- インターネット上に Docker Registry を作る(例えば
https://my-docker-reg.example.com
とします) - ユーザからのアクセスで最初に通るところは Cloudflare
- Cloudflare から nginx へと接続される
- nginx から Docker Registry に接続される
ポイント
1. 証明書が必須
基本的に証明書が必須です*2。このようなときは今までは Let's Encrypt で取得していました、今回初めて ZeroSSL を用いました(参考記事)。Web インターフェイスだけで完結し、DNS認証 により瞬時に証明書を取得できました。
2. Basic認証設定時の htpasswd の生成アルゴリズムは bcrypt
Basic認証設定時の htpasswd を作る際には、bcrypt のアルゴリズムを用います。つまり -B
オプションを用います。
3. 公式ドキュメントのとおりでは htpasswd が作成できない(コマンドがない)
公式ドキュメントに htpasswd の生成方法が書かれています。しかしこの方法(Docker イメージ経由で htpasswd を走らせる方法)では htpasswd が作成できません。Docker イメージ内に htpasswd コマンドが存在しないためです*3。
したがって、ローカルで実行しましょう。Ubuntu ならば apache2-utils
を apt
でインストールすれば htpasswd コマンドが使えます。
設置確認
正しく起動されたことを確認するために、設置した場所配下の /v2/_catalog
にアクセスしてみましょう。以下のような JSON が返ってきていれば設置OKです。
{ repositories: [ "" ] }
イメージが正しく push できるかどうかも併せて確かめておくといいでしょう。
補足
Docker Registry の各種設定は YAML ファイルで一括して行うことが推奨されています。