CentOS 7 で Docker Registry をローカルに立てる

# はじめに
DockerHub にいろいろとイメージがあるものの、自分で作った Docker image を自分のRegistry において好きな時にダウンロードして起動したいと思ってきた。

Dockerfile を用意して DockerHub からダウンロードした Docker image から作成してもいいのだけど意外と時間がかかるので、準備完了状態のイメージを用意して、どっかの Docker のサーバーに置いておきたい。

HTTPS で証明書登録した通信もできるが、内部的な利用のためあくまで、さくっと利用できる環境を用意する方法です。

サーバとクライアントで2つの環境 (VMなど) を用意しておいてください。

# 手順
大まかに以下の手順

* docker のインストール
* docker の起動
* Docker Registry の用意
* サーバ側でイメージの用意(ダウンロードとRegistry)
* Docker Registry からイメージのダウンロード
 * サーバ側でダウンロード
 * クライアント側でダウンロード


## Docker のインストール

Redistry のサーバ、クライアント側にインストールする必要がある。
docker を rpm インストールするにはダウンロード先登録が必要。


```bash
yum -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
```

## Docker の起動

Redistry のサーバ、クライアント側で docker のサービスを起動し、OS起動時に自動起動させる。

```bash
systemctl start docker
systemctl enable docker
```

## Docker Registry の用意

Registry のサーバで、Registry のイメージをダウンロードする

```bash
docker pull registry
```

以下のように docker image が追加される

```bash
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              2d4f4b5309b1        3 months ago        26.2MB
```

## Docker Registry の起動

Docker Registry を起動する。
このとき、Registry 上のイメージを永続化させたいのでホスト OS のディレクトリをコンテナにマウントさせる。

```bash
docker run -d -p 5000:5000 \
	-v /var/opt:/var/lib/registry \
	registry
```

コンテナが起動したことを確認

```bash
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
35b3882b8536        registry            "/entrypoint.sh /etc…"   About an hour ago   Up About an hour    0.0.0.0:5000->5000/tcp   dreamy_roentgen
```


ホスト OS に以下のようなディレクトリができて、この下にマウントされる。

```bash
ls /var/opt/docker/registry/v2/
blobs  repositories
```

イメージを登録すると以下のように repositories 以下にイメージが保存されるディレクトリである。

```bash
ls -l /var/opt/docker/registry/v2/repositories/aaa
合計 0
drwxr-xr-x 5 root root 55  9月 16 15:33 centos_local
```

## サーバ側でイメージの用意(ダウンロードとRegistry)

### ローカルの Repository サーバに登録する元のイメージをダウンロード

なんでもいいが、とりあえず CentOS をダウンロード

```bash
docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
```

ダウンロードできたことを確認

```bash
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        5 weeks ago         215MB
registry            latest              2d4f4b5309b1        2 months ago        26.2MB
```

### docker Resistry へ登録するイメージを作成(タグ付け)

本来は Dockerfile などを利用して様々なツールや設定をしたイメージを作るのだが、今回は単純にダウンロードした CentOS のイメージをそのまま使う

```bash
docker tag centos localhost:5000/aaa/centos_local:1.0
```

タグ付けをすると以下のようにイメージができる

```bash
docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
centos                              latest              0d120b6ccaa8        5 weeks ago         215MB
localhost:5000/aaa/centos_local   1.0                 0d120b6ccaa8        5 weeks ago         215MB
registry                            latest              2d4f4b5309b1        2 months ago        26.2MB
```

### docker Resistry へイメージを登録

タグ付けしたイメージを docker Registry へ登録する

```bash
docker push localhost:5000/aaa/centos_local:1.0
The push refers to repository [localhost:5000/iseki/centos_local]
291f6e44771a: Pushed
1.0: digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71 size: 529
```

登録後は、イメージは不要になるので削除

```bash
docker rmi localhost:5000/iseki/centos_local:1.0
Untagged: localhost:5000/iseki/centos_local:1.0
Untagged: localhost:5000/iseki/centos_local@sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71
```

削除後、一覧にイメージがないことを確認

```bash
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        5 weeks ago         215MB
registry            latest              2d4f4b5309b1        2 months ago        26.2MB
```


# Docker Registry からイメージのダウンロード

## サーバ側でダウンロード
サーバからからは以下のコマンドを実行してダウンロードできる

```bash
docker pull localhost:5000/aaa/centos_local:1.0
```

## クライアント側でダウンロード
クライアント側からは、「クライアント側」に以下の設定を入れないと接続ができない

```bash
cat /etc/docker/daemon.json
{ "insecure-registries":["＜Docker RegistoryのサーバーIP、またはホスト名＞:5000"] }
```

上記の設定をして、docker のサービスを再起動

```bash
systemctl restart docker
```

この状態で、docker Registroy サーバからイメージを取得するコマンドを実行する。

```bash
docker pull 10.1.5.25:5000/aaa/centos_local:1.0
1.0: Pulling from iseki/centos_local
3c72a8ed6814: Pull complete
Digest: sha256:fc4a234b91cc4b542bac8a6ad23b2ddcee60ae68fc4dbd4a52efb5f1b0baad71
Status: Downloaded newer image for 10.1.5.25:5000/aaa/centos_local:1.0
10.1.5.25:5000/aaa/centos_local:1.0
```


docker のイメージがダウンロードされる

```bash
# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
10.1.5.25:5000/aaa/centos_local   1.0                 0d120b6ccaa8        7 weeks ago         215MB
```