• dockerをインストール している前提とする
  • docker compose で動かす
    • docker compose は、複数コンテナを1単位として管理するツール。例えば、rails, postgres, redis をひとまとまりで管理するなど。

Dockerfile を作成

  • rails アプリのルートディレクトリに以下の Dockerfile を作成する
    • docker イメージを作成するため定義ファイル
ARG RUBY_VERSION=3.4.1
FROM ruby:${RUBY_VERSION}

ARG APP_NAME=app_name
ARG APP_PATH=/${APP_NAME}
WORKDIR ${APP_PATH}
COPY . .
RUN bundle install

EXPOSE 3000

CMD rails server -b 0.0.0.0
  • FROM ruby:${RUBY_VERSION}
    • ベースのdockerイメージを指定する
  • WORKDIR ${APP_PATH}
    • この後の作業ディレクトリの指定
    • RUN mkdir ${APP_PATH} && cd ${APP_PATH} としなくていい
  • COPY . .
    • COPY {ホストのディレクトリ} {コンテナのディレクトリ} として、ホストのファイルをコンテナにコピーする
    • 今回は、両方ともカレントディレクトリ
  • RUN bundle install
    • RUN は、コンテナの中でコマンドを実行する
  • EXPOSE 3000
    • 公開ポートを指定する
    • EXPOSE自体は何もしない。ドキュメンテーションのための記述。
      • このイメージを使う人が、 Dockerfile を見るだけでコンテナ側のポートの設定ができる
      • なので無くてもいい
  • CMD rails server -b 0.0.0.0
    • コンテナ起動時のデフォルトのコマンドを指定する
      • コンテナ起動時にコマンドを渡されたら、渡されたコマンドで上書きされる
    • Dockerfile に1つだけ記述するもの
    • コンテナの実行プロセスになる
      • このプロセスが落ちるとコンテナも落ちる

docker-compose.yml を作成

  • rails アプリのルートディレクトリに以下の docker-compose.yml を作成する
services:
  web:
    build:
      context: .
      network: host
    ports:
      - 127.0.0.1:3000:3000
  • services
    • 管理するコンテナの一覧を記載
    • build
      • docker ビルドの設定
        • context
          • ビルドを実行するディレクトリ
          • dockerfile を指定しない場合、Dockerfile が存在するディレクトリを指定
        • network
          • ビルド時のネットワークを指定
          • デフォルトだと外部との通信がうまくいかなったので host を指定した
      • ports
        • {ホストのポート}:{コンテナのポート} でポートの公開を設定
        • 単に 3000:3000 だと 0.0.0.0 に公開するので、一旦 127.0.0.0.1 に限定した

実行

  • docker 起動
docker compose up
  • rails にアクセスできることを確認
curl localhost:3000