Ubuntu 16.04でDockerプライベートレジストリサーバーを設定する

このチュートリアルでは、Ubuntu 16.04で**Alibaba Cloud** ECS上に独自の**Docker**プライベートレジストリサーバを設定します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-setup-docker-private-registry-on-ubuntu-16-04_594085)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#必要条件
1、Ubuntuがインストーされたレジストリサーバ用の新しいAlibaba Cloudインスタンス。
2、Ubuntuがインストールされたレジストリクライアント用の新しいAlibaba Cloudインスタンス。
3、レジストリサーバーインスタンスに192.168.0.101の静的IPアドレスが設定され、レジストリクライアントインスタンスに192.168.0.102の静的IPアドレスが設定されます。
4、サーバー上にRootパスワードが設定されます。

#Alibaba Cloud ECSインスタンスを起動する
まず、[Alibaba Cloud ECS Console](https://account.alibabacloud.com/login/login.htm?oauth_callback=https%3A%2F%2Fecs.console.aliyun.com%2F%3Fspm%3Da2c65.11461447.0.0.f29d4a76MrlK53&lang=ja)にログインします。新しい[ECSインスタンス](https://www.alibabacloud.com/help/ja/doc-detail/25424.htm)を作成し、少なくとも2GBのRAMを搭載したオペレーティングシステムとしてUbuntu 16.04を選択します。[ECSインスタンス](https://www.alibabacloud.com/help/ja/doc-detail/25424.htm)に接続し、rootユーザーとしてログインします。

Ubuntu 16.04インスタンスにログインしたら、以下のコマンドを実行して、ベースシステムを最新の利用可能なパッケージで更新します。

```
apt-get update -y
```

#ホストの設定
まず、各インスタンスに/etc/hostsファイルを設定し、各インスタンスがホスト名で通信できるようにします。

各インスタンスに/etc/hostsファイルを設定するには、以下のコマンドを実行します。

```
nano /etc/hosts
```

以下の行を追加します。

```
192.168.0.101 registry-server
192.168.0.102 registry-client
```

完了したら、ファイルを保存して閉じます。

次に、レジストリ・サーバ・インスタンス上で以下のコマンドを実行することで、名前解決を確認することができます。

```
ping registry-client
ping registry-server
```

#Dockerのインストール
始める前に、両方のインスタンスにDockerをインストールする必要があります。デフォルトでは、Ubuntu 16.04のデフォルトリポジトリにはDocker CEの最新版がありません。そのため、Docker CEのリポジトリをシステムに追加する必要があります。

まず、以下のパッケージをシステムにインストールします。

```
apt-get install -y apt-transport-https software-properties-common ca-certificates curl -y
```

次に、以下のコマンドでDocker CE GPGキーをダウンロードして追加します。

```
wget https://download.docker.com/linux/ubuntu/gpg 
apt-key add gpg
```

次に、/var/lib/dpkg/lockDocker CE リポジトリを APT に追加します。

```
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" | tee /etc/apt/sources.list.d/docker.list
```

最後に、以下のコマンドを実行してリポジトリを更新し、Docker CEをインストールします。

```
apt-get update -y
apt-get install docker-ce -y
```

インストールが完了したら 以下のコマンドでDockerの状態を確認します。

```
systemctl status docker
```

出力します。

```
docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-08-06 19:49:28 IST; 41s ago
     Docs: https://docs.docker.com
 Main PID: 13024 (dockerd)
   CGroup: /system.slice/docker.service
           ├─13024 /usr/bin/dockerd -H fd://
           └─13054 docker-containerd --config /var/run/docker/containerd/containerd.toml

Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.240011773+05:30" level=info msg="ClientConn switching balancer to \"pick_first\
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.241034794+05:30" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.243219799+05:30" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.244280675+05:30" level=info msg="Loading containers: start."
Aug 06 19:49:27 Node1 dockerd[13024]: time="2018-08-06T19:49:27.970064077+05:30" level=info msg="Default bridge (docker0) is assigned with an I
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.161884804+05:30" level=info msg="Loading containers: done."
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.192309817+05:30" level=info msg="Docker daemon" commit=0ffa825 graphdriver(s)=o
Aug 06 19:49:28 Node1 dockerd[13024]: time="2018-08-06T19:49:28.193198210+05:30" level=info msg="Daemon has completed initialization"
Aug 06 19:49:28 Node1 systemd[1]: Started Docker Application Container Engine.
```

#Dockerレジストリのインストール
始める前に、レジストリサーバインスタンス上でDocker private Registryを作成する必要があります。まず、以下のコマンドでDocker Hubからレジストリイメージをダウンロードします。

```
docker pull registry
```

出力します。

```
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete 
c12c92d1c5a2: Pull complete 
4fbc9b6835cc: Pull complete 
765973b0f65f: Pull complete 
3968771a7c3a: Pull complete 
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest
```

レジストリイメージをダウンロードしたら、Dockerレジストリを保護するための自己署名証明書を生成する必要があります。なぜなら、Dockerノードは、プライベートレジストリへのイメージのアップロードやダウンロードにTLSを介した安全な接続を使用しているからです。

レジストリサーバに移動し、以下のコマンドを実行して証明書を生成します。

```
mkdir /etc/certs
cd /etc/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
```

出力します。

```
Generating a 4096 bit RSA private key
.........................++
.........................................++
writing new private key to 'ca.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]:IN
State or Province Name (full name) [Some-State]:Gujarat
Locality Name (eg, city) []:Junagadh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alibaba
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:registry-server
Email Address []:hitjethva@gmail.com
```

この証明書を信頼するためには、生成されたca.crt証明書を全てのレジストリクライアントシステムにコピーする必要があります。

ここで、以下のコマンドを実行して、証明書情報を持ったDockerのレジストリコンテナを起動します。

```
docker run -d -p 5000:5000 --restart=always --name registry -v /etc/certs:/etc/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/certs/ca.crt -e REGISTRY_HTTP_TLS_KEY=/etc/certs/ca.key registry
```

これで、以下のコマンドを使用して実行中のレジストリコンテナを確認することができます。

```
docker ps
```

出力します。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                    NAMES
304fa6da95d4        registry            "/entrypoint.sh /etc…"   12 seconds ago      Restarting (1) 3 seconds ago   0.0.0.0:5000->5000/tcp   registry
```

#レジストリクライアント上にDockerイメージを作成する
次に、プライベートレジストリサーバにアップロードするためのDockerコンテナイメージをレジストリクライアント上で作成して構築します。

ここでは、Dockerfileを使ってUbuntu 16.04ベースのApache Webサーバーイメージを構築します。

まず、以下のコマンドでDockerfileを作成します。

```
mkdir Dockerimage
cd Dockerimage
nano Dockerfile
```

以下の行を追加します。

```
FROM ubuntu:16.04

LABEL project="Apache Web Server Image"
LABEL maintainer "hitjethva@gmail.com"

RUN apt-get update
RUN apt-get install -y apache2

VOLUME /var/www/html

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
ENV APACHE_LOCK_DIR=/var/lock/apache2

RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR

EXPOSE 80

CMD ["apache2","-DFOREGROUND"]
```

さて、以下のコマンドを実行して、Dockerfileを使ってApacheのWebサーバイメージを構築します。

```
docker build -t ubuntu:apachev1.0 .
```

出力します。

```
Sending build context to Docker daemon  2.048kB
Step 1/14 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
8ee29e426c26: Pull complete 
6e83b260b73b: Pull complete 
e26b65fd1143: Pull complete 
40dca07f8222: Pull complete 
b420ae9e10b3: Pull complete 
Digest: sha256:3097ac92b852f878f802c22a38f97b097b4084dbef82893ba453ba0297d76a6a
Status: Downloaded newer image for ubuntu:16.04
 ---> 7aa3602ab41e
Step 2/14 : LABEL project="Apache Web Server Image"
 ---> Running in 2c0995179821
Removing intermediate container 2c0995179821
 ---> cd5b35df03c2
Step 3/14 : LABEL maintainer "hitjethva@gmail.com"
 ---> Running in 3a28f13e1418
Removing intermediate container 3a28f13e1418
 ---> b4f0713f0fcf
Step 4/14 : RUN apt-get update
 ---> Running in 7c1f0d548b90
Removing intermediate container 7c1f0d548b90
 ---> adb9a635b7f1
Step 5/14 : RUN apt-get install -y apache2
 ---> Running in 0235c7866eb6
Removing intermediate container 0235c7866eb6
 ---> 2b5f2c282c79
Step 6/14 : VOLUME /var/www/html
 ---> Running in e9b58c5f7ddd
Removing intermediate container e9b58c5f7ddd
 ---> 4a2f62e669b7
Step 7/14 : ENV APACHE_RUN_USER www-data
 ---> Running in 9ec982161d2d
Removing intermediate container 9ec982161d2d
 ---> 548e324848d6
Step 8/14 : ENV APACHE_RUN_GROUP www-data
 ---> Running in 1cf084f71b1b
Removing intermediate container 1cf084f71b1b
 ---> db0461896c00
Step 9/14 : ENV APACHE_LOG_DIR /var/log/apache2
 ---> Running in e2bdf40d1f4b
Removing intermediate container e2bdf40d1f4b
 ---> bbbde0ba0289
Step 10/14 : ENV APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
 ---> Running in 2277820a5e13
Removing intermediate container 2277820a5e13
 ---> af92b486cafb
Step 11/14 : ENV APACHE_LOCK_DIR=/var/lock/apache2
 ---> Running in 6e667a32abdb
Removing intermediate container 6e667a32abdb
 ---> b85b2b568744
Step 12/14 : RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
 ---> Running in 8c0031a631cb
Removing intermediate container 8c0031a631cb
 ---> 106b4813eef0
Step 13/14 : EXPOSE 80
 ---> Running in 09712f52ce38
Removing intermediate container 09712f52ce38
 ---> 4364dd9cefa9
Step 14/14 : CMD ["apache2","-DFOREGROUND"]
 ---> Running in ffb9e1dda041
Removing intermediate container ffb9e1dda041
 ---> 4464cfdff2c6
Successfully built 4464cfdff2c6
Successfully tagged ubuntu:apachev1.0
```

上のコマンドでは、ubuntu:apachev1.0という名前のDockerイメージをビルドしています。

以下のコマンドでリストアウトできます。

```
docker images
```

出力します。

```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              apachev1.0          4464cfdff2c6        36 seconds ago      254MB
ubuntu              16.04               7aa3602ab41e        10 days ago         115MB
httpd               <none>              74ad7f48867f        9 months ago        177MB
```

次に、「regyserver:portnumber/image name:tag」形式でdockerイメージの名前を変更する必要があります。

生成されたイメージの名前を変更するには、以下のコマンドを使用します。

```
docker tag ubuntu:apachev1.0 registry-server:5000/ubuntu:apachev1.0
```

では、以下のコマンドで再度検証してみましょう。

```
docker images
```

出力します。

```
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
ubuntu                        apachev1.0          4464cfdff2c6        About a minute ago   254MB
registry-server:5000/ubuntu   apachev1.0          4464cfdff2c6        About a minute ago   254MB
ubuntu                        16.04               7aa3602ab41e        10 days ago          115MB
httpd                         <none>              74ad7f48867f        9 months ago         177MB
```

#レジストリサーバにDockerイメージをアップロードする
これで、レジストリクライアント上にDockerイメージの準備ができました。起動する前に、レジストリサーバからレジストリクライアントにca.crt証明書をコピーする必要があります。

レジストリクライアントのインスタンスに移動して、以下のコマンドを実行します。

```
mkdir -p /etc/docker/certs.d/registry-server:5000
scp root@registry-server:/etc/certs/ca.crt /etc/docker/certs.d/registry-server/
```

ここで、以下のコマンドでdockerサービスを再起動します。

```
systemctl restart docker
```

次に、以下のコマンドでプライベートレジストリサーバにdockerイメージをアップロードします。

```
docker push registry-server:5000/ubuntu:apachev1.0
```

出力します。

```
The push refers to repository [registry-server:5000/ubuntu]
1e2d2004eac5: Pushed 
90c9e108cca6: Pushed 
6ad516d3083c: Pushed 
bcff331e13e3: Pushed 
2166dba7c95b: Pushed 
5e95929b2798: Pushed 
c2af38e6b250: Pushed 
0a42ee6ceccb: Pushed 
apachev1.0: digest: sha256:a644ec3477b8616d2956b3254cd67bebb08ded68dce25a9f4a773de1dfae122b size: 1988
```

また、以下のコマンドを使って、アップロードした画像をレジストリサーバーからダウンロードすることもできます。

```
docker pull registry-server:5000/ubuntu:apachev1.0
```

出力します。

```
apachev1.0: Pulling from ubuntu
8ee29e426c26: Pull complete 
6e83b260b73b: Pull complete 
e26b65fd1143: Pull complete 
40dca07f8222: Pull complete 
b420ae9e10b3: Pull complete 
17cc14b524da: Pull complete 
a672de99207d: Pull complete 
28fef3b105af: Pull complete 
Digest: sha256:a644ec3477b8616d2956b3254cd67bebb08ded68dce25a9f4a773de1dfae122b
Status: Downloaded newer image for registry-server:5000/ubuntu:apachev1.0
```

おめでとうございます。これでUbuntu 16.04でDockerのプライベートレジストリサーバのセットアップが完了しました。これで、レジストリサーバーへのDockerイメージのアップロードやダウンロードが簡単にできるようになりました。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*