Docker RegistryをインストールしてSSLの設定とimageをS3に保存する設定をしてみたのでメモしておきます。

このメモは以下のドキュメントを参考にしています。

Docker Registry v2

docker imageを管理する場合、dockerhubを使えばよいですが、privateでimageの管理がしたい場合はimageのregistryを手元に構築する必要があります。Docker Registryを使えば手元でimageの管理が出来るようになるのでインストールしてみます。

Docker Registryはdocker-distributionという名前で提供されている新しいものをインストールします。DistributionはDocker Registry 2.0という位置づけで、次の様にdocker-registryのレポジトリではdocker-distributionを使うことを推奨しています。

https://github.com/docker/docker-registry
This is DEPRECATED! Please go to https://github.com/docker/distribution

CentOS7では以下の様なパッケージ名でDocker Registryが提供されています。docker-registryは古いパッケージなので注意。

$ cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

$ rpm -qa | grep registry
docker-registry-0.9.1-7.el7.x86_64
$ rpm -qa | grep distribution
docker-distribution-2.5.1-1.el7.x86_64

環境

2台のCentOS7を使ってdocker-distributionとdockerの環境を用意します。

ip hostname service
192.168.33.31 docker-registry-1 docker-registry
192.168.33.32 docker-1 docker

docker-registry

まず、docker-registryのインストールと設定をします。

$ yum -y install docker-distribution

docker-registry <-> docker間のSSL通信で使う自己署名証明書を作成します。作成した証明書はOSで使う証明書として登録します。

$ echo '192.168.33.31  docker-registry-1' >> /etc/hosts
$ cd /var/lib/registry
$ mkdir certs
$ openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout certs/docker-registry-1.key \
-x509 -days 356 -out certs/docker-registry-1.crt
writing new private key to 'certs/docker-registry-1.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) [XX]:jp
State or Province Name (full name) []:aa
Locality Name (eg, city) [Default City]:bb
Organization Name (eg, company) [Default Company Ltd]:cc
Organizational Unit Name (eg, section) []:dd
Common Name (eg, your name or your server's hostname) []:docker-registry-1
Email Address []:docker-registry-1@example.com

SSL証明書のCommon Name以外は適当に設定します。

作った証明書をOSで使うSSL証明書として登録します。update-ca-trustコマンドはOSによって異なるので読み替える必要があります。ubuntuではupdate-ca-certificatesコマンドを使うみたいです。

$ cp certs/docker-registry-1.crt /etc/pki/ca-trust/source/anchors/
$ update-ca-trust

次にdocker-distributionの設定をします。ここではS3をストレージとして利用しますが、S3を使用しない場合はfilesystemの設定を使えばローカルのストレージに保存されるようになります。

$ cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
s3:
accesskey: AWS_ACCESS_KEY
secretkey: AWS_SECRET_KEY
region: ap-northeast-1
bucket: docker-registry-sample
rootdirectory: /images
cache:
layerinfo: inmemory
# filesystem:
# rootdirectory: /var/lib/registry
http:
addr: :5000
tls:
certificate: /var/lib/registry/certs/docker-registry-1.crt
key: /var/lib/registry/certs/docker-registry-1.key

docker-distributionを起動します。

$ systemctl enable docker-distribution
$ systemctl start docker-distribution
$ systemctl status docker-distribution

docker

docker-registryに接続するdockerをインストールします。

$ yum install -y docker

docker-registryのホスト名を追加します。

$ echo '192.168.33.31  docker-registry-1' >> /etc/hosts

docker-registryで作ったSSL証明書をOSが使うSSL証明書として登録します。dockerのドキュメントでは/etc/docker/certs.d/docker-registry-1:5000/ca.crtに作成するように書いてあるが、/etc/docker/certs.d以下に1つでも証明書を追加してしまうとdockerがOSのroot証明書を参照しなくなってしまいます。docker-registry以外とSSL通信が必要な場合(例えばS3とか、dockerhubへ直接通信するとき)はOSが参照する/etc/pki/ca-trust/source/anchors以下にSSL証明書をインストールする必要があります。/etc/docker/certs.d以下に証明書を追加したとき、root証明書が正しく読み込めていないのでS3にimageが保存できているが、pushに失敗したという謎の現象が発生したりしたので注意が必要です。

The push refers to a repository [docker-registry-1:5000/centos]
34e7b85d83e4: Image push failed
x509: certificate signed by unknown authority

以下のファイルにdocker-registryで作ったSSL証明書をコピーします。

$ vi /etc/pki/ca-trust/source/anchors/docker-registry-1.crt
$ update-ca-trust

dockerを起動します。

$ systemctl enable docker
$ systemctl start docker

動作確認

試しに、インストールしたdockerでdockerhubのimageをpullして、docker-registry-1にpushしてみます。

$ docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
45a2e645736c: Pull complete
Digest: sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Status: Downloaded newer image for docker.io/centos:latest

$ docker tag centos docker-registry-1:5000/centos
$ docker push docker-registry-1:5000/centos
The push refers to a repository [docker-registry-1:5000/centos]
34e7b85d83e4: Pushed
latest: digest: sha256:7dfffa13a2addc317ac3bdfbddbd4604ea629decea19c271481e5c45245b7612 size: 507

うまく設定できている場合は次の様にS3にimageが登録されていることが確認できるはずです。

おわり。

参考

  1. https://docs.docker.com/registry/configuration/
  2. https://docs.docker.com/registry/insecure/
  3. https://docs.docker.com/engine/security/certificates/
  4. https://github.com/docker/distribution