DockerRegistry構築

# はじめに
DockerImageは、DockerHubと呼ばれるWebサイトでパブリックに公開されています。
DockerHubを使用してインターネット上に公開することもできますが、
プライベートで使用したい場合を考えて、プライベートなDockerRegistryを構築します。
様々な方法がありますが、今回はDocker公式から提供されているコンテナイメージを使用して構築します。

# DockerRegistry構築
## ローカルレジストリをコンテナとして実行
以下コマンドを実行して、ローカルレジストリをコンテナとして実行します  
オプションの説明
-d : コンテナ実行をバックグラウンドで実行する。また、コンテナーIDを表示する。
-p : コンテナのポートをホストに公開します。 ホスト側のポート：コンテナ側のポート
--restart : コンテナが存在しているときの、restartのポリシーを設定します
--name : コンテナに名前を指定します
registory:2 : コンテナを実行する際に指定するイメージ名の指定。存在しない場合はDockerHubからダウンロードする

```
docker run -d -p 5000:5000 --restart=always --name registry registry:2
```

実行例

```
[root@sugi-docker-registory ~]# docker run -d -p 5000:5000 --restart=always --name registry registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
81033e7c1d6a: Pull complete
b235084c2315: Pull complete
c692f3a6894b: Pull complete
ba2177f3a70e: Pull complete
a8d793620947: Pull complete
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for registry:2
e03c7a5b8ded2a9b68a045eba91eccb15c7567ef51d464719528c1757cecda43
```

registryコンテナが稼働している

```
[root@sugi-docker-registory ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e03c7a5b8ded        registry:2          "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry
```

## registryを他のDockerから参照
registryとは他の物理マシンに稼働しているDockerから、registryを参照する  

dockerを設定変更

```
cat <<'EOF' > /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.120.210:5000"]
}
EOF
```

Dockerの再起動

```
systemctl restart docker
```

ローカルregistryが参照できるか確認  
正常にhttpでアクセスが出来る

```
[root@sugi-docker-01 ~]# curl -XGET http://192.168.120.210:5000/v2/_catalog
{"repositories":[]}
```

DockerHubからCentOSのDockerImageをダウンロード

```
docker pull centos
```

確認

```
[root@sugi-docker-01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              2d194b392dd1        4 days ago          195MB
```

ダウンロードしてきたcentosのイメージにタグを付与

```
docker tag centos 192.168.120.210:5000/hogehoge
```

ローカルregistryへpushしてみる

```
docker push 192.168.120.210:5000/hogehoge
```

実行例

```
[root@sugi-docker-01 ~]# docker push 192.168.120.210:5000/hogehoge
The push refers to repository [192.168.120.210:5000/hogehoge]
b03095563b79: Pushed
latest: digest: sha256:8c7ac054adab3692f7026d49fd1c4df69aa6a138b2f076b432d2ac0164c022d3 size: 529
```

ローカルregistryに追加された

```
[root@sugi-docker-01 ~]# curl -XGET http://192.168.120.210:5000/v2/_catalog
{"repositories":["hogehoge"]}
```

pullしてみる

```
docker pull 192.168.120.210:5000/hogehoge
```

実行例

```
[root@sugi-docker-01 ~]# docker pull 192.168.120.210:5000/hogehoge
Using default tag: latest
latest: Pulling from hogehoge
5e35d10a3eba: Pull complete
Digest: sha256:8c7ac054adab3692f7026d49fd1c4df69aa6a138b2f076b432d2ac0164c022d3
Status: Downloaded newer image for 192.168.120.210:5000/hogehoge:latest
```

imageを確認

```
[root@sugi-docker-01 ~]# docker image ls
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
192.168.120.210:5000/hogehoge   latest              2d194b392dd1        4 days ago          195MB
```

コンテナを起動してみる

```
docker run -d -p 5001:5001 --name test_pull -it 192.168.120.210:5000/hogehoge /bin/bash
```

確認

```
[root@sugi-docker-01 ~]# docker ps
CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                    NAMES
22f9dcc1b183        192.168.120.210:5000/hogehoge   "/bin/bash"         7 seconds ago       Up 6 seconds        0.0.0.0:5001->5001/tcp   test_pull
```

コンテナ上でコマンド実行

```
docker exec -it test_pull yum install -y iproute tcpdump
```

ip address 確認

```
[root@sugi-docker-01 ~]# docker exec -it test_pull ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
```

# 参考URL
DockerRegistryの構築  
https://docs.docker.com/registry/

セキュリティを無視した構築
https://docs.docker.com/registry/insecure/