Deploy Rails Application on Docker with Elasticbeanstalk
-
Upload
aktsk -
Category
Engineering
-
view
519 -
download
3
description
Transcript of Deploy Rails Application on Docker with Elasticbeanstalk
ElasticbeanstalkでRailsアプリ on Dockerのデプロイを
した話2014/08/21 Developer Procductivity勉強会
株式会社アカツキ 河野 洋志
自己紹介• 河野 洋志• twitter: @bonty
• アカツキでエンジニアをしています• 最近はcocos2d-x、アプリケーションの設計、
BigQueryとか興味があります
アカツキエンジニアチームの文化• 最高の方法を考えないのは悪• チーム最適
最高の方法を考えないのは悪• 「最高」は2つの面から
• スピードやコスト、生産性、プロダクトの完成度などの点で最適
• 開発する人が楽しめる、面白い• これらを追求しないと良いものづくりができない。常に新しい、より良い手法を取り込む
チーム最適• 「最高の追求」の裁量は各チームにある。全チーム共通のルールを重視するとプロセスが重くなりがちになって、変化しにくくなる
• 各チームが独立して良い手法を探し共有することで、良い技術は浸透し、悪い技術は淘汰される• 結果的に組織全体にとってベストの手法に変わっていく
ツール• CI
• Jenkins, Travis CI, Circle CI, HoundCI, TestFlight, DeployGate
• Communication
• Github, HipChat, JIRA, Google Spreadsheet
ツール• DevOps
• AWS CloudFormation + Chef + Capistrano
• AWS Elastic Beanstalk + Docker
今日はDockerとElasticbeanstalkの
話をします
Docker
• コンテナ型の仮想マシン
• Dockerfileをこねこねして $ docker run するだけであれこれインストールされた環境が作れる
• 環境をそのまま持ち運びできるので、俺の環境だとhogehogeが発生しづらい
Elasticbeanstalk
• AWSが提供しているHerokuっぽい何か• ELB + Appサーバ な構成がボタン押してるだけで出来てしまう
• Node.JS、PHP、Python、.NET、Java、Rubyアプリをデプロイできる
• 2014/04からDockerアプリケーションをデプロイできるようになった
どうしてこれをやりたいのか• Vagrant + Dockerで開発環境を簡単に持ち運べるようになった• 俺の環境だと動く・ダメ・絶対
• ついでだからプロダクションでもDockerで動かしたくなった
• Elasticbeanstalkとかいうのが便利らしい
なにがうれしいのか• 開発環境とプロダクション環境の差異を減らせる• 環境にまつわるトラブルを減らせる• Twelve-Factor App
• アプリサーバーをImmutableにできる• 毎回新規作成されたインスタンス上で新たにDockerイメージを起動
Elasticbeanstalk + Docker
色々と試行錯誤した結果、以下の構成に落ち着いた
なにをやっとるか1. ローカルでDockerイメージをビルドしてS3上のプライベートレポジトリにpush
2. ローカルマシンからElasticbeanstalkにデプロイリクエスト
3. Elasticbeanstalkが環境に対してデプロイ4. 各インスタンスは起動後、S3にあるイメージを
pullしてきてDockerを起動
兵どもが夢の跡(その1)
• 最初はDockerイメージを作らずに毎回インスタンス上でDockerfileからビルドしていた
• apt-get installから始めるので30分経ってもデプロイが終わらない → 悲しい
兵どもが夢の跡(その2)
• DockerHubにイメージをpushしてから各インスタンスでpullして起動• デプロイは早くなったけど公開イメージになるのでプロダクションで使えない → 悲しい
神降臨• AWSブログの記事でS3をDockerプライベートレポジトリとしてElasticBeanstalkでデプロイする記事が!!• http://aws.typepad.com/sajp/2014/06/eb-
docker-private-repo.html
なにをやっとるか(その1)
• 開発マシン上でdocker-registryコンテナ(プライベートレポジトリ用コンテナ)を立ち上げてビルドしたイメージをS3にpush
• 各インスタンスでdocker-registryコンテナを立ち上げてプライベートレポジトリのイメージをpull
なにをやっとるか(その2)
• 各インスタンスがレポジトリコンテナを立ち上げるので、レポジトリ用サーバを立てるよりも可用性が上がる → 嬉しい
デモ
小ネタ(その1)
• 環境変数でDBやキャッシュサーバへのエンドポイントを変更できるようにしておくと色々楽
• Elasticbeanstalkで立ち上がるAMIはnginx経由でリクエストがコンテナに来るように設定されているので、コンテナにはnginxを立てないほうが綺麗
小ネタ(その2)
• DockerfileとDockerrun.aws.jsonをgitレポジトリルートに配置しておくとDockerrun.aws.jsonが無視される• (railsアプリの場合)レポジトリルートから1階層奥にアプリ本体とDockerfileを配置するとDockerのコンテキストなど気にしないといけないことが減る
サンプル• github上にサンプルアプリケーションを公開しています• https://github.com/bonty/eb-rails-sample
• 質問などありましたら遠慮なくインターネットでお声がけください!