こんにちは、Nanayakuです。
今回は、Dockerの公式ドキュメントの「Quickstart: Compose and Rails」について解説していきます。
開発環境
- mac OS
- Docker version 18.09.2
目次
環境構築する前に
Dockerをインストールしましょう。
プロジェクトの定義
アプリケーションのディレクトリ・ファイルを作成します。
ディレクトリを作成する場所はどこでも大丈夫です。
私はデスクトップに作成しました。
$ mkdir ディレイ名
$ cd ディレイ名
Dockerfileの作成
「Dockerfile」とは、コンテナイメージを自動作成する手順をまとめたファイルのことです。
以下のコマンドで作成できます。
$ touch Dockerfile
$ open Dockerfile
他のやり方として、
$ vi Dockerfile
このコマンドで、ファイルの作成と編集ができます。
編集した後の「:wq」このコマンドで保存・終了することが出来ます。
参考
Dockerfileには拡張子をつけません。
他のファイルも同じで、拡張子がついていないものはそのままで大丈夫です。
Dockerfileには↓の設定を定義します。
Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
Dockerfileの主要な命令
FROM
作成するDockerイメージのベースとなるイメージを指定します。
今回の場合は「rubyのversion2.5」を指定しています。
他にもPHP、MySQLなどあり、DockerHubから選択します。
RUN
Dockerのビルド(イメージの作成)時に、Docker内で実行するコマンドを定義します。
CMD
RUNと似ていて、こっちらもビルド時のDocker内で実行するプロセスを定義します。
RUNとCMDの違いは、RUNはアプリケーションの更新や配置を行い、CMDはアプリケーションそのものを動作させます。
COPY
Dockerを動作させるためのファイルやディレクトリを、Dockerコンテナ内にコピーします。
ENTRYPOINT
コンテナ内で最初に動作するコマンドを指定します。
Dockerfileの下記の部分は、Docker内にGemfileをコピーし、bundle installを実行することを定義しています。
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
Gemfileの作成
Gemfileを作成したら、下記を定義します。
$ vi Gemfile
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5'
Gemfile.lockは空のまま作成します。
$ touch Gemfile.lock
Gemfileは必要なgemリストで、Gemfile.lockは実際にインストールされたgemを記録するファイルです。
entrypoint.shファイルの作成
$ vi entrypoint.sh
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
このファイルはコンテナが起動した時、最初に実行されるコマンドを定義しています。
docker-compose.ymlファイルの作成
$ vi docker-compose.yml
docker-compose.yml
version: '3'
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
docker-compose.ymlは、複数のコンテナを実行するためのファイルです。
この場合は、データベースとrailsのコンテナを連携させ実行しています。
プロジェクトの構築
以下のコマンドを実行します。
$ docker-compose run web rails new . --force --no-deps --database=postgresql
「run」はイメージ・コンテナに対して1回のみ実行するコマンドです。
「run web rails new」は、docker-composeに対してwebサービスを開始し、rails newを1回のみ実行することを表しています。
「--force」は、「強制的に」と言う意味があります。
「--no-deps」は、runコマンドでリンクされたコンテナを起動させない命令です。
「--force --no-deps --database=postgresql」は、リンクされたデータベースの「postgresql」を起動させないと言う意味です。
$ ls -l
このコマンドで、生成されたファイル一覧を確認できます。
rails newで新しく「Gemfile」が生成されたので、もう1度buildする必要があります。
$ docker-compose build
データベースに接続
上記でアプリを起動することが出来るようになりましたが、railsとデータベースのコンテナが連携されていません。
そのため、railsのデータベースのデフォルト設定を変更しなければなりません。
「config/database.yml」の内容を以下の内容に書き換えます。
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
うまくいくと画像のようになります。
これでrailsとデータベース(postgresql)のコンテナを連携させられましたが、データベースは作成されていません。
そこで、新しくターミナルを開き、以下のコマンドを実行します。
$ docker-compose run web rake db:create
これで開発環境の構築は完了です。
「http://localhost:3000」で、Railsのウェルカムページが表示されるはずです。
webにアクセスすると、画像のようになります。
停止方法
サーバーは「control + c」で停止します。
コンテナ(アプリケーション)は以下のコマンドで停止します。
$ docker-compose down
再起動
アプリケーションを再び起動するには、もう1度upコマンドを実行します。
$ docker-compose up
まとめ
step
1Dockerfileの作成
step
2Genfileの作成
step
3entrypoint.shの作成
step
4docker-compose.ymlの作成
step
5プロジェクト(compose)の構築
参考サイト
最後に
今回作成したサンプルをGitHubにアップしています。
https://github.com/sabakan789/rails_sample
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。