これまでのあらすじ
概要を理解して、Imageを作ってコンテナをうごかしてみました
今日やること
公式のクイックスタートガイドを元に、ローカルのDockerでRailsを動かしてみる
ワーキングディレクトリ作成
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
コマンド解説
リファレンスはこちらを参照
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 のコマンド解説
リファレンスはこちらを参照
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/
に接続
👏
環境の停止
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
ここまでのコード
感想
とりあえず、動かすことができたという感じ
これで実際にどうやって、開発/本番環境の運用をしていくのかイメージは湧いていない
今後
ECSや、herokuで、docker on rails な環境を動作させてみる