ゴール
既存のrailsプロジェクトををdocker,docker-composeを使用して 環境構築を行いローカルでwebアプリケーションをブラウザ上で表示する。
※本記事はDockerについての記事のため、LinuxのコマンドとGitコマンドの初歩的なものはご自身で出来るという設定で記載しています。
事前準備
- ローカルの環境
PC: mac M1チップ Sonoma 14.0 エディタ:VScode
- 各種バージョン
ruby 3.2.2 Rails 7.0.6 postgresql 12.0
- docker,docker-composeのインストール
手順
1.対象プロジェクトをGithubからクローン(コピー)してくる
2.Dockerfile、doccker-compose.ymlの作成と記述
3.database.ymlファイルの編集
4.コンテナ生成と実行
5.動作確認
全体像としてはこのような流れです。次は各項目の解説していきます。
1.対象プロジェクトをGithubからクローン(コピー)してくる
Github上から対象プロジェクトをクローンするために下記のコマンドを使用します。
git clone <リポジトリパス>
ここからはクローンしてきたディレクトリで作業をします。
2.Dockerfile、docker-compose.ymlの作成と記述
Dockerfileとは?
Dockerfileは、Dockerコンテナの"設計図"のようなものです。このファイルには、コンテナに何をインストールするか、どのように設定するかなど、コンテナを作成するための手順が書かれています。
なぜDockerfileが必要なのか?
Dockerfileを使用すると、コンテナの作成手順を明確にし、それを再利用や共有が可能になります。これにより、同じ環境を再現するのが簡単になります。
Dockerfileは、Dockerコンテナを作るためのレシピのようなものです。このファイルに従って、Dockerはコンテナを作成します。これにより、必要な環境を正確に再現することができます。
docker-composeとは?
docker-composeを使うと、複数のコンテナを簡単に扱えるようになります。そして、その設定はdocker-compose.ymlファイルに書かれています。
docker-composeは、複数のDockerコンテナを一度に管理・実行するためのツールです。一つのコマンドで複数のコンテナを起動・停止できるので、複雑なアプリケーションを簡単に扱えます。
docker-compose.ymlとは?
docker-compose.ymlは、docker-composeがどのようにコンテナを実行するかの設定を書くファイルです。この中に、使用するイメージやコンテナ間のリンク、ポートの設定などが記述されます。
前置きが長くなりましたが下記からDockerfileとdocker-compose.ymlの実際のコードです。
touch Dockerfile
対象プロジェクト直下で上記のコマンドを実行しファイルを作成する。
FROM ruby:3.2.2 RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ postgresql-client \ yarn WORKDIR /rails-docker COPY Gemfile Gemfile.lock /rails-docker/ RUN bundle install
エディタを使用し、Dockerfileを上記のように記載します。 下記に一行ずつの解説を記載していきます。
FROM ruby:3.2.2
- ベースをRubyのバージョン3.2.2を使うように指定しています。
RUN apt-get update && apt-get install -y \
- システムを最新の状態に更新してインストールするようにします。インタラクティブ(対話的)な質問に対しては、全てYESで答えるように-yオプションをつけています。
build-essential \
- 必要な基本的なツールを取り込んでいます。
libpq-dev \
- PostgreSQL(データベース)とやり取りするためのツールをインストールしています。
nodejs \
- JavaScriptを使うためのツール、Node.jsをインストールしています。
postgresql-client \
- PostgreSQLのクライアントツールをインストールします。これにより、コンテナからPostgreSQLサーバに接続できます。
yarn
- JavaScriptのライブラリを管理するツール、yarnをインストールしています。
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
Gemfile
(Rubyのツールリスト)をコンテナに移しています。
RUN bundle install
Gemfile
に書かれているツールを全てインストールしています。
このDockerfileは、Ruby on Railsアプリケーションを動作させるためのDockerコンテナを作成するための設計図です。必要なツールやライブラリをインストールし、アプリケーションの依存関係をセットアップしています。
docker-compose.ymlの記述
以下のコマンドでdocker-compose.ymlを作成します
touch docker-compose.yml
作成したdocker-compose.ymlをエディタで編集していきます。
version: '3' volumes: db-data: services: web: build: . command: bash -c "rails db:migrate && rails s -p 3000 -b '0.0.0.0'" ports: - '3000:3000' volumes: - '.:/rails-docker' environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true depends_on: - db links: - db db: image: postgres:12.0 volumes: - 'db-data:/var/lib/postgresql/data' environment: - 'POSTGRES_USER=postgres' - 'DATABASE_PASSWORD=postgres' - 'POSTGRES_HOST_AUTH_METHOD=trust'
web
とdb
という2つのコンテナを動かすための設定です。
web
はRailsアプリケーション、db
はPostgreSQLデータベースを表しています。
こちらも一行ずつ解説していきます。
version: '3'
- Docker Composeのバージョンを3に指定しています。
volumes:
- ボリューム(データを保存する場所)の設定。
db-data:
db-data
という名前のボリュームを作ります。
services:
- サービス(動かすコンテナの設定)を定義します。今回の場合だとwebとdbが該当します。
web:
web
という名前のサービスを設定します。Railsのwebサービスと、後述のPostgreSQLのdbサービスの2つのコンテナが起動します。
build: .
- 現在のディレクトリのDockerfileを使ってイメージをビルドします。
command: bash -c "rails db:migrate && rails s -p 3000 -b '0.0.0.0'"
ports: - '3000:3000'
- ポートのマッピングを設定し、ホストの3000番ポートをコンテナの3000番ポートに繋げます。
volumes: - '.:/rails-docker'
environment:
- 環境変数を設定します。
- 'DATABASE_PASSWORD=postgres'
- データベースのパスワードを設定します。
tty: true
- 出力を見やすくします。
stdin_open: true
- 標準入力をオープンします。
depends_on:
- コンテナの作成順序の設定です。
depends_on: -db
は、Postgresのコンテナが起動してからRailsのコンテナを起動するという意味です。
- コンテナの作成順序の設定です。
links: - db
web
サービスはdb
サービスとリンクされます。
db:
db
という名前のサービスを設定します。
image: postgres:12.0
- 使うイメージを
postgres
のバージョン12.0に指定します。
- 使うイメージを
volumes:
- ボリュームのマッピングを設定します。
- 'db-data:/var/lib/postgresql/data'
db-data
ボリュームをコンテナの指定の場所にマッピングします。
environment:
- 環境変数を設定します。
- 'POSTGRES_USER=postgres'
- PostgreSQLのユーザー名を設定します。
- 'DATABASE_PASSWORD=postgres'
- データベースのパスワードを設定します。
- 'POSTGRES_HOST_AUTH_METHOD=trust'
- 認証方法を
trust
に設定します。
- 認証方法を
2.database.ymlファイルの編集
default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> host: db user: postgres password: <%= ENV.fetch("DATABASE_PASSWORD") %> development: <<: *default database: rails-docker_development test: <<: *default database: rails-docker_test production: <<: *default database: rails-docker_prod
今回はdocker-composer.yml
で設定した内容をもとに、database.ymlのデフォルトでは記述されていないhost
username
password
を追記しています。
host: db user: postgres password: <%= ENV.fetch("DATABASE_PASSWORD") %>
3.コンテナの生成と実行
下ごしらえが完了したので、dockerのコマンドを使ってrailsの環境を構築していきます。
- イメージの作成
docker-compose build
- DB作成
docker-compose run web rails db:create
※docker-compose run の後はサービス名を指定しないとNo such servicesのエラーが出るので、サービス名の指定は忘れずに...。
- コンテナの作成と起動
docker-compose up
これでrailsアプリをDocker化する手順は以上です。
※今回はdocker-compose.ymlのcommandにrails db:migrate && rails s -p 3000 -b '0.0.0.0'を記述しているので,db:createのみrunしています。
4.動作確認
docker compose ps
でrails serverが動いてるのを確認し
ローカルに接続し、ブラウザにて画面が正しく表示されれば無事終了です。
おわりに
今回dockerを学んでみて最初はやること書くこと多すぎ!とかなり混乱していたのですが、少しづづ慣れていって無事既存のrailsプロジェクトをdocker化することができました。 教材を見返しながら一つずつやっていたのでかなり時間はかかりましたが、docker化の便利さがとともよく分かるいい機会でした。 まだまだdockerについては初学者程度の知識しかないので、使いこなせるようにたくさんハンズオンをしていきたいと思います。