Dockerを学習したので、DockerでWebアプリをdocker化する手順を記載していきます。
railsアプリのテンプレがすでに用意されているので、今回はそちらを使用します。
(git cloneしてローカル環境に配置)
最初はDockerfileとdocker-compose.ymlをアプリのベースとなるディレクトリに作成します。
Dockerfileにはコンテナの基礎となる情報を記載し、
docker-compose.ymlには、コンテナへの追加設定と複数コンテナ(サービス)について記載していきます。
Dockerfile
まずはDokcerfileを編集する。
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Dockerfileの説明
- ベースのイメージにRubyのバージョン3.2.2を指定
- コンテナ内で必要なパッケージをインストール
(rails、ruybやpostgresをコンパイルするのに必要なパッケージ) - コンテナ内のワークディレクトリ作成 & 指定
- GemfileとGemfile.lockをワークディレクトリへコピーする
- bundle installを実行
- カレントディレクトリ(プロジェクトのあるディレクトリ)の全てを
ワークディレクトリへコピーする。
docker-compose.yml
docker-compose.ymlを編集する。
version: "3"
services:
db:
image: postgres:12
environment:
- "POSTGRES_USER=postgres"
- "POSTGRES_PASSWORD=postgres"
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
environment:
- "POSTGRES_PASSWORD=postgres"
ports:
- "3000:3000"
depends_on:
- db
docker-compose.ymlの説明
db サービス
- データベースにpostgresのバージョン12を指定
- 環境変数(ユーザ、パスワード)を設定
web サービス
- カレントディレクトリをビルドコンテキストに指定
- コンテナ立ち上げ時に実行されるコマンドを設定(rails サーバを起動)
- ボリュームマウントを設定(コンテナ内のWORKDIRをホストのカレントディレクトリにマウント)
- 環境変数(postgresのパスワード)を設定
- ポートを設定(ホストマシンのポート:コンテナ内のポート)
- 依存設定(dbサービスを先に立ち上げてからwebサービスを立ち上げる)
config/database.yml
次にconfig/database.ymlを編集します。
default: &default
adapter: postgresql
encoding: unicode
host: db
user: postgres
password: <%= ENV.fetch("POSTGRES_PASSWORD") %>
database.yml
- host: db を設定することで、servicesのdbを指すことができる
- userとpasswordを設定
- passwordは環境変数から取得
(webサービスからのアクセス時にdocker-compose.ymlに設定した環境変数(パスワード)から受け取る)
コンテナ起動
ターミナル上でビルドコンテキストのあるディレクトリへ移動し
以下のコマンドを実行。
$ docker-compose up
以下のログが出力されれば、コンテナ起動成功。
rails7_docker_template-db-1 | 2026-04-13 14:03:55.701 UTC [1] LOG: database system is ready to accept connections
rails7_docker_template-web-1 | => Booting Puma
rails7_docker_template-web-1 | => Rails 7.0.6 application starting in development
rails7_docker_template-web-1 | => Run `bin/rails server --help` for more startup options
rails7_docker_template-web-1 | Puma starting in single mode...
rails7_docker_template-web-1 | * Puma version: 5.6.6 (ruby 3.2.2-p53) ("Birdie's Version")
rails7_docker_template-web-1 | * Min threads: 5
rails7_docker_template-web-1 | * Max threads: 5
rails7_docker_template-web-1 | * Environment: development
rails7_docker_template-web-1 | * PID: 1
rails7_docker_template-web-1 | * Listening on http://0.0.0.0:3000
rails7_docker_template-web-1 | Use Ctrl-C to stop
ターミナルで別タブを開き、ビルドコンテキストのあるディレクトリへ移動し
以下のコマンドを実行する。
データベースを作成
$ docker-compose run web rake db:create
テーブルを作成
$ docker-compose run web rake db:migrate
localhost:3000へアクセス
アクセス成功。
まとめ
今回はrailsアプリをdockerとdocker composeでwebアプリをdocker化する方法を記載しました。テンプレのアプリなので、シンプルな構造ではありましたが、railsに必要なパッケージを指定したり、dbサービスとwebサービスを同時に立ち上げて、通信するなど、dockerにおいて基礎となる知識を学ぶことができたと思います。まだ理解が浅い部分があるので、今後も継続して学習していこうと思います。
