導入
「うちでもDocker使ってみるかぁ」
皆さんの職場で1度は持ち上がった話でしょう。
ここで重要なのは、「気軽に」かつ「実際に」使ってみたいという点です。
通常業務もあるなかで新しい技術を取り入れるには、障壁の低さは必須です。
それと同様に、チュートリアルを超えて、実際にアプリをデプロイできないと、評価のしようがありません。
この悩ましい要求を両立させるソリューションの1つである、Amazon Elastic Beanstalk with Dockerの紹介をします。
Amazon Elastic Beanstalk with Dockerとは
Amazon Elastic Beanstalkは数あるAmazon Web Serviceの1つで、アプリを動かすために必要なAWSの構築を簡単に行ってくれるサービスです。
ELB、EC2、RDS、DynamoDBなどなど、複数のAWSをブラウザからの操作のみで一気に構築することができます。
事前にアプリを用意さえすれば、AWSの知識が無くてもProductionレベルの環境を構築可能です。
もちろん、コマンドラインからの構築・デプロイや、ファイルでの詳細な設定も可能です。
オートスケールや監視設定も簡単に行えます。
このElastic Beanstalkは、RubyやPHPなどメジャーな言語にはひと通り対応していますが、実はDockerコンテナのデプロイにも対応しているのです。
つまり、ProductionレベルのAWSインフラに、Elastic Beanstalkの簡単さでアプリをデプロイすることが可能なのです。
構成
- あらかじめリポジトリにアプリをpushしておく
- アプリのpushに連動してdocker buildがDockerHub上で実行される
- Elastic Beanstalkを操作して、アプリケーションの環境を作成する
- Elastic BeanstalkがS3のDockerHub認証ファイルを参照して、DockerHubプライベートリポジトリから最新のアプリ入りコンテナをEC2にデプロイする
操作は、簡単なブラウザ操作で完結する上、日本語での公式ドキュメントもあります。
以下では、あまり明確には書かれていない、つまづきポイントを重点的に説明します。
下準備
まずは、Elasstic BeanstalkがDockerHubのPrivate Repoからコンテナをダウンロードできるように、認証を設定します。
DockerHubのPrivateリポジトリを使わないのであれば、この章の設定は不要です。
DockerHubでアカウントを作成した後、作業用PCでdocker loginします。
docker login
すると、 ホームディレクトリに
~/.dockercfg
というファイルが生成されます。中身は、以下のとおりです。
➜ sampleapp cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"abcdefg12345678","email":"hoge@fuga.com"}}
このファイルを、S3のバケットにアップロードします。
※書いてて気づいたのですが、このファイルは、他人にバレてはいけませんね...何か工夫が必要だな...
これで、Elastic Beanstalkがデプロイ時にDockerHubのPrivateリポジトリを参照することができます。
最後に、Elastic BeanstalkにIAMロールの設定を行います。先ほどのS3バケットを見るため、Read権限が必要です。
詳細はこちらを参照してください。
構築
RailsやAmon2など、なんでも良いのでアプリを作っておきます。
また、Dockerrun.aws.jsonという名前のファイルを作っておきます。
{
"AWSEBDockerrunVersion": "1",
"Authentication": {
"Bucket": "sampleapp-bucket",
"Key": "docker/mydockercfg"
},
"Image" : {
"Name" : "saisa6153/sampleapp:latest",
"Update": "true"
},
"Ports" : [{ "ContainerPort": "80" }]
}
今回はこのファイルをElastic Beanstalkの画面からアップロードして、構築を実行させます。
Dockerrun.aws.jsonはzip形式に圧縮しておく必要があります。
手順は、こちらのドキュメントに書いてあるので、適宜参照してください。
次に、Dockerfileを作成します。
今回は、buildの高速化のため、共通部分となるベースイメージと、毎回異なるソースコードが入りうるアプリケーションイメージの2つに分ける戦略を取りました。
もちろん、1つのイメージで完結しても問題ありません。
作成したDockerfileは、アプリケーションに同梱してリポジトリにpushしておきましょう。
その後、再びDockerHubにログインし、DockerHubリポジトリを作成しますが、この時に「Automated Build」にチェックを入れて、ビルドブランチ(master)とDockerfileファイルの位置を指定してください。
Automated Buildを設定することにより、アプリケーションの変更がpushされたタイミングで、毎回Dockerのbuildも走ってくれるようになります。
以下に、サンプルアプリとそのDockerHubリポジトリをおいておきます。適宜参考にしてください。
最後に
最近はKubernetesやAmazon EC2 Container Serviceなど、Dockerの運用周りが一段と熱くなってきています。
Elastic Beanstalkはいち早くDockerのデプロイを簡略化した、優秀なサービスだと思います。
実運用段階に入っているDockerを、あなたも使ってみましょう!
参考URL
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-aws-elastic-beanstalk
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html
http://blog.yuukigoodman.net/entry/2014/08/14/012209 の下半分
https://speakerdeck.com/saisa6153/perl-as-a-service