Docker Trusted RegistryをAWSで実行する
ども、大瀧です。 日本時間で今日まで開催されたDockerCon 2015でDockerの商用サポートがアナウンスされました。Dockerの商用サポートはDockerリポジトリとDockerホスト指定台数のサブスクリプションがセットになっていて、リポジトリの種類によって以下2種類があります。
- Docker Subscription for Cloud : Docker Hubのプライベートリポジトリが含まれる
- Docker Subscription for Server : Docker Trusted Registryが含まれる
AWSで利用する場合、字面からはfor Cloudを利用しそうなイメージがありますが、Dockerホストを実行する環境には依らずあくまでリポジトリの種類で選択することになります。
Docker Trusted Registryとは
Docker Trusted Registry(以下DTR)は、元々Docker Hub Enterpriseと呼ばれていたDockerプライベートリポジトリを実行するサーバーを指します。インターネットと通信できない環境やセキュリティポリシー上共用サービスが利用できない環境でDTRが活用できると思います。
また、自前で構築するDocker Registryもありますが、DTRはDocker Registry v2をベースに管理Web画面と商用サポートが追加された製品です。本番環境であれば、DTRを検討することになるでしょう。
今回は、DTRをAWSで実行する様子をレポートしてみます。
- Docker Trusted Registryのバージョン : 1.1.0
- AWSリージョン : us-west-2(オレゴンリージョン)
1. アカウント登録とライセンスファイルの取得
まずは、Docker Subscriptionからサブスクリプションプランを選択します。今回は30日間無料でDTRを試すことができるTrialで試します。[Get Started]ボタンをクリックするとアカウント登録画面になるので、必要事項を入力し[Submit]ボタンをクリックします。
登録するとライセンス画面に遷移するので、"DTR Trial Plan"のボックス下部にある雲のアイコンをクリック、ライセンスファイルをダウンロードします。
手元のMacBookでダウンロードファイルのファイル名や拡張子が自動では指定されなかったため、dtr.licというファイル名にリネームしておきました。あとでライセンスファイルをアップロードする際、ファイルの拡張子が.licであることを求められるので、ファイル名は任意ですが拡張子は.licにしておくのが良いでしょう。
2. DTRインスタンスの作成
ライセンスが準備できたので、DTRインスタンスを作成します。AWS環境では、DTRのAMI(仮想マシンイメージ)がAWS Marketplaceで配布されています。以下のページアクセスし、[Continue]ボタンをクリックします。
起動するインスタンスの設定を画面左側で選択します。現時点ではアメリカの3リージョンのみ選択可能なので、今回はオレゴンリージョンを選び、インスタンスタイプは候補中で最も安価なc3.largeにしました。[Accept Terms & Launch with 1-Click]ボタンをクリックします。
これでインスタンス作成は完了です。サブスクリプション一覧からDocker Subscription for AWSを見つけ、1 activeとなっていることを確認します。[Manage in AWS Console]リンクをクリックするとEC2インスタンスの管理画面に遷移します。
確かにc3.largeのEC2インスタンス1台が起動していることがわかりますね。
3. DTRの初期構成
起動したDTRインスタンスの初期構成を行います。セキュリティグループでTCP80とTCP443が許可され、DTRがListenしているので、WebブラウザでパブリックIPにアクセスしてみましょう。HTTPでのアクセスは自動でHTTPSにリダイレクトされます。既定ではSSL証明書が無効のため、警告画面が表示されます。Webブラウザごとの手順に従い、証明書エラーを無視してページにアクセスします。
DTRのダッシュボードが表示されます。初期状態では警告が2つ表示されるので、それぞれ対応します。まずは、ドメイン名が未設定というエラーに対応するために画面右上の[Settings]メニューをクリックします。
[Domain Name]に任意のドメイン名を入力(今回はEC2インスタンスのPublic DNS)し、[Save and Restart DTR Server]ボタンをクリックします。
続いて[License]タブをクリックし、[Upload License]ボタンをクリック、先ほどダウンロードしたライセンスファイル(dtr.lic)を指定します。
License IDが表示されたら、[Save and Restart DTR Server]ボタンをクリックします。
これで初期エラーは表示されなくなりました。 本来は続いて以下の設定が必要なのですが、今回は動作確認が目的なので割愛します。具体的な手順はDTRのドキュメントを参照ください。
- SSL証明書のインストール
- ストレージバックエンドの設定(S3バケット設定の追加)
いずれの設定も、Docker Registryの構成例が参考になると思います。
4. 動作確認
では、DTRを実行するEC2インスタンスにSSH接続し、様子を見てみます。DTRのAMIはUbuntu 12.04がベースになっており、ec2-userユーザーにSSHキーペアが対応します。
インスタンス上でdockerコマンドを実行し、Dockerリポジトリとしてlocalhostを指定、docker pushしてみます。
$ sudo docker tag postgres:9.4.1 localhost/postgres:9.4.1 $ sudo docker push localhost/postgres:9.4.1 The push refers to a repository [localhost/postgres] (len: 1) (略) Digest: sha256:8c7850eadc0d0617b9ba239dac5c41526b7b7b1e3e37edbd34bc9fbe5a6b5948 $
動作しました! DTR自体がDockerコンテナで動作するので、docker psコマンドからその様子が確認できます。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d982c8bdba3e docker/trusted-registry-nginx:1.1.0 "nginxWatcher" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp docker_trusted_registry_load_balancer cf817cb151a9 docker/trusted-registry-distribution:v2.0.1 "registry /config/st About an hour ago Up About an hour 5000/tcp docker_trusted_registry_image_storage_0 948fb7ce31cb docker/trusted-registry-distribution:v2.0.1 "registry /config/st About an hour ago Up About an hour 5000/tcp docker_trusted_registry_image_storage_1 1f9e3dd78430 docker/trusted-registry-admin-server:1.1.0 "server" About an hour ago Up About an hour 80/tcp docker_trusted_registry_admin_server 80077f736e1a docker/trusted-registry-log-aggregator:1.1.0 "log-aggregator" About an hour ago Up About an hour docker_trusted_registry_log_aggregator 767e952076eb docker/trusted-registry-garant:1.1.0 "garant /config/gara About an hour ago Up About an hour docker_trusted_registry_auth_server 0c5400b18e38 postgres:9.4.1 "/docker-entrypoint. About an hour ago Up About an hour 5432/tcp docker_trusted_registry_postgres $
docker/trusted-registry-...というコンテナがいくつか見えますね。加えてpostgresコンテナも動作していることから、恐らくDTRのバックエンドとしてPostgreSQLが利用されているようです。また、いくつかのコンテナに対してdocker inspectコマンドでボリュームを確認すると、/usr/local/etc/や/var/local/dtr/などローカルディスクにもデータを保管するようになっていました。例えば、/var/local/dtr/image-storage/local/は、docker_trusted_registry_image_storage_*コンテナが/localでマウントしており、Dockerイメージを保存する既定のパスとして利用されています。先ほどpushしたイメージも以下のディレクトリ配下に保存されています。
$ ls /var/local/dtr/image-storage/local/docker/registry/v2/ blobs repositories $
従って、DTRコンテナを複数ホストで複数並べてのクラスタ構成とするのは敷居が高そうです。ストレージはS3などに変更すれば良いですが、ローカルファイルやDBについては共有するための構成を検討する必要があります。AMIを利用せずに手動でインストールする方法もドキュメントにあるのですが、インストールスクリプト自体の実行が以下のようにDockerコンテナの実行でラップされており、カスタマイズは難しい状況です。
$ sudo bash -c "$(sudo docker run docker/trusted-registry install)"
まとめ
DTRの初期セットアップ手順と様子についてまとめてみました。現時点ではOSSのDocker Registry v2と比べ商用サポートとWeb UIのほか、LDAP/AD認証やロギングなどDockerそのものよりもエンタープライズ向けの拡張機能が追加されているのでそのあたりを期待して利用する感じでしょうか。合わせて日本でのサポート体制と代理店の充実に期待したいところですね。