Docker Trusted RegistryをAWSで実行する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。 日本時間で今日まで開催された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-trial12

登録するとライセンス画面に遷移するので、"DTR Trial Plan"のボックス下部にある雲のアイコンをクリック、ライセンスファイルをダウンロードします。

dtr-trial01

手元のMacBookでダウンロードファイルのファイル名や拡張子が自動では指定されなかったため、dtr.licというファイル名にリネームしておきました。あとでライセンスファイルをアップロードする際、ファイルの拡張子が.licであることを求められるので、ファイル名は任意ですが拡張子は.licにしておくのが良いでしょう。

2. DTRインスタンスの作成

ライセンスが準備できたので、DTRインスタンスを作成します。AWS環境では、DTRのAMI(仮想マシンイメージ)がAWS Marketplaceで配布されています。以下のページアクセスし、[Continue]ボタンをクリックします。

dtr-trial02

起動するインスタンスの設定を画面左側で選択します。現時点ではアメリカの3リージョンのみ選択可能なので、今回はオレゴンリージョンを選び、インスタンスタイプは候補中で最も安価なc3.largeにしました。[Accept Terms & Launch with 1-Click]ボタンをクリックします。

dtr-trial03

これでインスタンス作成は完了です。サブスクリプション一覧からDocker Subscription for AWSを見つけ、1 activeとなっていることを確認します。[Manage in AWS Console]リンクをクリックするとEC2インスタンスの管理画面に遷移します。

dtr-trial04

確かにc3.largeのEC2インスタンス1台が起動していることがわかりますね。

dtr-trial10

3. DTRの初期構成

起動したDTRインスタンスの初期構成を行います。セキュリティグループでTCP80とTCP443が許可され、DTRがListenしているので、WebブラウザでパブリックIPにアクセスしてみましょう。HTTPでのアクセスは自動でHTTPSにリダイレクトされます。既定ではSSL証明書が無効のため、警告画面が表示されます。Webブラウザごとの手順に従い、証明書エラーを無視してページにアクセスします。

dtr-trial05

DTRのダッシュボードが表示されます。初期状態では警告が2つ表示されるので、それぞれ対応します。まずは、ドメイン名が未設定というエラーに対応するために画面右上の[Settings]メニューをクリックします。

dtr-trial06

[Domain Name]に任意のドメイン名を入力(今回はEC2インスタンスのPublic DNS)し、[Save and Restart DTR Server]ボタンをクリックします。

dtr-trial07

続いて[License]タブをクリックし、[Upload License]ボタンをクリック、先ほどダウンロードしたライセンスファイル(dtr.lic)を指定します。

dtr-trial08

License IDが表示されたら、[Save and Restart DTR Server]ボタンをクリックします。

dtr-trial09

これで初期エラーは表示されなくなりました。 本来は続いて以下の設定が必要なのですが、今回は動作確認が目的なので割愛します。具体的な手順は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そのものよりもエンタープライズ向けの拡張機能が追加されているのでそのあたりを期待して利用する感じでしょうか。合わせて日本でのサポート体制と代理店の充実に期待したいところですね。