UUUM攻殻機動隊

UUUMのエンジニアによる技術ブログです

Amazon EC2 Container ServiceでDocker Registryを構築する

※2017/02/02追記:現在はAmazon EC2 Container Registryがありますので、この記事のように自前で立ち上げるメリットは少ないと思います。

nazo です。

Docker コンテナを社内で共有する場合、プライベートな Docker Registry を用意する必要がありますが、有料の Docker Registry は、日本国内にサーバがあるものが少なく、接続速度がネックになります。また、リポジトリ単位課金であることが多いので、気軽にリポジトリを増やすことができませんので、自前で用意したいと思います。

Docker Registry を自前で作成する場合、AWS の EC2 Container Service 上で構築するのが簡単です。 この方法はいくつか書いてある記事があるのですが、古い内容(docker/docker-registry は現在は Deprecated となっており、現在は docker/distribution を使用します。Docker Hub では registry:2 となります。)も少なくないので、最新の方法を紹介しつつ、認証も付けようと思います。

S3 Bucket の作成

Docker Registry の各種ファイルを置くために S3 Bucket を作成します。適当な名前で作ってください。特に設定は必要ありません。

IAM Role の作成

インスタンスに付ける IAM Role を作ります。 管理ポリシーで AmazonS3FullAccessAmazonEC2ContainerServiceforEC2Role を付けたものを作るのが一番簡単です。

Task Definition の定義

EC2 Container Service で コンテナを起動するための設定になります。 docker-compose の設定ファイルのようなものです。 Create new Task Definition で新規にタスクを作成します。 ちなみに Task Definition そのものを削除することはできないようです。作った Revision を全て Deregister することはできますが、Inactive に残り続けます。まあこれ自身は設定ですし、特に料金がかかるものではないので、気にしなくて大丈夫です。

Get started の画面に入ってしまう場合は、Create a task definition の画面で cancel を押すと普通の画面に移動できます。Get started の画面では Volume を作れない(はず)ので、一度出てから Task DefinitionsCreate new Task Definition します。

f:id:nazone:20160307161714p:plain

Task Definition Namedocker-registry と入力します。

Add volume を押し、以下を入力します。

  • Name : auth
  • Source Path : /auth

Add container を押し、以下のパラメータを指定します。

  • Container name : docker-registry
  • Image : registry:2
  • Maximum memory : 400
  • Port mappings : 5000 : 5000 : tcp
  • CPU units : 10
  • Essential : チェックを入れる
  • Env Variables :
    • REGISTRY_STORAGE : s3
    • REGISTRY_STORAGE_S3_REGION : AWS のリージョン名( ap-northeast-1 など)
    • REGISTRY_STORAGE_S3_BUCKET : S3 のバケット名
    • REGISTRY_AUTH : htpasswd
    • REGISTRY_AUTH_HTPASSWD_PATH : /auth/htpasswd
    • REGISTRY_AUTH_HTPASSWD_REALM : basic-realm
  • Mount points :
    • Source volume : auth
    • Container path : /auth
    • Read only : チェックを入れる

f:id:nazone:20160307161739p:plain f:id:nazone:20160307161755p:plain f:id:nazone:20160307161803p:plain

IAM Role ではなく、アクセスキーを使いたい場合、REGISTRY_STORAGE_S3_ACCESSKEYREGISTRY_STORAGE_S3_SECRETKEY を設定する必要がありますが、どちらにしても ECS のアクセス権限を IAM Role で入れないといけないので、アクセスキーを使うメリットはないと思います。

また、その他のオプションについては Configuring a registry に記載されています。List of configuration options に記載されている項目を全て大文字にして _ で繋いで、先頭に REGISTRY_ を付けることで、環境変数から指定することが可能になります。

Cluster の作成

EC2 インスタンスの集合体である Cluster を作成します。左メニューの Clusters から Create Cluster ボタンで作成します。

Cluster 名は docker-registry としておきます。

