Docker Private Registryを構築しDashboardを利用する

Docker Registryをプライベートで利用したい

Docker Hub には、Docker イメージをアップロード出来る機能がありますが、アップロードしたイメージは有料会員で無い限りすべてパブリックに公開されます。
つまり、Docker Hub 上においてプライベートなレジストリを利用するには、有料会員となる必要があるわけです。
しかしながら、個人利用においては自身で作成したイメージをパブリックに公開したくないことも多々あります。
そこで、レジストリを自身でホスティングする方法で、自分だけの Docker Registry を構築してみます。

本記事は、自宅オンプレ環境にイメージを展開するためのレジストリを構築するという目的で、TLS等での通信に必要な証明書については触れません。

Docker Private Registry をDocker上で実行する

Docker Private Registry 自体のイメージは、Docker Hub 上で発見することができます。
また、以下のようにコマンドを利用しても検索を行うことができます。

1
2
3
$ docker search registry
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
registry The Docker Registry 2.0 implementation for s… 2984 [OK]

事前にイメージを手元にダウンロードしておきたい場合は、pull オプションを利用してください。

1
$ docker pull registry

また、これらの手順を行わなくとも以下のコマンドを実行することで、手元にイメージがない場合は自動的にダウンロードされます。
なお、本記事では、registry:latest を使用し、レジストリ用のポートとしてホストのポート5000番をbindしています。

1
$ docker run -d -p 5000:5000 --restart always --name registry -v /mnt/docker/registry:/var/lib/registry registry

ここでは、Dockerを実行しているホストOS上の /mnt/docker/registry ディレクトリを、コンテナ上の /var/lib/registry にマウントしています。
これは、コンテナを再起動したりした場合でも レジストリにアップロードしたイメージを保持するために必要です。
必要に応じてホストOS側のディレクトリの作成を行ってください。
docker psコマンドを用いて実行状態を確認することができます。

1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26d11328cef9 registry "/entrypoint.sh /etc…" 16 seconds ago Up 14 seconds 0.0.0.0:5000->5000/tcp registry

なお、必要に応じてDockerを実行しているホストOS側のFirewallを適切に設定してください。
本記事ではufw等の設定は省略します。

Docker Image を利用する側の設定

Docker Image をアップロードする際、デフォルトではTLS等の暗号化通信において、適切に暗号化されたホストとのみ通信を行うような設定になっています。
しかしながら、今回はTLS等の暗号化通信を使用しませんので、レジストリのホストが信頼できるホストであるとして、設定を行う必要があります。

Docker Image をアップロードするマシンにおいて、以下のファイルを編集します。
(必要に応じて管理者権限で実行してください)

1
$ nano /etc/docker/daemon.json

このファイルに、以下の記述を追加します。
この例では、レジストリを構築したホストのIPアドレスを 192.168.1.10 と仮定しています。

1
2
3
{
"insecure-registries" : ["192.168.1.10:5000"]
}

Docker Image をアップロードしてみる

ここでは、Docker Hub 上の例を引用し、Ubuntuのイメージを構築したレジストリにアップロードしてみます。
(適時、IPアドレス・ポート番号は変更してください)

1
2
3
$ docker pull ubuntu
$ docker tag ubuntu 192.168.1.10:5000/ubuntu
$ docker push 192.168.1.10:5000/ubuntu

簡易的なWeb Dashboard

docker-registry-frontendは、どのようなイメージがレジストリ上に存在するか確認することが出来るWebインタフェースです。

利用するには、以下のようにコマンドを実行します。
(適時、IPアドレス・ポート番号は読み替えてください)

1
$ docker run -d -e ENV_DOCKER_REGISTRY_HOST=192.168.1.10 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8080:80 konradkleine/docker-registry-frontend:v2

なお、レジストリのホストIPアドレスとして、localhost を用いることはできませんのでご注意ください。

docker ps コマンドを利用して、コンテナが実行されているか確認することができます。
(ここでは、レジストリとWebインタフェースを同じホストで実行しています)

1
2
3
4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313bf15a690e konradkleine/docker-registry-frontend:v2 "/bin/sh -c $START_S…" 5 seconds ago Up 2 seconds 443/tcp, 0.0.0.0:8080->80/tcp wonderful_williams
26d11328cef9 registry "/entrypoint.sh /etc…" 21 minutes ago Up 21 minutes 0.0.0.0:5000->5000/tcp registry

コンテナが実行されていれば、ブラウザ上から http://192.168.1.10:8080/ とすることでWebインタフェースにアクセスできるはずです。

今回は、プライベートな Docker Registry を構築し、簡易的なWebインタフェースを試しました。

本記事を執筆中に、別途レジストリに使えそうなものを発見したので、余裕があればそちらも試してみようと思います。