Myリポジトリの利用とDocker Registoryの構築。

## はじめに
普段Dockerを利用する際は、初めに登録したDockerHUBのリポジトリからイメージ取得がされている。
これに特別困っていることはないのだが、DockerHUBにMyリポジトリを作ったり、ローカルでDocker Registoryを構築したりもせっかくなので試してみようと思った。

## 実行環境
・VMインスタンス2台（GCP上）

【VM#1（リージョン：東京）】
　・Ubuntu 20.04 LTS
　・docker 19.03

【VM#2（リージョン：US）】
　・Ubuntu 20.04 LTS
　・docker 19.03
　・docker-registory

## 今回の手順

１．VM環境準備
２．DockerHUBにMyリポジトリ作成
３．Docker Registoryの構築



## １．VM環境の構築

**VM#1、VM#2にdockerのインストール**
　[**【Dockerコンテナ内のUbuntuではsystemctlは使えない】**](https://qiita.com/smiler5617/items/2a33d1aba0174480e9d3)の手順１を参考に。


## ２．DockerHUBにMyリポジトリ作成

**DockerHUBへのアカウント登録**
　DockerHUBの公式ページに飛び、サインアップ。
　　https://hub.docker.com/

### VM#1にPush用のイメージを用意

```shell:
$ docker container run -it -d --name con1 ubuntu:18.04
```

**コンテナに入り適当なソフトをインストール**
　※今回もApache2をインストール

```shell:コンテナに入る
$ docker attach con1
```

```shell:コンテナ内のコマンド
apt update
apt -y upgrade 
apt install -y apache2
```

```shell:コンテナ内のコマンド（コンテナから出る）
exit
```

**変更を加えたコンテナをイメージ化する**

```shell
$ docker commit con1 test-myrepo:ver1
```

イメージの確認

```shell:
$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
test-myrepo   ver1      754107070068   54 seconds ago   213MB
ubuntu        18.04     2c047404e52d   3 weeks ago      63.3MB
```

### MyリポジトリにイメージをPush

まずはDockerHUBにログインする

```shell
$ sudo docker login
Username: ******
Password: ******

Login Succeeded
```

`tag`コマンドでレジストリ先・リポジトリを変更したものを用意。

```shell:
$ docker image tag 【イメージID】 【アカウント名(Myリポジトリ)】/【イメージ名】:【タグ】
```

試しにイメージを確認してみる。

```shell:
$ docker image ls
REPOSITORY                 TAG       IMAGE ID       CREATED        SIZE
test-myrepo                ver1      754107070068   19 hours ago   213MB
******/new-img             ver1      754107070068   19 hours ago   213MB
ubuntu                     18.04     2c047404e52d   3 weeks ago    63.3MB
```

DockerHUBにイメージを`Push`

```
$ docker image push 【上記で作成されたイメージ名(アカウント含む)】：【タグ】
```

DockerHUBのページでリポジトリが作成されていれば、Pushは上手くいっている。

※普段`docker image pull`より、【イメージ名】：【タグ】のみでダウンロードできるのは、最初の設定時にデフォルトのレジストリ先を **DockerHUB** 、リポジトリ先をどこかに設定しているから。（上記の`Push`はリポジトリ先をMyリポジトリに変えている。）
例えば、プライベートレジストリにイメージを`Push`や`Pull`する時は、`docker image pull 【レジストリ名】：【リポジトリ名】：【イメージ名】：【タグ】`となる。



### VM#2でMyリポジトリからイメージをPull

`Push`の時と同じくCUIからDockerHUBにログインする

```shell:
$ sudo docker login
Username: ******
Password: ******

Login Succeeded
```

実際の`Pull`コマンドを実行

```shell:
$ docker image pull 【アカウント名(Myリポジトリ)】/【イメージ名】:【タグ】
```

`docker image ls `コマンドなどで確認できれば成功！

ここまでできたら一旦**VM#2**のイメージは消す。

## ３．Docker Registoryの構築（プライベート用）

### VM#2にDockerRegistory 取得

**Registoryのイメージ取得**

```shell:
$ docker image pull registry
```

**Registoryコンテナの起動**

```shell:
$ docker container run -d -p 5000:5000 registry
```


### VM#1からDockerRegistoryに`Push`＆`Pull`

**レジストリ情報を付与したイメージを用意**

```shell:
$ docker image tag 【イメージID】 【DockerRegistoryの内部IP：5000】/【リポジトリ名】:【タグ】
```

**プライベートRegistoryに`Push`**

```shell:
$ docker image push 【DockerRegistoryの内部IP：5000】/【リポジトリ名】:【タグ】
The push refers to repository [xxx.xxx.xxx.xxx:5000/******]
Get https://xxx.xxx.xxx.xxx:5000/v2/: http: server gave HTTP response to HTTPS client
```

しかし上記の様なエラーが出て上手く行かない。


別のdockerクライアントの端末から`Push`や`Pull`を行いたい場合、基本的にはSSLを使った暗号化通信が必要となる。
これはdockerクライアント側で、信頼関係がなく暗号化通信できないサーバーとは通信不可の設定になっているから。

今回は、Registryコンテナが入っているサーバーを限定的にhttp通信ができる様にする。

**VM#１で以下を実行**

`daemon.json`を作成

```shell:
$ sudo nano /etc/docker/daemon.json
```

```json:daemon.json
{"insecure-registries":["DockerRegistoryの内部IP:5000"]}
```

docker再起動

```shell:
$ sudo systemctl restart docker
```

`Inseure Registoryes`に追加されているか確認

```shell:
$ docker info
・・・
・・・
 Experimental: false
 Insecure Registries:
  xxx.xxx.xxx.xxx:5000
  127.0.0.0/8
 Live Restore Enabled: false
・・・
・・・
```

**この状態で再度プライベートRegistoryにPush**

```shell:
$ sudo docker push 【DockerRegistoryの内部IP：5000】/【リポジトリ名】:【タグ】
The push refers to repository [xxx.xxx.xxx.xxx:5000/*******]
2a42637bbd9b: Pushing [====================>                              ]  62.14MB/149.7MB
fe6d8881187d: Pushed 
23135df75b44: Pushed 
b43408d5f11b: Pushing [========================================>          ]   51.5MB/63.25MB
```

**ちゃんとPushできる事を確認！**
　※ちなみにPullも試したけど問題なくできた。