Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker入門 - Ruby on RailsアプリケーションをDockerで動かしてみる - / Introduction to Docker

E04bc05dadd5b740eb040e094e2bf5f5?s=47 toshitanian
January 24, 2017
2.4k

Docker入門 - Ruby on RailsアプリケーションをDockerで動かしてみる - / Introduction to Docker

E04bc05dadd5b740eb040e094e2bf5f5?s=128

toshitanian

January 24, 2017
Tweet

Transcript

  1. Docker入門 サポーターズ勉強会 2017年01月24日 ABEJA, Inc. 河崎 敏弥 - Ruby on

    RailsアプリケーションをDockerで動かしてみる -
  2. • Dockerとは何かを、なんとなく知る • 既存のRailsアプリケーションをDocker化する • 作成したDockerイメージをローカル環境で動かしてみる 今回のゴール 2

  3. 自己紹介

  4. 河崎 敏弥 @toshitanian ABEJA, Inc. IoT Analytics Division Product Owner

    • 創業1年の時にABEJAに参画 • 修士1年の時に参加したインターンから入社 • バックエンドエンジニア • クラウド上でシステム構築 • IoTデバイスとのシステム連携 • ここ2年はコンテナ推し
  5. 社名# 株式会社ABEJA# 設立# 2012年9月10日# 住所# 東京都港区虎ノ門4-1-20田中山ビル10F# 事業内容# ディープラーニングを活用した# 産業構造変革のサポート#

  6. ABEJA Platform Ecosystem "

  7. • マイクロサービスのAppコンテナ • Deep Learning/Machine Learningの実行コンテナ • Deep Learning/Machine Learningの学習コンテナ

    Docker in ABEJA, Inc. 7
  8. Dockerとは?

  9. • 軽量な仮想化技術 • アプリケーションと依存関係を一緒にパッケージング・管理できる • 環境依存せずにどこでも動く Dockerとは… 9

  10. 10 軽量な仮想化技術 引用: 「Containers 101: Linux containers and Docker explained

    | InfoWorld 」 プロセス、ネットワーク、ファイルシステム等の分離
  11. 1.0 myApp 1.1 2.0 2.2 2.1 11 アプリケーションと依存関係を一緒にパッケージング・管理できる # Pull

    base image FROM ubuntu:14.04 # Install dependencies RUN apt-get update RUN apt-get install build-essential nodejs libpq-dev -y # Install application COPY . . RUN bundle install # Describe what this container does CMD bundle exec puma -C config/puma.rb Dockerイメージ作成時のOS、依存ライブラリ、アプリケーションをスナップショットとしてバージョン管理
  12. 12 環境依存せずにどこでも動く (動かない事もある…) 1.0 myApp 1.1 2.0 2.2 2.1 Development

    Staging Production 適切に作られたDockerイメージはDockerの実行エンジン上であればどこでも動く 環境毎の差分はコンテナの外から注入する事で設定可能
  13. • クックパッド • サイバーエージェント(AbemaTV FRESH!) • Wantedly • … •

    ABEJA 利用事例 13
  14. Railsアプリケーション

  15. ゲストブック • 名前とメッセージのCRUDができる • Ruby on Rails • Puma •

    PostgreSQL 今回Docker化するRailsアプリケーション 15 https://github.com/kawasakitoshiya/rails-sample-guestbook
  16. $ git clone git@github.com:kawasakitoshiya/rails-sample-guestbook.git $ cd rails-sample-guestbook $ export RAILS_ENV=development

    \ DATABASE_URL=postgresql://postgres:password@localhost \ SECRET_KEY_BASE=secret_key_base $ bundle install $ bundle exec rake db:create db:migrate $ bundle exec rails s 動かし方 16
  17. Docker Engineをインストール

  18. Docker Engineをインストール 18 https://docs.docker.com/engine/installation/ Mac Linux $ curl -sSL https://get.docker.com/

    | sh 18
  19. $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS

    NAMES $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE $ docker run -it ubuntu:14.04 bash Unable to find image 'ubuntu:14.04' locally … Status: Downloaded newer image for ubuntu:14.04 root@273071d9e015:/# root@273071d9e015:/# exit $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 273071d9e015 ubuntu:14.04 "bash" About a minute ago Exited (130) 4 seconds ago youthful_bohr $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 b969ab9f929b 40 hours ago 188 MB Docker Engineが動いている事を確認 19
  20. イメージ?コンテナ? 20 引用: Dockerライフサイクルの基礎 地雷を踏み抜けろ! (http://www.slideshare.net/zembutsu/docker-underlying-and-containers-lifecycle)

  21. RailsアプリケーションをDocker化

  22. 3ステップで既存のアプリケーションからDocker imageを作成 1. Dockerfile を書く 2. .dockerignore を書く 3. docker

    build する Docker化する 22
  23. アプリケーションをDocker化する 23 $ git clone git@github.com:kawasakitoshiya/rails-sample-guestbook.git $ cd rails-sample-guestbook $

    vim Dockerfile # Dockerfileを書く $ vim .dockerignore # .dockerignoreを書く $ docker build -t rails-sample-guestbook . Step 1/9 : FROM ruby:2.3.0 … Step 3/9 : RUN apt-get update && apt-get install -qq -y … … Step 9/9 : CMD bundle exec puma -C config/puma.rb … Successfully built 64715fbcbda3 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE rails-sample-guestbook latest 64715fbcbda3 2 minutes ago 846 MB ruby 2.3.0 7ca70eb2dfea 9 months ago 725 MB
  24. Dockerfile …Docker Imageの構成手順書 1. Dockerfileを書く 24 # Ruby 2.3.0 のDocker

    imageを元に作成 FROM ruby:2.3.0 # 依存関係をインストール RUN apt-get update && apt-get install -qq -y build-essential nodejs libpq-dev --fix-missing --no-install-recommends # Docker image内でのアプリケーションのインストール場所を環境変数に設定、作成 ENV INSTALL_PATH /app RUN mkdir -p $INSTALL_PATH # この行以降でのコマンドの実行パスを設定 WORKDIR $INSTALL_PATH # アプリケーションのコードをローカル環境から、Docker image内の作業ディレクトリへコピー COPY . . # bundle installでアプリケーションの依存ライブラリをインストール RUN bundle install # Docker containerを起動時のデフォルトコマンドを設定。今回はPumaサーバの起動 CMD bundle exec puma -C config/puma.rb 参考: https://semaphoreci.com/community/tutorials/dockerizing-a-ruby-on-rails-application
  25. 2. .dockerignoreを書く 25 .dockerignore …Docker Imageへコピーしたくないファイルを指定 # アプリケーションのコードをローカル環境から、Docker image内の作業ディレクトリへコピー COPY

    . . Docker buildのCOPYステップで無視される # .gitは実行時には必要無い .git # .dockerignoreも実行時には必要無い .dockerignore
  26. 3. docker buildする 26 $ docker build -t rails-sample-guestbook .

    docker build …Dockerfileからdocker imageを作成するコマンド ①Docker imageを作成 ②rails-sample-guestbookという名前で保存 ③現在のパスのDockerfileに従って作成 ① ② ③
  27. Docker化したアプリケーションを動かしてみる

  28. アプリケーションを動かしてみる 28 3ステップでDocker化したアプリケーションを動かす 1. データベースコンテナを起動する 2. データベースのセットアップをする 3. アプリケーションコンテナを動かす

  29. コンテナの構成 29 db コンテナ (PostgreSQL) app コンテナ (Ruby on Rails

    App) dockerにより作られた仮想ネットワーク  172.17.0.3 172.17.0.2
  30. 1. データベースコンテナを起動する 30 PostgreSQLをコンテナとして起動する $ docker run -d --name db

    -p 5432:5432 -e POSTGRES_USER=user -e POSTGRES_PASSWORD=pass postgres:9.4.5 ① ② ③ ④ ⑥ ①新しくコンテナを起動 ②コンテナをバックグラウンドで実行 ③コンテナの名前を指定 ④コンテナ内のポートをホスト側で公開 (<ホスト側>:<コンテナ側>) ⑤コンテナ内の環境変数を設定 (postgresは環境変数で指定されたユーザを起動時に作成する) ⑥起動するコンテナの元になるイメージを指定 (<イメージ名>:<バージョン>) ⑤
  31. 2. データベースのセットアップをする (1/2) 31 $ docker inspect db | jq

    -r ‘.[].NetworkSettings.IPAddress’ 172.17.0.2 ىಈͨ͠PostgreSQLίϯςφͷIPΞυϨεΛऔಘ $ docker run --rm -e RAILS_ENV=production -e DATABASE_URL=postgresql://user:pass@172.17.0.2 \ rails-sample-guestbook rake db:create db:migrate Created database 'rails_sample_production' == 20170109141637 CreateGuestbooks: migrating ================================= -- create_table(:guestbooks) -> 0.0337s == 20170109141637 CreateGuestbooks: migrated (0.0338s) ======================== ίϯςφ಺͔ΒrakeίϚϯυΛ࣮ߦͯ͠DBΛηοτΞοϓ
  32. 2. データベースのセットアップをする (2/2) 32 $ docker run --rm -e RAILS_ENV=production

    -e DATABASE_URL=postgresql://user:pass@172.17.0.2 \ rails-sample-guestbook rake db:create db:migrate rakeコマンドを実行するコンテナを起動してDBをセットアップ ①新しくコンテナを起動 ②実行コマンド終了後コンテナを削除 ③コンテナ内の環境変数を設定 (Railsアプリケーションはこれを元にrakeコマンドを実行) ④起動するコンテナの元になるイメージを指定 ⑤起動時に実行するコマンドを指定(指定しない場合はDockerfileに書かれたCMDが実行される) ① ② ③ ④ ⑤
  33. 3. アプリケーションコンテナを動かす 33 $ docker run -d --name app -p

    3000:3000 \ -e RAILS_ENV=production -e DATABASE_URL=postgresql://user:pass@172.17.0.2 -e SECRET_KEY_BASE=secret \ rails-sample-guestbook:latest ① ② ③ ④ ⑤ ⑥ ①新しくコンテナを起動 ②コンテナをバックグラウンドで実行 ③コンテナの名前を指定 ④コンテナ内のポートをホスト側で公開 (<ホスト側>:<コンテナ側>) ⑤コンテナ内の環境変数を設定(pumaはこれをもとにサーバを起動) ⑥起動するコンテナの元になるイメージを指定 (<イメージ名>:<バージョン>) ⑦コマンド指定が無いので、DockerfileのCMDが実行 (pumaサーバを起動) ⑦
  34. アプリケーションにアクセスしてみる 34

  35. まとめ

  36. • Dockerとは: • 軽量な仮想化技術 • アプリケーションと依存関係を一緒にパッケージング・管理できる • 環境依存せずにどこでも動く • 既存アプリケーションのDocker化は意外と簡単

    • Docker化したアプリケーションは簡単に実行できる まとめ 36
  37. Docker hub Dockerのイメージを共有できるサービス。Githubみたいな感じ。 Docker Compose 複数のコンテナで構成されるアプリケーションを定義するツール Amazon ECS / Kubernetes

    複数ホストへのコンテナデプロイを自動化してくれるサービス/ミドルウェア What to do next… 37
  38. 38 イケてるしヤバいエンジニア募集中 ABEJA Wantedly