f:id:nazone:20160307161815p:plain

Service の作成

f:id:nazone:20160307161837p:plain

次に、Task をどの Cluster で動かすかを管理する Service を作成します。

作成された Cluster の詳細画面から Services タブの Create ボタンで作成します。

  • Cluster : docker-registry
  • Service : docker-registry
  • Task Definition : docker-registry:1
  • Number of tasks : 1
  • Minimum healthy percent : 0
  • Maximum percent : 100
  • ELB : NO ELB

Minimum healthy percent を 0 にすることで、全停止を許容し、EC2 インスタンスが 1 台しかない環境でも再起動することができるようになります。

EC2 インスタンスの作成

ECS はあくまでコンテナの実行管理しかしないので、コンテナが実際に動く場所は EC2 インスタンス上になります。

まず、認証に使うパスワードを用意します。

認証は BASIC 認証を使います。少人数で使う分には十分かと思います。

認証に使う htpasswd ファイルを事前に用意します。パスワードは bcrypt 形式のみ対応しているので、以下のコマンドで生成します。

$ htpasswd -cB htpasswd [ユーザー名]

できたファイルはユーザーデータで使います。

以下のユーザーデータを用意しておきます。echo するので、 $ などをエスケープするのを忘れないようにしましょう。

#!/bin/bash

echo ECS_CLUSTER=docker-registry >> /etc/ecs/ecs.config
mkdir /auth
echo "[htpasswdファイルの中身]" > /auth/htpasswd

EC2 インスタンスを作成します。EC2 Container Service 用の AMI が用意されているので、それを使います。ecs-optimized で検索して出てきた AMI を使います。

  • インスタンスタイプ : t2.micro
  • IAM ロール : 先ほど作ったもの
  • セキュリティグループ : Inbound でポート 5000 を開放しておく
  • ユーザーデータ : 上記のもの

SSH ログインすることはないので、鍵の設定は不要です。必要であれば EIP を付けておきましょう。

しばらく待つと、EC2 Container Service の Cluster 詳細画面の ECS Instances タブに出てきます。さらに待つと Task が自動的に実行されます。されない場合は手動で実行しましょう。

Task の実行結果が STOPPED になっている場合、何らかの設定が間違っている可能性があります。エラーメッセージは親切ではないので、設定を見直しましょう。

接続

Docker は基本 HTTPS 接続なので、HTTP で構築した環境には insecure-registry オプションを付ける必要があります。 HTTPSで接続できるようにするには、鍵を入れてしまう方法もありますが、ELBで処理するのが簡単かと思います。AWS Certificate Manager が東京リージョンに上陸してくれればもう少し楽になりますね。

insecure-registry オプション付きの docker-machine は以下の方法で起動できます。

$ docker-machine create --driver virtualbox --engine-insecure-registry xxx.xxx.xxx.xxx:5000 default 

作成した Registry にログインします。

$ docker login [ホスト名]:5000
Username ([ユーザー名]): [ユーザー名]
Password: [パスワード]
WARNING: login credentials saved in [$HOME]/.docker/config.json
Login Succeeded

これでログインできますので、後は普通に docker push など行ってください。

Terraform

「うっせーGUIなんて触ってられるか!さっさと Terraform の configuration ファイルよこしやがれ!」というせっかちなあなたのために用意しました。よろしければご利用ください。

github.com

Web 画面で確認できるようにする

あまり使う場面がなさそうですが、docker-registry-frontend を導入すると、Web 画面で Docker Registry の中身を確認することができるようになります。ここでは省略します。

まとめ

現在、複雑な構成の開発環境にも対応できるように、開発環境の Docker 化を進めており、今回の内容はその一環となります。

UUUM では、Docker によるインフラ構築に興味のある方、また、Docker 環境下で快適にアプリを開発するエンジニアを募集しています(アプリも作ってます!)。興味がある方は下記から応募をお待ちしております。