Kunibiki.rb#3
セラリン
Rubyプログラマ 4年生
1年半前に関西から来た
関西っぽくない関西人
Twitter: @Selime_0123
(あとおかしい点あればご指摘お願いしますー)
Dockerとは
軽量な仮想化環境を実現するためのツール
Dockerの利点
Dockerの用語
ゲストOS
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)
今まで登場したファイルも詳しく見ていきます
作業の流れ
バージョン
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"」を追加して、
ブラウザリロードしてみて!
良かったこと
微妙な点
データ永続化は可能らしい
もうちょっといい感じに設定ファイル書けそうな気もするので〜
特にvolumeあたりを活用(勉強します😅)