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
- なぜDocker?
- Dockerって何?
- Dockerの用語と基本的な作業の流れ
- RailsアプリをDockerで動かす
- 感想と課題
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)
今まで登場したファイルも詳しく見ていきます
作業の流れ
- Docker Engine インストール
- Dockerfileを作成
- GemfileとGemfile.lockを作成
- docker-compose.ymlを作成
- Docker ビルド
- Rails new
- database.ymlを編集
- Docker ビルド
- コンテナを立てる
- データベースを作成
- Yay!
バージョン
- Ruby 2.4.0
- Rails 5.0.2
- MySQL 5.7
- 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