[和訳] Docker EEでプライベートレジストリを活用する #docker
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Using Your Own Private Registry with Docker Enterprise Edition (2018/1/10) の和訳です。
仮想マシンとの比較においてDockerがはるかに優れている点の1つに、Dockerではイメージをとても簡単に移動できるということが挙げられます。すでにDockerをお使いの方なら、 Docker Hub からDockerイメージを取得した経験があることでしょう。Docker HubはDocker社が提供するクラウドベースのレジストリサービスで、何万ものDockerイメージが保存され、そこから選択しイメージを取得できます。しかしソフトウェア開発をしていて独自のDockerイメージを作成しているユーザは、プライベートレジストリの必要性を感じることでしょう。とりわけ、商用ライセンスを含むイメージを扱っている場合や、構築システムとして複雑なCI(継続的インテグレーション)プロセスをお持ちのユーザにとってはその必要性が高まります。
Docker Enterprise Edition (Docker EE) には、DTR (Docker Trusted Registry) 機能があります。安全なイメージ管理機能を備えた高可用性レジストリで、各ユーザのデータセンター内あるいはクラウドベースのインフラストラクチャ上で実行するためのものです。DTRがいかに、安全性・再現性・統一性に富んだ ソフトウェアサプライチェーン をもたらす重要なコンポーネントであるかについて、今後数週間にわたって記事にしてまいります。DTRは 無料ホステッドデモ、あるいは30日間無料トライアル版をダウンロードして、すぐにお試しいただけます。インストール手順は次の通りです。
Docker EEの設定
DTRは、UCP (Universal Control Plane) 上で実行するため、まず単一ノードのクラスタをインストールしましょう。すでにUCPクラスタをお持ちの場合は、この手順は不要です。ご自身のdockerホストで、次のコマンドを実行します:
# UCPの取得とインストール
docker run -it -rm -v /var/run/docker.sock:/var/run/docker.sock -name ucp docker/ucp:latest install
UCPが起動したら、DTRをインストールする前に次のことを実行します。先ほどインストールしたUCPインスタンスに対してブラウザを開きます。出力したログの最後にリンクがあるはずです。Docker EEのライセンスをすでにお持ちの方は、UIからアップロードします。まだお持ちでない方は Docker Store で、無料の“Start 1 Month Trial”を選択してください。
ライセンスを取得後、UCPを実行しているポートを変更しましょう。単一ノードのクラスタのため、DTRとUCPはそれぞれのWebサービスを同じポート上で実行しようとします。2つ以上のノードを有するUCP Swarmクラスタならば、DTRが空きポートが存在するノードを探すため特に問題になりません。UCP内の Admin Settings から Cluster Configuration をクリックし、Controller Portを 5443 などに変更します。
DTR のインストール
シンプルな単一ノードインスタンスのDTRをインストールします。本番環境用にDTRを設定したい場合は、クラウドベースのオブジェクトストアやNFSなどの異なるストレージを必要とするHA (High Availability) モードで構成したいと思われるかもしれません。しかし今回は単一ノードのインスタンスなので、初期設定のローカルストレージを使用します。
まずDTRのbootstrapイメージを取得しましょう。bootstrapイメージは小さな内蔵型インストーラで、UCPに接続してDTRを起動させるために必要なコンテナ・ボリューム・論理ネットワークのすべてを構成します。
次のコマンドを実行します:
# DTRbootstrapperを取得し実行する
docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
注意:UCPおよびDTRにはシステムが認識しない自己証明書でデフォルトで構成されます。システムが信頼するTLS証明書を使用してUCPを設定した方は '-ucp-insecure-tls' オプションを省略できます。あるいは '-ucp-ca' オプションを使用することも可能で、これによってUCP CA証明書を直接指定できるようになります。
このあとDTR bootstrapイメージに、UCPインストールのURLやUCP管理者のユーザー名とパスワードなどを聞かれるので、それらを設定してください。すべてのDTRイメージを取得し構成するまでにかかる時間はほんの1~2分です。
すべてを安全にしておく
すべてを起動できれば、レジストリとやりとりし、イメージのプルおよびプッシュする準備が整ったことになります。
しかしその前に、TLS証明書を設定しDTRと安全にやり取りをできるようにしましょう。
Linuxでは次のコマンドが使用できます (先ほど設定したDTRを反映するために、必ずDTR_HOSTNAMEを変更してください):
# CA証明書をDTRから取得する (curlを使えない場合はwgetをご使用ください)
DTR_HOSTNAME=ご自身のDTRホスト名
curl -k https://$(DTR_HOSTNAME)/ca > $(DTR_HOSTNAME).crt
sudo mkdir /etc/docker/certs.d/$(DTR_HOSTNAME)
sudo cp $(DTR_HOSTNAME) /etc/docker/certs.d/$(DTR_HOSTNAME)
# dockerデーモンを再起動します(Ubuntu 14.04では 'sudo service docker restart' をご使用ください)
sudo systemctl restart docker
Docker for MacおよびWindowsでは、クライアントの設定が若干異なります。まず Settings から Daemon に進み、 Insecure Registries セクションで、ご自身のDTRホスト名を入力します。そして Apply をクリックし、dockerデーモンを再起動すれば準備完了です。
イメージのプッシュおよびプル
いよいよイメージを保管するためのリポジトリの設定です。この手順は、docker pushを行う際にリポジトリが存在しなければ自動的にリポジトリを作成してくれるDocker Hubと若干異なる点です。
リポジトリを作成するにはブラウザで、https:// <ご自身のDTRホスト名>を指定し、プロンプトが表示されたら管理者の認証情報でサインインします。UCPにライセンスを追加した場合は、DTRが自動でそのライセンスを取得します。もしDTRが取得しない場合は、手動でライセンスをアップロードします。
サインインできたら New Repository ボタンをクリックして新しいリポジトリを作成します。次にAlpine linuxを保持するためのリポジトリを作成します。名前フィールドに alpine と入力し、 Save をクリックします(DTR 2.5以降では Createとラベル付けされています)。それではシェルに戻り、次のコマンドを入力します:
# Alpine Linuxの最新バージョンを取得する
docker pull alpine:latest
# ご自身のDTRインスタンスにサインインする
docker login ご自身のDTRホスト名
# ご自身のDTRに格納できるようにAlpineにタグ付けをする
docker tag alpine:latest ご自身のDTRホスト名/admin/alpine:latest
# イメージをDTRにプッシュする
docker push ご自身のDTRホスト名/admin/alpine:latest
これで完了です! Alpine Linuxの最新版を取得しDTR内に保管できるよう再度タグ付けし、プライベートレジストリにプッシュしました。そのイメージを別のDockerエンジンでプルしたい場合は、前述のようにDTR証明書を設定し、次のコマンドを実行します。
# DTRからイメージをプルする
docker pull ご自身のDTR ホスト名/admin/alpine:latest
DTRはイメージ管理の優れた特長を数多く搭載しています。イメージキャッシング、ミラーリング、セキュリティスキャン、署名、そして自動化されたサプライチェーンポリシーなどを含みます。今後の記事で、より詳しく見ていきたいと思います。