【docker】docker-registryを導入する ～初期設定編～

業務でdocker-registryを導入する機会があり、復習のため再度デプロイします。
環境はAWS/EC2を使用しました。

# docker-registryとは何か
コンテナイメージを格納する場所です。docker-registry自体もコンテナイメージとして提供されています。

# 環境
![ec2_docker-registry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1464314/250e9c2e-9ae0-92a3-d370-992e465831d0.png)

**【クライアント】**

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ docker --version
Docker version 20.10.3, build 48d30b5
```

**【サーバ】**

```bash
$ 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
```

※[ドキュメント](https://docs.docker.com/registry/#requirements)によるとdocker-registryが稼働するホストのdockerバージョンは1.6.0以上が望ましいと記載があります。試す場合はdockerのバージョンをあらかじめ確認しましょう。

# やりたいこと
1. [docker-registryのデプロイ](#1-docker-registryのデプロイ)
2. [docker-registryにパスワードを設定する](#2-docker-registryにパスワードを設定する)
3. [docker-registryのアクセスログを出力する](#3-docker-registryのアクセスログを出力する)
4. [データの永続化を行う](#4-データの永続化を行う)

# 1. docker-registryのデプロイ
## イメージのpull 
使用するのはdocker公式に記載のあるregistryです。cliだと以下で確認できます   
**【サーバ作業】**

```bash
$ 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であるため、忘れずに指定します。

```bash
$ docker run -d -p 5000:5000 --name registry registry:2
...
Status: Downloaded newer image for registry:2
9c35e33e6b6cf5035731c2172b0b0ecfcd20e1ac17c5e598675f7fcaaedba035

# -d デタッチ。バックグラウンドで動作させる
```
最後にイメージIDが出てきたら成功です。確認してみましょう。

```bash
$ 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公式イメージからコンテナをたてます。

**【クライアント作業】**

```bash
### イメージ確認
$ 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してみます。デプロイしたコンテナはイメージ削除をするため削除しましょう

```bash
$ docker rm -f test-nginx
test-nginx
```

## registryへのpush,pull
テスト用と識別するためにタグを付けます。
タグのフォーマットは以下となりますので、環境に合わせて名づけましょう。今回はホスト名にEC2のpublic DNSをつけています

```bash
### リポジトリで管理する場合
<ホスト名>:<ポート番号>/<リポジトリ>/<イメージ名>:<タグ>

### リポジトリで管理しない場合
<ホスト名>:<ポート番号>/<イメージ名>:<タグ>
```

フォーマットにしたがってタグを付けます

```bash
$ 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します

```bash
$ 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するサーバで以下を実施します。  

```bash
$ 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します

```bash
$ 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したイメージが使用できるか試しましょう

```bash
$ 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が変わっていますが、同環境です。**

```yaml:config.yml
version: 0.1
auth:
  htpasswd:
    realm: basic-realm
    path: /auth/htpasswd
```

htpasswdファイルが必要なため、ホスト側で作成してコンテナと共有するようにします

```bash
$ htpasswd -c -b -B test.htpasswd test test
Adding password for user test

# -c 新規htpasswdファイル作成
# -b コマンドラインからのパスワードを受け取る
# -B bcrypt方式を使う。bcryptはハッシュパスワード生成方式の一つ
```

では立ち上げてみましょう
## 新しいregistryをデプロイ
重複を避けるため、ホストの5001番ポートを使用します

```bash
### 立ち上げ
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コマンドで見てみましょう

```bash
$ 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を見てみる

```yaml
### 対象確認
$ 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設定を入れてみます。
## 再度設定ファイルを作成する

```yaml:config.yml
version: 0.1
storage:
  cache: # ディスクキャッシュの格納場所。コンテナのメモリ領域を使用する。
    blobdescriptor: inmemory
  filesystem: # ローカルのファイルシステムを使用
    rootdirectory: /var/lib/registry # /var/lib/registryにコンテナイメージを格納
auth:
  htpasswd:
    realm: basic-realm
    path: /auth/htpasswd
```

## 再デプロイ
再びデプロイしてみます

```bash
### 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を試してみましょう。

## 認証の確認をする
まずパスワードを使用しないパターンを試します
**【クライアント作業】** 

```bash
### 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メソッドを使って情報を取得できます([ここ](https://docs.docker.com/registry/spec/api/#listing-repositories))。GETでレジストリ一覧を確認し、疎通確認をしてみます。

```bash
### 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パラメータは設定が必須であったため、追記します。
**【サーバ作業】**

```yaml:config.yml
version: 0.1
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000 # 5000番でコネクションを受け付ける
auth:
  htpasswd:
    realm: basic-realm
    path: /auth/htpasswd
```

## 接続
再度接続してみます。  
**【クライアント作業】**

```bash
$ docker login ec2-54-250-153-222.ap-northeast-1.compute.amazonaws.com:5001
Username: test
Password:
....
Login Succeeded
```

うまくいきました。pushしてみます

```bash
$ 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すると以下の様に失敗します。

```bash
$ 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に適用します。  
**【サーバ作業】**

```yaml: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番ポートに新しく立ち上げました。

```bash
$ 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でアクセスログを確かめてみましょう  
**【クライアント作業】**

```bash
$ 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```で見てみましょう  
**【サーバ作業】**

```bash
$ 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```を行うタイミングでディレクトリ共有してみます。 　
**【サーバ作業】**

```bash
$ 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します。
**【クライアント作業】**  

```bash
$ 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ディレクトリも共有されています

```bash
$ 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できるか確認してみます。イメージは削除済みです。  
**【サーバ作業】**

```bash
$ 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
```

**【クライアント作業】**

```bash
### リポジトリの有無を確認
$ 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