Docker Registry を立てるときの docker-compose.yml

Docker Registry とは

要は自前で立てる Docker Hub です。公式に提供されています。

docs.docker.com

結論

以下のような 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-utilsapt でインストールすれば htpasswd コマンドが使えます。

設置確認

正しく起動されたことを確認するために、設置した場所配下の /v2/_catalog にアクセスしてみましょう。以下のような JSON が返ってきていれば設置OKです。

{
  repositories: [
    ""
  ]
}

イメージが正しく push できるかどうかも併せて確かめておくといいでしょう。

補足

Docker Registry の各種設定は YAML ファイルで一括して行うことが推奨されています。

*1:ファイル名は、docker-compose.yml 内での設定が合致していれば任意でよい

*2:そのため、nginx でのリバースプロキシの接続先が HTTPS です

*3:すでに Issue や Pull Request が出ています

Powered by はてなブログ