イントラネット内に立ち上げた Nexus Repository Manager3 を DockerHub のミラーレジストリにする

# はじめに

[Nexus Repository Manager3 の Docker コンテナを HTTPS 化](https://qiita.com/nminoru/items/8475cfadaf32d2a6c409)では、自己証明書を使ってイントラネット内に HTTPS 化した Nexus コンテナを立ち上げたが、これを DockerHub のプライベートリポジトリ(ミラーレジストリ)にする。

# Nexus の設定
まず Nexus サーバーの設定を行う。サーバーは以下の設定で動いているとする。

- host.example.com (10.20.230.17) で稼動しているとする。
- すでに 8081/tcp で HTTP サービスが、8082/tpc で HTTPS サービスで動作しているとする。
- 管理アカウントは admin/admin123 とする。

## Docker Proxy リポジトリの作成

Nexus にアクセスし、リポジトリを作成する。
Nexus に管理カウントでログインし、メニューバーの歯車をアイコンをクリックすると Administratorion 画面に移動する。

![Administration.png](https://qiita-image-store.s3.amazonaws.com/0/59327/e1b94444-0549-2045-eafe-bbe95232fd11.png)

左メニューの Repository > Repositories を選択した後に、「Create repository」ボタンを押す。
下の図のように作成可能なリポジトリの一覧が表示されるので「docker(proxy)」を選択する。

![Repositories.png](https://qiita-image-store.s3.amazonaws.com/0/59327/d76d55f6-858e-4409-b3eb-e8c898699ca8.png)

- 「Name」は他のリポジトリと重複しないものを自由につけてよい。
- HTTPS にチェックを付けて新しいポートを付ける。Nexus サーバーは 8081 と 8082 を使っているので、8083 とする。これは Docker をコンテナ運用する場合は、docker run 時にこのポートも公開しておく必要がある。
- このプライベート Docker リポジトリに認証なし(Anonymous化)でアクセスするには「Force basic authentication」の「Disable to allow anonymous pull」のチェックを外しておく。
- 「Docker Registry API Support」の「Enable Docker V1 API」の「Allow clients to use the V1 API to interact with this Repository」のチェックする。
- 「Proxy」の「Remote Storage」には `https://registry-1.docker.io` を指定する。また「Docker Index」のラジオボタンを `Use Docker Hub` を選択する。

全てを選択したら一番下にある「Create Repository」ボタンを押すと作成完了。

![DockerHub.png](https://qiita-image-store.s3.amazonaws.com/0/59327/475ff239-bcfe-b68e-12e0-6694e989dd82.png)

## アカウントの作成
プライベート Docker リポジトリにアクセスする専用アカウントを作成した場合は、左メニューの Security > Users を選択し適当なアカウントを作成する。これは Docker リポジトリ以外の Maven や yum のリポジトリとも共用できる。

## Anonymous 化
プライベート Docker リポジトリに認証なしでアクセスしたい場合には、以下のような手順を行う。
左メニューの Security > Realms を選択し、Acitve realms に「Docker Bearer Token Realm」を Active 化に移動する。

![キャプチャ5.png](https://qiita-image-store.s3.amazonaws.com/0/59327/971c3d8a-9d36-d48e-3c2e-c3f531b77620.png)

さらに左メニューの Security > Anonymous を選択し、Realm を `Docker Bearer Token Realm` を選択する。

![anonymous.png](https://qiita-image-store.s3.amazonaws.com/0/59327/8db41f77-4cca-21f5-c8bf-0d139a354095.png)

## SSL サーバー証明書の作成
host.example.com が自己証明書で運用するために、これを使う Docker クライアント側に登録するための SSL サーバー署名書を用意しておく必要がある。

```
$ keytool -printcert -sslserver host.example.com:8083 -rfc > ca.crt
```

作成した ca.crt を保存しておき後で使う。

# Docker クライアント側の設定

イントラネットの Linux サーバーで作成した Nexus サーバーのプライベート Docker リポジトリを使用する場合、いろいろおまじないが必要となる。

まずプライベート Docker リポジトリを使用したい全ての Linux サーバーの中で以下のようなディレクトリを作成し、ca.crt を格納する。

```
# mkdir -p /etc/docker/certs.d/host.example.com:8083
# cp ca.crt /etc/docker/certs.d/host.example.com:8083/
```

この設定の後は、プライベート docker リポジトリにアクセスするには Security > Users で作成したアカウントでログインする。Anonymous 化が成功していればログインは不要である。

```
# docker login host.example.com:8083
```

この後は DockerHub.com のプロキシとしてコンテナを pull することができる。

```
# docker pull host.example.com:8083/debian
```

# 参考

- Sonatype Support | [Using Self-Signed Certificates with Nexus Repository Manager and Docker Daemon](https://support.sonatype.com/hc/en-us/articles/217542177?_ga=2.58431210.1531487987.1543677176-929036.1543677176)
- Docker Documentation | [Verify repository client with certificates](https://docs.docker.com/engine/security/certificates/)