業務でdocker-registryを導入する機会があり、復習のため再度デプロイします。
環境はAWS/EC2を使用しました。
docker-registryとは何か
コンテナイメージを格納する場所です。docker-registry自体もコンテナイメージとして提供されています。
環境
【クライアント】
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ docker --version
Docker version 20.10.3, build 48d30b5
【サーバ】
$ uname -a
Linux ip-192-168-100-209.ap-northeast-1.compute.internal 4.14.231-173.360.amzn2.x86_64 #1 SMP Mon Apr 19 23:20:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ docker --version
Docker version 20.10.4, build d3cb89e
※ドキュメントによるとdocker-registryが稼働するホストのdockerバージョンは1.6.0以上が望ましいと記載があります。試す場合はdockerのバージョンをあらかじめ確認しましょう。
やりたいこと
1. docker-registryのデプロイ
イメージのpull
使用するのはdocker公式に記載のあるregistryです。cliだと以下で確認できます
【サーバ作業】
$ docker search registry --filter is-official=true --no-trunc
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
registry The Docker Registry 2.0 implementation for storing and distributing Docker images 3274 [OK]
# --filter is-official=trueで公式イメージのみを出力
# --no-truncで出力を省略しない
デプロイ
以下でデプロイします。registryが使用するポートは5000であるため、忘れずに指定します。
$ docker run -d -p 5000:5000 --name registry registry:2
...
Status: Downloaded newer image for registry:2
9c35e33e6b6cf5035731c2172b0b0ecfcd20e1ac17c5e598675f7fcaaedba035
# -d デタッチ。バックグラウンドで動作させる
最後にイメージIDが出てきたら成功です。確認してみましょう。
$ docker images registry:2
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 1fd8e1b0bb7e 2 weeks ago 26.2MB
$ docker container ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c35e33e6b6cf5035731c2172b0b0ecfcd20e1ac17c5e598675f7fcaaedba035 registry:2 "/entrypoint.sh /etc/docker/registry/config.yml" 2 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp registry
先ほどのログと同じImageIDが出てきました。問題なさそうです。
nginxコンテナをデプロイ
問題なくpush,pullできるかを確認するため、例としてnginx公式イメージからコンテナをたてます。
【クライアント作業】
### イメージ確認
$ docker search nginx --filter is-official=true
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 14814 [OK]
### nginxコンテナをデプロイ
$ docker run -i -d -p 8080:80 --name test-nginx nginx:latest
Status: Downloaded newer image for nginx:latest
21e118a574751848dd2b2c1a28d20852d5348004c9909b5539a8cb32f1d7d9e0
### 確認
$ docker container ps --no-trunc | grep nginx
21e118a574751848dd2b2c1a28d20852d5348004c9909b5539a8cb32f1d7d9e0 nginx:latest "/docker-entrypoint.sh nginx -g 'daemon off;'" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp test-nginx
$ docker images nginx:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62d49f9bab67 3 weeks ago 133MB
### 疎通確認
$ curl localhost:8080 -I
HTTP/1.1 200 OK
Server: nginx/1.19.10
Date: Wed, 05 May 2021 06:02:33 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Apr 2021 15:13:59 GMT
Connection: keep-alive
ETag: "6075b537-264"
Accept-Ranges: bytes
問題なさそうですね。このイメージをpushしてみます。デプロイしたコンテナはイメージ削除をするため削除しましょう
$ docker rm -f test-nginx
test-nginx
registryへのpush,pull
テスト用と識別するためにタグを付けます。
タグのフォーマットは以下となりますので、環境に合わせて名づけましょう。今回はホスト名にEC2のpublic DNSをつけています
### リポジトリで管理する場合
<ホスト名>:<ポート番号>/<リポジトリ>/<イメージ名>:<タグ>
### リポジトリで管理しない場合
<ホスト名>:<ポート番号>/<イメージ名>:<タグ>
フォーマットにしたがってタグを付けます
$ docker image tag nginx ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
$ docker images | grep nginx
nginx latest 62d49f9bab67 3 weeks ago 133MB
ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx test 62d49f9bab67 3 weeks ago 133MB
pushします
$ docker push ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
The push refers to repository [ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx]
Get https://ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/v2/: http: server gave HTTP response to HTTPS client
エラーになりました。
https接続しなければ行けないところでhttp接続をしていたためにエラーが出た様です。
証明書を作成する必要があるのですが、今回はhttpで接続できるようにします。
httpsで接続する方法は別の機会に投稿したいと思っています。
クライアントにdaemon.jsonを追加
ドキュメントに記載の方法で行います。安全な方法ではないためご承知おきください。pull,pushするサーバで以下を実施します。
$ vi /etc/docker/daemon.json
$ cat /etc/docker/daemon.json
{
"insecure-registries" : ["ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000"]
}
### 反映のため、サービス再起動
$ sudo systemctl restart docker
再度pushします
$ docker push ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
The push refers to repository [ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx]
64ee8c6d0de0: Layer already exists
974e9faf62f1: Layer already exists
15aac1be5f02: Layer already exists
23c959acc3d0: Layer already exists
4dc529e519c4: Layer already exists
7e718b9c0c8c: Layer already exists
test: digest: sha256:42bba58a1c5a6e2039af02302ba06ee66c446e9547cbfb0da33f4267638cdb53 size: 1570
できました!
手元のイメージを削除し、↑でpushしたイメージが使用できるか試しましょう
$ docker rmi nginx:latest
$ docker rmi ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
$ docker images | grep nginx
$
### imageのpull
$ docker pull ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
test: Pulling from nginx
f7ec5a41d630: Pull complete
aa1efa14b3bf: Pull complete
b78b95af9b17: Pull complete
c7d6bca2b8dc: Pull complete
cf16cd8e71e0: Pull complete
0241c68333ef: Pull complete
Digest: sha256:42bba58a1c5a6e2039af02302ba06ee66c446e9547cbfb0da33f4267638cdb53
Status: Downloaded newer image for ec2-52-197-137-171.ap-northeast-1.com
### nginxコンテナの起動、確認
$ docker run -i -d -p 8080:80 --name test-nginx-again ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test
af5f53d7387c66d0dc42e05b2231c03cbf0dd599b2f91ddd2dc769d3770c0180
$ curl localhost:8080 -I
HTTP/1.1 200 OK
Server: nginx/1.19.10
Date: Wed, 05 May 2021 06:33:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Apr 2021 15:13:59 GMT
Connection: keep-alive
ETag: "6075b537-264"
Accept-Ranges: bytes
無事pushできました!
2. docker-registryにパスワードを設定する
デフォルトではdocker-registryにパスワードは設定されていませんが、以下の方法で設定可能です。今回はhtpasswdを利用します
- silly
- token
- htpasswd
またこういった設定をregistryに対して行うには以下の2つがあげられます
- 公式イメージに環境変数を設定する
- 設定ファイルを適用させる
今回は後者を使いたいと思います。
設定ファイルを作る
設定ファイルを作り、docker-registryに適用させます。ドキュメントの例から必要そうな設定をコピペしました。
【サーバ作業】
※ EC2を停止したためpublic DNSが変わっていますが、同環境です。
version: 0.1
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd
htpasswdファイルが必要なため、ホスト側で作成してコンテナと共有するようにします
$ htpasswd -c -b -B test.htpasswd test test
Adding password for user test
# -c 新規htpasswdファイル作成
# -b コマンドラインからのパスワードを受け取る
# -B bcrypt方式を使う。bcryptはハッシュパスワード生成方式の一つ
では立ち上げてみましょう
新しいregistryをデプロイ
重複を避けるため、ホストの5001番ポートを使用します
### 立ち上げ
docker run -d -p 5001:5000 --restart=always --name registry-htpasswd \
-v `pwd`/config.yml:/etc/docker/registry/config.yml \
-v `pwd`/test.htpasswd:/auth/htpasswd \
registry:2
afe3cad9f424352ba4768aab734f989cabf148b66e887eda2d076a5d8e319968
### 確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afe3cad9f424 registry:2 "/entrypoint.sh /etc…" 46 seconds ago Restarting (1) 14 seconds ago registry-htpasswd
9c35e33e6b6c registry:2 "/entrypoint.sh /etc…" 7 hours ago Up 41 minutes 0.0.0.0:5000->5000/tcp registry
Restartingが出力されました。しばらく待ってもrunningとならないため、調査を実施します。
コンテナのログを見てみる
docker logsコマンドで見てみましょう
$ docker logs registry-htpasswd
configuration error: error parsing /etc/docker/registry/config.yml: No storage configuration provided
Usage:
registry serve <config> [flags]
Flags:
-h, --help=false: help for serve
Additional help topics:
configuration error: error parsing /etc/docker/registry/config.yml: No storage configuration provided
Usage:
registry serve <config> [flags]
Flags:
-h, --help=false: help for serve
Additional help topics:
configuration error: error parsing /etc/docker/registry/config.yml: No storage configuration provided
Usage:
registry serve <config> [flags]
Flags:
-h, --help=false: help for serve
...
# あとはこれの繰り返し
config.ymlのstorage設定が足りていない様です。さらにあたりを付けるために、最初にデプロイしたregistryのconfig.ymlを見てみます
config.ymlを見てみる
### 対象確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afe3cad9f424 registry:2 "/entrypoint.sh /etc…" 7 minutes ago Restarting (1) 26 seconds ago registry-htpasswd
9c35e33e6b6c registry:2 "/entrypoint.sh /etc…" 7 hours ago Up 48 minutes 0.0.0.0:5000->5000/tcp registry
### registryの中に入る
$ docker exec -it registry sh
/ #
### config.ymlを見る
/ # cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
### 抜ける
/ # exit
こちらにもstorage設定がありました。いろいろ設定がありますが、ひとまずstorage設定を入れてみます。
再度設定ファイルを作成する
version: 0.1
storage:
cache: # ディスクキャッシュの格納場所。コンテナのメモリ領域を使用する。
blobdescriptor: inmemory
filesystem: # ローカルのファイルシステムを使用
rootdirectory: /var/lib/registry # /var/lib/registryにコンテナイメージを格納
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd
再デプロイ
再びデプロイしてみます
### restarting状態のコンテナ削除
$ docker rm -f registry-htpasswd
registry-htpasswd
### デプロイ
$ docker run -d -p 5001:5000 --restart=always --name registry-htpasswd \
> -v `pwd`/config.yml:/etc/docker/registry/config.yml \
> -v `pwd`/test.htpasswd:/auth/htpasswd \
> registry:2
2d1b34cc45c484aab15ac2abff4f75c16d3d4bc42c8ec25fc2aa39272da30a43
### 確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d1b34cc45c4 registry:2 "/entrypoint.sh /etc…" 3 seconds ago Up 2 seconds 0.0.0.0:5001->5000/tcp registry-htpasswd
9c35e33e6b6c registry:2 "/entrypoint.sh /etc…" 7 hours ago Up About an hour 0.0.0.0:5000->5000/tcp registry
今度はうまく行ってそうです。ログイン、push,pullを試してみましょう。
認証の確認をする
まずパスワードを使用しないパターンを試します
【クライアント作業】
### 5001番ポートもhttp通信を許可する
$ sudo vi /etc/docker/daemon.json
$ cat /etc/docker/daemon.json
{
"insecure-registries" : [
"ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5000",
"ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001"
]
}
$ sudo systemctl restart docker
### タグを5001番ポートに変更
$ docker image tag ec2-52-197-137-171.ap-northeast-1.compute.amazonaws.com:5000/nginx:test ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001/nginx:test
### ログイン
$ docker login ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001
Username: test
Password:
Error response from daemon: Get http://ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001/v2/: dial tcp 3.113.20.153:5001: connect: connection refused
どういうわけか失敗。また調査をします。
Registry APIを通して疎通確認をする
docker-registryはhttpメソッドを使って情報を取得できます(ここ)。GETでレジストリ一覧を確認し、疎通確認をしてみます。
### 5000番ポートのregistryの場合
$ curl http://ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5000/v2/_catalog
{"repositories":["nginx"]}
### 5001番ポートのregistryの場合
$ curl http://ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001/v2/_catalog
curl: (7) Failed connect to ec2-3-113-20-153.ap-northeast-1.compute.amazonaws.com:5001; 接続を拒否されました
5000番の方はAPIと通信可能なため、daemonファイルは間違っていなさそうです。それではconfig.ymlに足りない内容があるのでしょうか
config.ymlを編集
ドキュメントを確認したところ、httpオプションのaddrパラメータは設定が必須であったため、追記します。
【サーバ作業】
version: 0.1
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000 # 5000番でコネクションを受け付ける
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd
接続
再度接続してみます。
【クライアント作業】
$ docker login ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001
Username: test
Password:
....
Login Succeeded
うまくいきました。pushしてみます
$ push ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001/alpine:test
The push refers to repository [ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001/alpine]
b2d5eeeaba3a: Pushed
test: digest: sha256:def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748 size: 528
問題なくできました!
ちなみに認証情報は~/.docker/config.jsonにdocker login
時に保存されています。その認証情報を消してpullすると以下の様に失敗します。
$ cat ~/.docker/config.json
{
"auths": {
"ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001": {
"auth": "dGVzdDp0ZXN0"
}
}
}
$ rm -f ~/.docker/config.json
$ docker pull ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001/alpine:test
Error response from daemon: Head http://ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001/v2/alpine/manifests/test: no basic auth credentials
ログインする前に上記のファイルを用意しておくとdocker loginを省略できます。
3. docker-registryのアクセスログを出力する
開発、運用ではログ確認は必須なので出力方法を確認します。先ほどのconfig.ymlに適用します。
【サーバ作業】
version: 0.1
log:
accesslog:
disabled: false # アクセスログを有効にするか。falseで有効にする
level: warn # ログレベル。error,warn,info,debugより選択
formatter: text # 出力方式。text,json,logstashより選択
fields:
environment: test # ログにこのkey:valueが記載される
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd
それでは同じくコンテナを起動します。5002番ポートに新しく立ち上げました。
$ docker run -d -p 5002:5000 --restart=always --name registry-accesslog \
> -v `pwd`/config.yml:/etc/docker/registry/config.yml \
> -v `pwd`/test.htpasswd:/auth/htpasswd \
> registry:2
da913907d63db081a4187e82eef2aaca50fe4064bbcb513792979f2e1aea76ff
$ docker ps | grep 5002
da913907d63d registry:2 "/entrypoint.sh /etc…" 9 seconds ago Up 8 seconds 0.0.0.0:5002->5000/tcp registry-accesslog
ログインからのpushでアクセスログを確かめてみましょう
【クライアント作業】
$ docker login ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5002
Username: test
Password:
...
Login Succeeded
$ docker push ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5002/alpine:test
The push refers to repository [ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5002/alpine]
b2d5eeeaba3a: Pushed
test: digest: sha256:def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748 size: 528
ドキュメントによるとアクセスログは標準出力に出るそうです。pushした時のログをdocker logs
で見てみましょう
【サーバ作業】
$ docker logs registry-accesslog
...
time="2021-05-08T13:42:54.239202664Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." environment=test go.version=go1.11.2 instance.id=024cd523-5f2b-4808-9437-d0cbe5a6d11a version=v2.7.1
...
xxx.xxx.xxx.xxx - - [08/May/2021:13:45:55 +0000] "GET /v2/ HTTP/1.1" 401 87 "" "docker/20.10.3 go/go1.13.15 git-commit/46229ca kernel/3.10.0-1160.15.2.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.3 \\(linux\\))"
いろいろ省略していますが、最初の例ではenvironment:testが表示され、二つ目の例ではアクセスログが出力されています。
4. データの永続化を行う
イメージのpushを行いましたが、コンテナを削除するとそのデータは消えてしまいます。データを残すためにはコンテナとホストでデータ(ディレクトリ)を共有する必要があります。
docker run
を行うタイミングでディレクトリ共有してみます。
【サーバ作業】
$ docker run -d -p 5003:5000 --restart=always --name registry-volume \
> -v `pwd`/config.yml:/etc/docker/registry/config.yml \
> -v `pwd`/test.htpasswd:/auth/htpasswd \
> -v `pwd`/data:/var/lib/registry \
> registry:2
aaacfe335903929d783c5003ec554b4e351f362df67760a8b29c6b11d0a5b46a
ここにイメージをpushします。
【クライアント作業】
$ docker login ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003
Login Succeeded
$ docker push ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/alpine:test
The push refers to repository [ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/alpine]
b2d5eeeaba3a: Pushed
$ curl -u test:test http://ec2-54-250-153-222.ap-northeas
t-1.compute.amazonaws.com:5003/v2/_catalog
{"repositories":["alpine"]}
問題なくpushできました。dataディレクトリも共有されています
$ ll
total 8
-rw-rw-r-- 1 ec2-user ec2-user 299 May 8 13:35 config.yml
drwxrwxr-x 3 ec2-user ec2-user 20 May 8 14:13 data
-rw-rw-r-- 1 ec2-user ec2-user 66 May 5 09:18 test.htpasswd
$ tree data/
data/
mqq docker
mqq registry
mqq v2
tqq blobs
x?? mqq sha256
x?? tqq 54
x?? x?? mqq 540db60ca9383eac9e418f78490994d0af424aab7bf6d0e47ac8ed4e2e9bcbba
x?? x?? mqq data
x?? tqq 6d
x?? x?? mqq 6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec
x?? x?? mqq data
x?? mqq de
x?? mqq def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748
x?? mqq data
mqq repositories
mqq alpine
tqq _layers
x?? mqq sha256
x?? tqq 540db60ca9383eac9e418f78490994d0af424aab7bf6d0e47ac8ed4e2e9bcbba
x?? x?? mqq link
x?? mqq 6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec
x?? mqq link
tqq _manifests
x?? tqq revisions
x?? x?? mqq sha256
x?? x?? mqq def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748
x?? x?? mqq link
x?? mqq tags
x?? mqq test
x?? tqq current
x?? x?? mqq link
x?? mqq index
x?? mqq sha256
x?? mqq def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748
x?? mqq link
mqq _uploads
28 directories, 8 files
一度コンテナを削除し、pullできるか確認してみます。イメージは削除済みです。
【サーバ作業】
$ docker rm -f registry-volume
$ docker run -d -p 5003:5000 --restart=always --name registry-volume \
-v `pwd`/config.yml:/etc/docker/registry/config.yml \
-v `pwd`/test.htpasswd:/auth/htpasswd \
-v `pwd`/data:/var/lib/registry \
registry:2
【クライアント作業】
### リポジトリの有無を確認
$ curl -u test:test http://ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/v2/_catalog
### 再度pullできるか確認
$ docker pull ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/alpine:test
test: Pulling from alpine
540db60ca938: Already exists
Digest: sha256:def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748
Status: Downloaded newer image for ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/alpine:test
ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5003/alpine:test
問題なくできました。コンテナのデータを残しておくために、必要なデータはホストや外部サーバと共有しましょう
最後に
パスワード認証が必要なdocker-registryを導入できました。
次はhttps接続できるようにしたいと思います。
参考
- registryデプロイ
https://docs.docker.com/registry/deploying/ - タグ設定
https://docs.docker.com/engine/reference/commandline/tag/#tag-an-image-for-a-private-repository - http接続のためのdocker-daemon設定
https://docs.docker.com/registry/insecure/ - パスワードを設定
https://docs.docker.com/registry/deploying/#native-basic-auth
https://docs.docker.com/registry/configuration/#htpasswd - ストレージ設定
https://docs.docker.com/registry/configuration/#storage
https://github.com/docker/docker.github.io/blob/master/registry/storage-drivers/filesystem.md - ログ設定
https://docs.docker.com/registry/configuration/#log - ボリューム共有
https://docs.docker.com/registry/deploying/#customize-the-storage-location - 参考にさせていただきました。ありがとうございます。
https://qiita.com/Brutus/items/da63d23be32d505409c6