ume

railsをdocker化させる

作成する環境

  • ruby 3.2.2
  • Rails:7.0.6
  • Postgres:version12系

全体像

  1. Dockerfile作成

  2. docker-compose.ymlファイル作成

  3. docker-compose up でコンテナ作成

  4. データベース作成(初めて起動する場合)

  5. マイグレーションを適用する(初回)

  6. host:3000にアクセスする。

Dockerfile作成

⇨Dockerfileとはコンテナの中にどんなプログラミング言語やOSの環境を作るかを定義するファイル.
今回はRubyRailsの環境をコンテナ内に作成します。

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp
RUN bundle install

FROM.
プログラミング言語やOSを記載.
今回はrubyの3.2.2というバージョンをコンテナ内で使ってねという意味

RUN.
linuxコマンドでライブラリーなどをインストールするコマンド.

WORKDIR.
⇨コンテナ内で作業するディレクトリを指定している。コンテナ内に指定のディレクトリがない場合は作成してくれる。またその作成したディレクトリまで移動してくれる。

COPY.
左<ホストマシン>右<コンテナ内>という構文です.
ホストマシンのGemfileをコンテナ内の/myapp/Gemfileという場所にコピーするという意味

COPY Gemfile /myapp/Gemfile

2つ目のRUN.
⇨RUNコマンドが使われているのでbundle installしてという意味 bundle installはGemfileの中身をインストールしてという意味。

docker-compose.ymlファイル作成

docker-compose.ymlとは複数のコンテナを一括管理するためのファイル。 ↓railsとpostgresを一括管理

version: '3.8'

services:
  db:
    image: postgres:12.18-alpine3.18
    restart: always
    environment:
      POSTGRES_PASSWORD: password
    volumes:
      - "db-data:/var/lib/postgresql/data"

  web:
    build: .
    command:
      bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
    db-data:

version.
⇨新しいものを使いたかったので3.8を使いました。他にもバージョンはありますので下記参照して下さい

docs.docker.jp

services.
⇨ 起動するコンテナの設定の定義をするのがservices.
今回で言うと「db」、「web」と言うコンテナを作成するという意味。このコンテナ名の名前は任意につけることができる。

db

image.
⇨コンテナ内にどんな環境を作成するか.
今回はpostgres:12.18-alpine3.18という環境をdockerhubから取得したイメージから作成する。

enviroment.
⇨データベースを使用するときにuser名とパスワードが求められるのでその設定をする。postgresではuser名を記載しないとデフォルトでpostgresを指定していることになる。

[db]のvolumes.
⇨コンテナ内のデータをホストマシンに共有するためのもの。要はコンテナが破棄されデータが消えてもホストマシンにデータを残すための設定。

構文.

ホストマシンの名前付きボリューム:コンテナ内のデータが保存されているパス

名前付きボリュームとは?
⇨コンテナ内のデータを保存するための空間に名前をつけたのもの。今回はホストマシンの中のdb-dataという名前の空間にコンテナのデータを保存する。

docker-compose.ymlファイルの最後に記載されている以下でホストマシンの中に db-data:という名前付きボリュームを作成している。

volumes:
    db-data:
web

build.
⇨dockerfileまでのパスを指定し、そのdockerfileをbuildしイメージを作成。

command.
⇨コンテナが作成されたときに実行されるコマンド。サーバーを立ち上げています。

「web」volumes.
⇨ホストマシンとコンテナ内を同期してます。この設定のおかげでホストマシンの変更がリアルタイムでコンテナ内に反映される(逆も然り)。

ports.
⇨ローカルとコンテナ内のポートを作成

depends_on:.
⇨コンテナ間の依存関係を制御するオプション

データベース作成(初めて起動する場合)

コンテナ起動

docker compose up

データベース作成

docker-compose run web rake db:create

マイグレーションを適用

docker-compose run web rails db:migrate

 6. host:3000にアクセスする。

http://localhost:3000

画面に「Task」という文字が表示されたら完成。