Docker Container Registryサーバーを自前で作成してみる
はじめに
"Docker Hub" や GCR 、 ECR といったサービスがあるなか、
わざわざ自前で "Docker Registry" を構築して Docker イメージを管理する必要性は少ないとは思いますが、仕組みを理解する目的で、自作の Docker Registry 環境を構築してみたいと思います。
検証環境
作業の流れ(作業ログ)
- Docker Registry サーバを立ち上げ
- Docker Registry サーバに外部から接続するための設定を追加
準備
前提として、今回は最もかんたんな方法で Docker Registry サーバを立ち上げたいと思います。
その方法とは、 「すでに公開されている Docker Registry サーバ用の Docker イメージを利用する」というものです。
Docker イメージを管理するためのサーバを Docker で立ち上げる、というのが面白いですね。
そんなわけで、Docker を事前にインストールしておきましょう。
Windows や Mac で動作させる最もかんたんな方法は以下のツールを導入することです。
1. Docker Registry サーバを立ち上げ
registry:2.7.1 というイメージを利用したいと思います。
起動は以下のコマンドを実行するだけです。
起動しているようです。
それでは実際に Docker イメージをビルドして、Registry に登録してみましょう。
動作確認 1 : Docker イメージのビルド
ビルドが完了したら実行してみましょう。
"Hello World" という文言が出力されるはずです。
動作確認 2 : Docker イメージのプッシュ
それでは先程立ち上げたローカル PC 内の Docker Registry サーバにプッシュしてみます。
動作確認 3 : ローカルの Docker イメージを削除しても動作するか確認
それでは、登録したばかりの Docker イメージが pull して利用できるか、確認してみます。
まずはローカルに残っている Docker イメージを消してやります。
それでは、Docker Registry サーバから取得してみます。
登録されているものが取得できました。
2. Docker Registry サーバに外部から接続するための設定を追加
ここまで実施してきた操作はすべて、 自分の PC 内に限定 されていました。
Docker イメージの push 先ホストが localhost
となっていたことからもわかると思います。
ただ、Docker Registry を使う場合はチームでの開発が想定されるでしょう。
そこで、試しに localhost
や 127.0.0.1
といった自分の PC を示すアドレスを利用せず、 PC に割り当てられているネットワーク外からアクセス可能な IP アドレスを使って Docker Registry と通信してみます。
エラーが発生しました。
Docker Registry と Docker が外部ネットワークを使って通信するためには、 TLS 証明書を使った HTTPS 通信の仕組みが必要 なためです。
(Docker Registry 起動時のオプションを渡して、非 TLS 通信を許容することもできますがインターネット経由の場合はおすすめできません。。)
外部から Docker Registry にアクセスするための設定
TLS 証明書を作成する方法はいくつかあると思いますが、ここでは無料で利用できる 自己署名証明書 を作成します。
ここで一点、注意が必要です。Docker Registry とは IP ではなくホスト名を指定する必要があります。(IP 指定だとエラーが発生する)
今回は genzouw
という名前で Docker Registry を起動したいと思います。証明書も genzouw
という Common Name で作成します。
秘密鍵 と 証明書 の2つのファイルが作成されました。
自己署名証明書 を利用する場合は、これを Docker Registry からイメージを取得したい全ての PC 環境に配置する必要があります。
( 自己署名証明書ではない TLS の場合には、この作業は不要です。 )
証明書は、PC 環境の /etc/docker/certs.d/<DOCKER_REGISTRY_IP>:<DOCKER_REGISTRY_PORT>/ca.crt
というファイルパスに配置します。
また、証明書を配置したあとは PC 環境の Docker を再起動する必要があります。
Docker Desktop for Windows / Mac を利用している場合は以下のイメージを参照ください。
Docker Registry を利用する側の設定は完了。
Docker Registry 側の設定を行います。
すでに立ち上がっているコンテナを一度削除し、再び起動し直します。
起動の際には、 秘密鍵 と 証明書 を利用するため、ディレクトリをマウントしてやります。
動作確認
さて、準備は整いました。動作を確認してみます。
先程作成した Docker イメージに改めて、新しいホスト名でタグを付与します。
Docker Registry に Push してみます。
ローカルのイメージを削除した後、Docker Registry から Pull してみます。
正しく動作しました。
ひとこと
改めてお話すると、Google Cloud Platform の GCR や AWS の ECR が缶コーヒー買うぐらいの費用で利用できるので、わざわざこの労力を使うメリットは有りません。
仕組みを理解する意味で触ってみるぐらいでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません