Railsアプリ開発者のためのDocker入門

Kunibiki.rb#3

セラリン

 

Rubyプログラマ 4年生

 

1年半前に関西から来た

関西っぽくない関西人

 

Twitter: @Selime_0123

Who am I

Ruby and I

  • 学生時代関西の学校にMatzが来た
  • Ruby合宿(2013夏)
  • RailsGirls講師(5回)
  • Railsのお仕事(4年くらい)
  • Rubyコミュニティロゴイラスト職人
  • Ruby会議松江08ポスター職人

はじめに

  • Docker初めての人: こういうことができるって知ってもらいたい
  • Dockerすでに触っている人: ベストプラクティスを共有したい

(あとおかしい点あればご指摘お願いしますー)

 

Agenda

  1. なぜDocker?
  2. Dockerって何?
  3. Dockerの用語と基本的な作業の流れ
  4. RailsアプリをDockerで動かす
  5. 感想と課題

1. なぜDocker?

自分はこういう人です😎

  • Railsアプリプログラマ
  • Macで開発したい!
  • たまに複数のプロジェクトを掛け持ち(Rails2と5を同時期にやったりしてます)
  • Linuxは苦手。現在基礎から勉強中(^^;)

ただ問題が😥

  • 掛け持ちしているプロジェクトのMySQLのバージョンが異なったり...
  • 開発はMac。本番はLinux。

じゃ、VMやVagrantは?😯

  • 使い慣れてるエディタが使えない(再度構築作業が)
  • 起動重っ
  • (vagrantはgitだけ入れていちいちpullして確認してたw)

希望😊

  • Macで開発したい
  • 使い慣れてるエディタ使いたい
  • 開発環境なるべく楽に構築したい

Dockerはそれらを

叶えてくれると聞いて😍

Dockerを触ってみることに💪

2.Dockerって何?

Dockerとは

軽量な仮想化環境を実現するためのツール

Dockerの利点

  • コンテナなのでオーバヘッドが少なく、 動作が軽い
  • コンテナイメージを手軽にやり取りできる
  • コンテナは様々な環境で等しく動く
  • 各コンテナはいろいろなディストリビューションやバージョンで構成できる
  • コンテナ(インフラ)をコードで表現できる
  • コンテナ(環境)を壊して作りなおす運用が可能

3.Dockerの用語と

基本的な作業の流れ

Dockerの用語

ゲストOS

  • image
  • container
  • Docker Hub
  • Dockerfile
  • Docker Compose

Dockerの基本的な使い方

Docker Hub( Docker Index)

OS (Docker installed)

OS (Docker installed)

Dockerのリポジトリ(保管場所)

Image

Container

Image

docker pull

雛形

Dockerfile

実体(imageを起動したもの)

docker commit

Image 2

docker run

docker push

Image 2

Image 2

docker pull

docker run i -t [image] /bin/bash

# apt-get install nodejs など色々操作

これを起動したコンテナにはnodejsが入っている

Image 2

Image

親コンテナか らの差分管理 ができるため、 コンテナイメージの容量を軽量化

# apt-get install nodejs

ubuntu

Dockerfileとは

Docker Index

OS (Docker installed)

OS (Docker installed)

Container

Image

Dockerfile

実体

docker commit

Image 2

docker run

docker push

Image 2

Image 2

docker pull

import

docker build

コンテナの構成情報を書く

自動化するためのスクリプトファイル

runで実行する命令が書けたりする

サーバインフラをコード化

Docker Index

OS (Docker installed)

docker-compose とは

複数のコンテナを実行・管理するためのツール

複数のコンテナ間で専用のネットワークを構築

ただ、docker run コマンドでいちいち設定するのは大変...😓

docker-composeでまとめてコード化して管理!😆

4. RailsアプリをDockerで動かす

(今回はRailsとMySQL)

今まで登場したファイルも詳しく見ていきます

作業の流れ

  1. Docker Engine インストール
  2. Dockerfileを作成
  3. GemfileとGemfile.lockを作成
  4. docker-compose.ymlを作成
  5. Docker ビルド
  6. Rails new
  7. database.ymlを編集
  8. Docker ビルド
  9. コンテナを立てる
  10. データベースを作成
  11. Yay!

バージョン

  • Ruby 2.4.0
  • Rails 5.0.2
  • MySQL 5.7
  1. Docker Engine インストール

https://docs.docker.com/engine/installation

自分はdocker for mac

2. Dockerfileを作成

FROM ruby:2.4.0
MAINTAINER Serarin
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install --path vendor/bundle
COPY . /app
$ touch Dockerfile

FROM ベースimage

MAINTAINER 作者(必須ではない)

RUN buildするときに実行する命令

CMD runする時に実行する命令

WORLDIR 作業ディレクトリを指定

COPY 指定したファイル・ディレクトリをコンテナ内にコピー

 

https://hub.docker.com/

Docker Imageはここで検索

3. Gemfile, Gemfile.lockを作成

source 'https://rubygems.org'
gem 'rails', '5.0.2'
$ touch Gemfile
$ touch Gemfile.lock

Gemfile

4. docker-compose.ymlを作成

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      APP_DATABASE_HOST:     db
      APP_DATABASE_USERNAME: root
      APP_DATABASE_PASSWORD: password
$ touch docker-compose.yml

docker-compose.yml 詳しく1

version: '3'
services:
  db:
  web:

version: 2と3の場合必要

services: 2と3の場合必要

                  この下にサービス名をかく

                  今回はrailsサーバー(web)とMySQL (db)用の2つ用意

$ docker -v

Docker Engineのバージョンの調べ方

3はDocker Engine 1.13.0以上必要

docker-compose.yml 詳しく2

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password

image: 元となるimageを指定

environment: 環境変数を指定。配列か辞書形式で指定。

docker-compose.yml 詳しく3

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      APP_DATABASE_HOST:     db
      APP_DATABASE_USERNAME: root
      APP_DATABASE_PASSWORD: password

build: Dockerfileのあるディレクトリのパス

command: デフォルトのコマンド上書き

volumes: ホストのパス:コンテナのパス。マウント。ソースコード変更したらDocker側も即反映。配列で指定

ports: ホストのポート:コンテナのポート を配列で指定。コンテナのportは必須

depends_on: 依存関係のある順番でサービスを起動したいので。db → web

5.Docker ビルド

  $  docker-compose build

6.Rails new

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

$ docker-compose run [サービス名] コマンド

コンテナ内で実行させる場合

7.database.ymlを編集

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5

development:
  <<: *default
  database: app_development
  host: <%= ENV['APP_DATABASE_HOST'] || 'localhost' %>
  username: <%= ENV['APP_DATABASE_USERNAME'] || 'root' %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] || '' %>

test:
  <<: *default
  database: app_test
  host: <%= ENV['APP_DATABASE_HOST'] || 'localhost' %>
  username: <%= ENV['APP_DATABASE_USERNAME'] || 'root' %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] || '' %>

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

8.Docker ビルド(ファイルを反映させる)

  $  docker-compose build

9.コンテナを立てる

$ docker-compose up
$ docker-compose stop

止める場合

10.データベースを作成

$ docker-compose run web rails db:create

別タブを開く

(コンテナ起動したままで)

11.Yay!

(http://localhost:3000)

$ docker-compose run web rails g controller tests index

ホストのroutes.rbに「root to: "tests#index"」を追加して、

ブラウザリロードしてみて!

5.感想と課題

仕事で使ってみて

良かったこと

  • Macで使い慣れてるエディタでコードを修正できた。
  • 開発環境構築が楽。Dockerfileとdocker-compose.ymlに書くだけでできた。(手順書として残せる。使いまわせる)
  • MySQL5.6と5.7のプロジェクトを掛け持ち、切り替え楽

​微妙な点

  • rails等のコマンドが長くなる(docker-compose run [イメージ] いつものコマンド )
  • コンテナ止めたらデータ消える(seedや使えばそんなに困らないけど。testはfactory_girlだし)

データ永続化は可能らしい

もっとDockerを理解すれば、

より便利に開発環境を作れそう😃

 

もうちょっといい感じに設定ファイル書けそうな気もするので〜

今後の自分の課題

  • Dockerによる環境構築のベストプラクティス
  • データの永続化

特にvolumeあたりを活用(勉強します😅)

Thank you for you time.

Kunibiki#3

By serarin

Kunibiki#3

  • 3,470