こんにちは!
勉強と休みのメリハリがようやくつくようになって、勉強の進みが改善してきたみんみんです。
(※なお、「仕事・勉強・寝る」だけの自称廃人生活は未だ継続中です)
今回は、DockerとDocker Composeにて既存アプリの環境構築をする方法を書いていきます!
すでにWebアプリのソースコードがGithub上にある状態から、以下2点を行います。
- Dockerで環境構築する
-
docker compose up
コマンドでrails serverを起動し、http://localhost:3000
でWebアプリにアクセスできるようにする
主な手順は以下の通りです。
1. GitHub上のソースコードをローカルへクローン
2. Dockerfile、docker-compose.ymlを新規作成・内容記載
3. database.ymlを編集
4. Dockerのイメージ・コンテナ作成
5. データベース作成
6. 「http://localhost:3000」で動作確認
なお、今回の手順についてはすでにDockerがインストールされていることが前提です。
GitHub上のソースコードをローカルへクローン
まずは、GitHub上にあるソースコードをローカルへクローンします。
ターミナルを開きましょう。
以下のコマンドを実行すればクローンできます。
git clone 該当リポジトリのSSH key
Dockerfile、docker-compose.ymlを新規作成・内容記載
次に、Dockerfile
とdocker-compose.yml
を新規作成します。
以下のコマンドで先ほどクローンしたリポジトリへ移動し、ファイルを作成しましょう。
cd クローンしたリポジトリ名
touch Dockerfile
touch docker-compose.yml
Dockerfileの内容を記載
まずは、Dockerfile
に必要事項を記載していきます(新規作成後は何も書いてありません)。
Dockerfile
とは、Dockerイメージ
を作るために必要な設計図です。
今回の目的であるDockerコンテナ
を作るには、Dockerイメージ
を作成する必要があります。
つまり、Dockerfile
を元にDockerイメージ
を作り、さらにDockerイメージ
を元にDockerコンテナ
を作るという流れです。
Dockerfile作成
↓
Dockerイメージ作成
↓
Dockerコンテナ作成
まずは公式リファレンスからDockerfile
の雛形を持ってきて、その他必要な条件に従って記載しましょう。
例としては以下のように書きます(リポジトリ名をrails-docker
としています)。
# 今回使用するRubyのバージョンを指定
FROM ruby:3.2.2
# 必要なパッケージの最新バージョンをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
# 「rails-docker」ファイルを作成
RUN mkdir /rails-docker
# 作業ディレクトリを「rails-docker」に指定
WORKDIR /rails-docker
# 「rails-docker」にGemfileとGemfile.lockを追加
ADD Gemfile Gemfile.lock /rails-docker/
# コマンド「bundle install」を実行
RUN bundle install
# ローカルの「rails-docker」にあるファイルをコンテナ内の「rails-docker」へ追加
ADD . /rails-docker
docker-compose.ymlの内容を記載
続いて、docker-compose.yml
に必要事項を記載します。
docker-compose.yml
とは、Docker Compose
というツールを使うための設定について記載しているファイルです。
Docker Compose
を使えば、複数のコンテナについて条件定義・実行・管理できます。
1つのアプリを開発するには複数のコンテナを作る必要があるので、それらをバラバラに管理していては大変です。
そのためにdocker-compose.yml
で、それぞれのコンテナについて条件を定義しておきます。
先ほどと同じく、リポジトリ名をrails-docker
とした例が以下の通りです。
# Composeファイルのバージョンを指定
version: '3'
# 各コンテナの設定
services:
# dbコンテナの設定
db:
# イメージの設定(postgresのバージョン12を使用する)
image: postgres:12
# postgresの環境変数としてユーザー名とパスワードを指定
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
# postgresのデータベースを/var/lib/postgresql/dataに認識させ、永続的に使えるようにする(毎回データベースを作り直す必要がなくなる)
volumes:
- postgresql-data:/var/lib/postgresql/data
# webコンテナの設定
web:
# カレントディレクトリのDockerfileに基づいてwebコンテナを作成
build: .
# 「bundle exec rails s」コマンドでrails serverを立ち上げ、3000番ポートをブラウザで表示できるように設定
command: bundle exec rails s -p 3000 -b '0.0.0.0'
# コンテナで作られるデータをローカルにも保存して、永続的に保存する「volume」の設定(コンテナを削除してもデータが消えなくなる)
volumes:
# ローカル側で同期したいディレクトリとコンテナ側で同期したいディレクトリを指定
- .:/rails-docker
# ポートをrailsのデフォルトポートである3000番に指定
ports:
- "3000:3000"
# dbコンテナを起動してからwebコンテナを起動するように設定
depends_on:
- db
# 「volume」を動かすための接続先(driver)をローカルに指定
volumes:
postgresql-data:
driver: local
database.ymlを編集
最後に、database.ymlを
編集します。
database.yml
はconfig
フォルダの中にあり、Railsアプリケーションがデータベースに接続する際に必要な情報を設定しているファイルです。
すでに記載されているもの以外に、host
username
password
を設定するコードを加えましょう。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
# データベースを動かすとき、dbイメージを使うように設定
host: db
# ユーザー名を設定
username: postgres
# パスワードを設定
password: postgres
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
username: myapp
password: <%= ENV["MYAPP_DATABASE_PASSWORD"] %>
Dockerのイメージ・コンテナ作成
ここまでで、ようやくDockerのイメージ・コンテナを作れるための準備ができました。
さっそくターミナルでコマンドを実行していきましょう。
まずはイメージを作ります。
docker-compose build
続いてコンテナを作成し、起動します。
docker-compose up -d
両方とも少し時間がかかるので、気長に待ちましょう。
データベース作成
続いて、Railsアプリで作成したデータを保管するために必須のデータベースを作ります。
まずは先ほど作ったコンテナの中に入りましょう。
docker-compose exec web bash
普段コマンドを打つときは頭に%
もしくは$
がついていますが、それが#
に変わっていたら無事コンテナ内に入れたという事です。
そして#
の後ろに以下のコマンドを打ち、Railsのデータベースを作成しましょう。
rails db:create
そして、Railsアプリのソースコードにあるmigrationファイル
の内容をデータベースに反映させます。
(※今回は深く説明しませんが、このコマンドを実行しないとエラーになります)
rails db:migrate
設定が終わったので、以下コマンドでコンテナから出ましょう。
exit
http://localhost:3000
で動作確認
さて、Railsアプリは起動するでしょうか?
以下のコマンドでDockerのコンテナを一度に起動しましょう。
docker-compose up
ブラウザでhttp://localhost:3000
へ行ってみて、Webアプリの内容が表示されていれば成功です!
最後は以下のコマンドで、起動したコンテナを終了しておきましょう。
docker compose down
今回は以上です!
初心者のアウトプットのため、間違いなどありましたらお手数ですがご教示いただけますとありがたいです!