Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

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

toshitanian
January 24, 2017
2.8k

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で動かしてみる -
  2. 河崎 敏弥 @toshitanian ABEJA, Inc. IoT Analytics Division Product Owner

    • 創業1年の時にABEJAに参画 • 修士1年の時に参加したインターンから入社 • バックエンドエンジニア • クラウド上でシステム構築 • IoTデバイスとのシステム連携 • ここ2年はコンテナ推し
  3. 10 軽量な仮想化技術 引用: 「Containers 101: Linux containers and Docker explained

    | InfoWorld 」 プロセス、ネットワーク、ファイルシステム等の分離
  4. 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、依存ライブラリ、アプリケーションをスナップショットとしてバージョン管理
  5. 12 環境依存せずにどこでも動く (動かない事もある…) 1.0 myApp 1.1 2.0 2.2 2.1 Development

    Staging Production 適切に作られたDockerイメージはDockerの実行エンジン上であればどこでも動く 環境毎の差分はコンテナの外から注入する事で設定可能
  6. ゲストブック • 名前とメッセージのCRUDができる • Ruby on Rails • Puma •

    PostgreSQL 今回Docker化するRailsアプリケーション 15 https://github.com/kawasakitoshiya/rails-sample-guestbook
  7. $ 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
  8. $ 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
  9. アプリケーションを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
  10. 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
  11. 2. .dockerignoreを書く 25 .dockerignore …Docker Imageへコピーしたくないファイルを指定 # アプリケーションのコードをローカル環境から、Docker image内の作業ディレクトリへコピー COPY

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

    docker build …Dockerfileからdocker imageを作成するコマンド ①Docker imageを作成 ②rails-sample-guestbookという名前で保存 ③現在のパスのDockerfileに従って作成 ① ② ③
  13. コンテナの構成 29 db コンテナ (PostgreSQL) app コンテナ (Ruby on Rails

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

    -p 5432:5432 -e POSTGRES_USER=user -e POSTGRES_PASSWORD=pass postgres:9.4.5 ① ② ③ ④ ⑥ ①新しくコンテナを起動 ②コンテナをバックグラウンドで実行 ③コンテナの名前を指定 ④コンテナ内のポートをホスト側で公開 (<ホスト側>:<コンテナ側>) ⑤コンテナ内の環境変数を設定 (postgresは環境変数で指定されたユーザを起動時に作成する) ⑥起動するコンテナの元になるイメージを指定 (<イメージ名>:<バージョン>) ⑤
  15. 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ΛηοτΞοϓ
  16. 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が実行される) ① ② ③ ④ ⑤
  17. 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サーバを起動) ⑦