Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

ABEJA Platform Ecosystem "

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Dockerとは?

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Railsアプリケーション

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

$ 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

Slide 17

Slide 17 text

Docker Engineをインストール

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

$ 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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

アプリケーションを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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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ΛηοτΞοϓ

Slide 32

Slide 32 text

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が実行される) ① ② ③ ④ ⑤

Slide 33

Slide 33 text

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サーバを起動) ⑦

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

まとめ

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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