kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

危機感にかられて今更Dockerを学び直す人の記録(Railsを動かしてみる編)

これまでのあらすじ

概要を理解して、Imageを作ってコンテナをうごかしてみました

kasei-san.hatenablog.com

kasei-san.hatenablog.com

今日やること

公式のクイックスタートガイドを元に、ローカルのDockerでRailsを動かしてみる

docs.docker.com

ワーキングディレクトリ作成

cd .
mkdir -p work/rails_docker_demo
cd work/rails_docker_demo
git init

Dockerfile について

概要編でも軽く説明したが、Imageの環境を定義するDockerfileと言うものがあり、クイックスタートガイドでは、それでRails環境を作るように書かれている

Dockerfileに以下を定義

FROM ruby:2.4.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

コマンド解説

リファレンスはこちらを参照

docs.docker.com

FROM

ベースとなるImageを定義。

クイックスタートでの定義がちょっと古かったので、dockerhubのrubyオフィシャルから安定最新っぽい2.4.2に変更した

RUN

/bin/sh -c でコマンドを実行する

WORKDIR

ワーキングディレクトリを定義

これ以下のコマンドでのカレントディレクトリが、ワーキングディレクトリになる

COPY

Dockerホストからファイルをコピー

DockerホストでGemfile作成

source 'https://rubygems.org'
gem 'rails', '5.1.4'

COPY Gemfile.lock のために空の Gemfile.lock を作成

touch Gemfile.lock

docker-compose.yml の作成

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose とは?

ホスト上の複数のコンテナを一元管理する為のツール

docker-compose.yml で定義

今回は、webと、dbのコンテナの設定をそれぞれ定義している

docker-compose.yml のコマンド解説

リファレンスはこちらを参照

docs.docker.com

version

docker-compose のバージョン指定。最新なら 3

services

各コンテナをサービスとして定義する場所

image

imageのタグ、id等を定義。dockerfileの FROM と同じ?

build

dockerfileのPATH

command

コンテナに定義されているデフォルトのコマンドを上書きする

volumes

PATHをボリュームとして定義

ボリューム

コンテナを実行するときに、ホストのディレクトリをコンテナのディレクトリにマウントできる

このとき、マウントされた領域をボリュームという

ports

docer run のpublishオプションと同じもの?

depends_on

依存関係の定義

今回の場合、webを起動するには、dbの起動が必要

環境のビルド

docker-compose run は、docker-compose.yml に定義された環境を作成して、コマンドを実行。完了したら各コンテナを終了する

docker-compose run web rails new . --force --database=postgresql

docker-compose のコマンド解説

run

ワンオフなタスクの実行

特定のサービスを指定する必要がある

指定したサービス用のコンテナと、それと依存関係にあるサービス用のコンテナが起動する

実行後、コンテナは停止する

docker container build を実行していない場合、一緒に実行される

build

docker-compose.yml の内容に従って環境がビルドされる

Dockerfileを変更した場合は、今回ならば Gemfile を変更した場合、build が必要

buildではまだコンテナは作成されない??

up

コンテナを作成して起動する

start

環境の再構築

新しいgemを追加したり、Dockerfieを更新した場合

docker-compose build

DBへの接続

config/database.yml を以下のように変更する

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

環境の起動

$ docker-compose up

rake db:create の実行

docker-compose run web rake db:create

localhost:3000/ に接続

f:id:kasei_san:20171202180135p:plain

👏

環境の停止

docker-compose down

環境のステータス

docker-compose ps

起動時

        Name                       Command               State           Ports
---------------------------------------------------------------------------------------
railsdockerdemo_db_1    docker-entrypoint.sh postgres    Up      5432/tcp
railsdockerdemo_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp

終了時

        Name                       Command               State    Ports
-----------------------------------------------------------------------
railsdockerdemo_db_1    docker-entrypoint.sh postgres    Exit 0
railsdockerdemo_web_1   bundle exec rails s -p 300 ...   Exit 1

ここまでのコード

github.com

感想

とりあえず、動かすことができたという感じ

これで実際にどうやって、開発/本番環境の運用をしていくのかイメージは湧いていない

今後

ECSや、herokuで、docker on rails な環境を動作させてみる

参考

qiita.com

qiita.com

qiita.com

qiita.com