dockerのプライベートレジストリに作ったコンテナを格納する～EHW2018「MVPをコンテナ化③」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/7向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、前回作ったコンテナをローカルのregistryに登録することです。

# 前提

## おことわり

- このエントリは、インターネットに直接アクセスできる環境を前提としています。インターネットと断絶された世界での運用は、Advent Calendarに余裕があれば、別エントリでまとめてとりあげます。

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> コンテナは、registryに登録し、そこからコンテナをdocker pull必要がある。

## OS

このエントリは、下記の環境でお送りします。

```bash
$ cat /etc/os-release | grep PRETTY
PRETTY_NAME="Ubuntu 18.04.1 LTS"
$ uname -a
Linux Ubuntu1804 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

# Docker private regitryを作る

以下の前提でprivate registryを作ります。
- 証明書は、自己証明書を使う。(ローカルに構築したいので、Let's encryptは使えないため)

参照先：下記サイトに従っています。

- [公式サイトの「Deploy a registry server」](https://docs.docker.com/registry/deploying/)


## イメージの格納場所を準備する

```shell-session
$ sudo mkdir /var/private-registry
```

公式サイトの[Test an insecure registry](https://docs.docker.com/registry/insecure/#use-self-signed-certificates)に従い、作業を進めます。

ディレクトリを作り、

```
$ mkdir -p certs
```

自己証明書を作ります。

```
$ openssl req   -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key   -x509 -days 365 -out certs/domain.crt

<details><summary>上記実行中の様子。証明書用にいくつか項目が聞かれるとことは、空白のままEnterキーで大丈夫です。</summary><div>

```shell-session
Generating a 4096 bit RSA private key
........................................................................................................................................................................................++
..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

```
</div></details>

dockerデーモンが証明書を参照できるように、出来上がったファイルをコピーしておきます。

```shell-session
$ sudo mkdir -p /etc/docker/certs.d/localhost:5000
$ sudo cp certs/domain.crt /etc/docker/certs.d/localhost:5000/ca.crt
```



## docker-composeを準備する（インストールしていない場合のみ）

docker-composeがインストールされていない場合には、[公式サイト](https://docs.docker.com/compose/install/#master-builds)に従って導入します。

```shell-session
$ sudo sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

## docker-compose.ymlを用意する

下記のような設定ファイルを用意しました。このエントリで作った証明書ファイルを参照しています。


```yml
version: '3'

services:
  registry:
    image: registry:2.6
    container_name: registry
    environment:
      REGISTRY_HTTP_ADDR: 0.0.0.0:443
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    volumes:
      - /var/private-registry:/var/lib/registry
      - ./certs:/certs
    ports:
      - 5443:443
    restart: always
    networks:
      - default

```

## 起動

docker-compose.ymlが存在するディレクトリで、下記コマンドで起動します。

```
$ docker-compose up
```

# コンテナのpush, pull

前述のprivate registryに対して、コンテナのpushとpullを行います。

## 準備

前の買いで作ったコンテナに、タグをつけます。

```
$ sudo docker tag vanilla-hw:latest localhost:5443/ehw2018/vanilla-hw:latest
```

### push

```
$ sudo docker push localhost:5443/ehw2018/vanilla-hw
The push refers to repository [localhost:5443/ehw2018/vanilla-hw]
f89b04970ccd: Pushed
273ca3248753: Pushed
08f4f36c9d4b: Pushed
a1688724228c: Pushed
480f0a5f4c03: Pushed
8827d397f439: Pushed
11af704b9028: Pushed
a1c06ce374f4: Pushed
85284e2f6d9e: Mounted from ehw2018/debian-stretch
latest: digest: sha256:cb4d7ec2776b64d08e61627c6bf83fa91787928caa6b6da894d6dcb0315945e5 size: 2198
```

### pull

まず、手元のイメージを消しておきます。

```shell-session
$ sudo docker rmi localhost:5443/ehw2018/vanilla-hw
```

```
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
circleci/picard     latest              b1f2c41821a8        11 hours ago        83.8MB
vanilla-hw          latest              c805d3cae8ca        29 hours ago        756MB
debian-stretch      latest              c59c0c11fdb6        2 days ago          258MB
registry            2.6                 2e2f252f3c88        2 months ago        33.3MB
```

なくなりましたね。この状態でpullします。

```shell-session
$ sudo docker pull localhost:5443/ehw2018/vanilla-hw
Using default tag: latest
latest: Pulling from ehw2018/vanilla-hw
Digest: sha256:cb4d7ec2776b64d08e61627c6bf83fa91787928caa6b6da894d6dcb0315945e5
Status: Downloaded newer image for localhost:5443/ehw2018/vanilla-hw:latest
```

イメージがpullされました。

```shell-session
$ sudo docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
circleci/picard                     latest              b1f2c41821a8        11 hours ago        83.8MB
vanilla-hw                          latest              c805d3cae8ca        29 hours ago        756MB
localhost:5443/ehw2018/vanilla-hw   latest              c805d3cae8ca        29 hours ago        756MB
debian-stretch                      latest              c59c0c11fdb6        2 days ago          258MB
registry                            2.6                 2e2f252f3c88        2 months ago        33.3MB
```

## 実行

```
$ sudo docker run -it --rm localhost:5443/ehw2018/vanilla-hw
hello, world
```

以上で、dockerのprivate registryに登録したコンテナをpullして、実行することができました。

# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の7日目として、
作ったコンテナをローカルのregistryに登録する
をトピックとして取り上げました。

EHW2018のネタとしては、このあと、このプログラムと同じような目的を持つものを現代的なツール群を用いて、なるべくめんどくさく実現していくことを考えています。