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

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

toshitanian
January 24, 2017
2.6k

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

toshitanian

January 24, 2017
Tweet

Transcript

  1. Docker入門
    サポーターズ勉強会
    2017年01月24日
    ABEJA, Inc.
    河崎 敏弥
    - Ruby on RailsアプリケーションをDockerで動かしてみる -

    View Slide

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

    View Slide

  3. 自己紹介

    View Slide

  4. 河崎 敏弥 @toshitanian
    ABEJA, Inc.
    IoT Analytics Division
    Product Owner
    • 創業1年の時にABEJAに参画
    • 修士1年の時に参加したインターンから入社
    • バックエンドエンジニア
    • クラウド上でシステム構築
    • IoTデバイスとのシステム連携
    • ここ2年はコンテナ推し

    View Slide

  5. 社名# 株式会社ABEJA#
    設立# 2012年9月10日#
    住所# 東京都港区虎ノ門4-1-20田中山ビル10F#
    事業内容#
    ディープラーニングを活用した#
    産業構造変革のサポート#

    View Slide

  6. ABEJA Platform Ecosystem "

    View Slide

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

    View Slide

  8. Dockerとは?

    View Slide

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

    View Slide

  10. 10
    軽量な仮想化技術
    引用: 「Containers 101: Linux containers and Docker explained | InfoWorld 」
    プロセス、ネットワーク、ファイルシステム等の分離

    View Slide

  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、依存ライブラリ、アプリケーションをスナップショットとしてバージョン管理

    View Slide

  12. 12
    環境依存せずにどこでも動く
    (動かない事もある…)
    1.0
    myApp 1.1 2.0 2.2
    2.1
    Development Staging Production
    適切に作られたDockerイメージはDockerの実行エンジン上であればどこでも動く
    環境毎の差分はコンテナの外から注入する事で設定可能

    View Slide

  13. • クックパッド
    • サイバーエージェント(AbemaTV FRESH!)
    • Wantedly
    • …
    • ABEJA
    利用事例
    13

    View Slide

  14. Railsアプリケーション

    View Slide

  15. ゲストブック
    • 名前とメッセージのCRUDができる
    • Ruby on Rails
    • Puma
    • PostgreSQL
    今回Docker化するRailsアプリケーション
    15
    https://github.com/kawasakitoshiya/rails-sample-guestbook

    View Slide

  16. $ git clone [email protected]: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

    View Slide

  17. Docker Engineをインストール

    View Slide

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

    View Slide

  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

    View Slide

  20. イメージ?コンテナ?
    20
    引用: Dockerライフサイクルの基礎 地雷を踏み抜けろ!
    (http://www.slideshare.net/zembutsu/docker-underlying-and-containers-lifecycle)

    View Slide

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

    View Slide

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

    View Slide

  23. アプリケーションをDocker化する
    23
    $ git clone [email protected]: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

    View Slide

  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

    View Slide

  25. 2. .dockerignoreを書く
    25
    .dockerignore …Docker Imageへコピーしたくないファイルを指定
    # アプリケーションのコードをローカル環境から、Docker image内の作業ディレクトリへコピー
    COPY . .
    Docker buildのCOPYステップで無視される
    # .gitは実行時には必要無い
    .git
    # .dockerignoreも実行時には必要無い
    .dockerignore

    View Slide

  26. 3. docker buildする
    26
    $ docker build -t rails-sample-guestbook .
    docker build …Dockerfileからdocker imageを作成するコマンド
    ①Docker imageを作成
    ②rails-sample-guestbookという名前で保存
    ③現在のパスのDockerfileに従って作成
    ① ② ③

    View Slide

  27. Docker化したアプリケーションを動かしてみる

    View Slide

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

    View Slide

  29. コンテナの構成
    29
    db コンテナ
    (PostgreSQL)
    app コンテナ
    (Ruby on Rails App)
    dockerにより作られた仮想ネットワーク 
    172.17.0.3 172.17.0.2

    View Slide

  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は環境変数で指定されたユーザを起動時に作成する)
    ⑥起動するコンテナの元になるイメージを指定 (<イメージ名>:<バージョン>)

    View Slide

  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:[email protected] \
    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ΛηοτΞοϓ

    View Slide

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

    View Slide

  33. 3. アプリケーションコンテナを動かす
    33
    $ docker run -d --name app -p 3000:3000 \
    -e RAILS_ENV=production -e DATABASE_URL=postgresql://user:[email protected] -e SECRET_KEY_BASE=secret \
    rails-sample-guestbook:latest
    ① ② ③ ④


    ①新しくコンテナを起動
    ②コンテナをバックグラウンドで実行
    ③コンテナの名前を指定
    ④コンテナ内のポートをホスト側で公開 (<ホスト側>:<コンテナ側>)
    ⑤コンテナ内の環境変数を設定(pumaはこれをもとにサーバを起動)
    ⑥起動するコンテナの元になるイメージを指定 (<イメージ名>:<バージョン>)
    ⑦コマンド指定が無いので、DockerfileのCMDが実行 (pumaサーバを起動)

    View Slide

  34. アプリケーションにアクセスしてみる
    34

    View Slide

  35. まとめ

    View Slide

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

    View Slide

  37. Docker hub
    Dockerのイメージを共有できるサービス。Githubみたいな感じ。
    Docker Compose
    複数のコンテナで構成されるアプリケーションを定義するツール
    Amazon ECS / Kubernetes
    複数ホストへのコンテナデプロイを自動化してくれるサービス/ミドルウェア
    What to do next…
    37

    View Slide

  38. 38
    イケてるしヤバいエンジニア募集中
    ABEJA Wantedly

    View Slide