※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 を作ります。
管理ポリシーで AmazonS3FullAccess
と AmazonEC2ContainerServiceforEC2Role
を付けたものを作るのが一番簡単です。
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 Definitions
で Create new Task Definition
します。
Task Definition Name
に docker-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 : チェックを入れる
- Source volume :
IAM Role ではなく、アクセスキーを使いたい場合、REGISTRY_STORAGE_S3_ACCESSKEY
と REGISTRY_STORAGE_S3_SECRETKEY
を設定する必要がありますが、どちらにしても ECS のアクセス権限を IAM Role で入れないといけないので、アクセスキーを使うメリットはないと思います。
また、その他のオプションについては Configuring a registry に記載されています。List of configuration options
に記載されている項目を全て大文字にして _
で繋いで、先頭に REGISTRY_
を付けることで、環境変数から指定することが可能になります。
Cluster の作成
EC2 インスタンスの集合体である Cluster を作成します。左メニューの Clusters
から Create Cluster
ボタンで作成します。
Cluster 名は docker-registry
としておきます。
Service の作成
次に、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 ファイルよこしやがれ!」というせっかちなあなたのために用意しました。よろしければご利用ください。
Web 画面で確認できるようにする
あまり使う場面がなさそうですが、docker-registry-frontend を導入すると、Web 画面で Docker Registry の中身を確認することができるようになります。ここでは省略します。
まとめ
現在、複雑な構成の開発環境にも対応できるように、開発環境の Docker 化を進めており、今回の内容はその一環となります。
UUUM では、Docker によるインフラ構築に興味のある方、また、Docker 環境下で快適にアプリを開発するエンジニアを募集しています(アプリも作ってます!)。興味がある方は下記から応募をお待ちしております。