Docker: HTTPSによるレジストリを配備


前提


ドキュメント


レジストリの設定YAML: /etc/docker/registry/config.yml

YAMLまるごと上書き: --mount

--mount type=bind,source="$PWD/config.yml",destination=/etc/docker/registry/config.yml

環境変数で一部上書き: --env

# YAML
key1:
  key2:
    key3: value
--env REGISTRY_KEY1_KEY2_KEY3=value

アクセス制限: パスワード方式

YAML

auth:
  htpasswd:
    realm: basic-realm
    path: /path/to/passhash # パスワードハッシュのマウント先

htpasswdコマンド: パスワードハッシュ・ファイル作成

dir=secret; mkdir $dir

# htpasswdコマンドのオプション:
# -B: bcryptによるパスワードハッシュ
# -b:  
# -n: 標準出力
user=myuser
pass=mypass
passhash=$dir/passhash
docker run --rm --entrypoint htpasswd \
  registry:2 -Bbn $user $pass >> $passhash

HTTPSレジストリのYAML

http:
  tls:
    certificate: /path/to/cert.pem # サーバ証明書
    key: /path/to/private-key.pem # プライベート鍵

HTTPSレジストリの起動

dir=secret
passhash=$dir/passhash
cert=$dir/cert.pem
key=$dir/private-key.pem

docker run --rm --detach --publish 5000:5000 \
  --mount type=volume,source=my-image,destination=/var/lib/registry \
  --mount type=bind,source="$PWD/$dir",destination=/$dir \
  --env REGISTRY_AUTH=htpasswd \
  --env REGISTRY_AUTH_HTPASSWD_REALM=basic-realm \
  --env REGISTRY_AUTH_HTPASSWD_PATH=/$passhash \
  --env REGISTRY_HTTP_TLS_CERTIFICATE=/$cert \
  --env REGISTRY_HTTP_TLS_KEY=/$key \
  --name myregistry registry:2

クライアント側の設定

CAの証明書を配置

# CA証明書ないとdocker loginでエラー
Error response from daemon: Get https://レジストリ:5000/v2/: x509: certificate signed by unknown authority

ログインしてからpull

# ログイン
registry=docker.localdomain:5000 # 例
docker login $registry

Username: myuser
Password: 
WARNING! Your password will be stored unencrypted in /home/ユーザ/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#
docker image tag alpine $registry/myalpine:latest
docker push $registry/myalpine:latest
docker pull $registry/myalpine:latest

# 終わったらログアウト
docker logout $registry

ログインしてないとエラー

Error response from daemon: Get https://レジストリ/v2/myalpine/manifests/latest: no basic auth credentials