React フロントエンド アプリケーションを使用して Ruby on Rails を Docker 化すると、開発ワークフローとデプロイメント プロセスが大幅に改善されます。アプリの標準化された環境を作成することで、開発、テスト、運用のさまざまな段階、さらには異なるシステム間でも一貫した動作が保証されます。実際、システムの違いに関連する問題を最小限に抑えるように設計されています。このガイドでは、Rails および React アプリを Docker コンテナーでスムーズに実行するための重要な手順について説明します。 アプリケーションを Docker 化する理由 : 環境間の一貫性 Docker は、開発者のマシン、テスト環境、実稼働サーバーなど、どこにデプロイされてもアプリケーションが同じように実行されることを保証します。この一貫性は、すべての依存関係と構成をコンテナ化することで実現されます。 : 依存関係管理 Docker コンテナには、アプリケーションを実行するために必要なすべての依存関係が含まれています。つまり、システム ライブラリのバリエーションや、異なるシステムでの依存関係の欠落がアプリケーションの機能に影響を与えることはありません。 : 分離 Docker コンテナは、互いに、またホスト システムから分離して実行されます。この分離により、同じシステム上の異なるアプリケーションとそれらの依存関係間の競合が防止されます。 : 携帯性 Docker コンテナは、ローカル マシン、クラウド サービス、専用サーバーなど、Docker をサポートする任意のシステム上で簡単に移動して実行できます。これにより、アプリケーションの移植性が高くなり、展開の柔軟性が高まります。 注意: Docker構文の知識が必要です Docker 化には、イメージとコンテナという 2 つの重要な概念が関係します。イメージはコンテナの設計図として機能し、依存関係やデプロイメント構成など、コンテナを作成するために必要なすべての情報が含まれています。コンテナはイメージのランタイム インスタンスであり、イメージ自体、実行環境、およびランタイム命令で構成されます。一般的に、Docker はソフトウェアの出荷の標準を確立します。 Docker を簡単な例えで説明すると、コンテナを庭にある輸送コンテナ、イメージをコンテナ内に置かれたアイテム、輸送船をコンテナが実行されるシステムと考えてください。 アプリケーションをセットアップしてビルドするときは常に、特定の環境設定が必要です。たとえば、システムに Ruby 環境がインストールされていないと、Rails アプリケーションを実行することはできません。同様に、 がないと React アプリケーションを実行できず、 や などの Node パッケージ マネージャーがないと React パッケージをインストールできません。 Node.js npm Yarn コンテナはユーザーのシステムから独立して実行されるため、システム上に直接構築した場合と同じように、これらすべてのパッケージをコンテナ内で利用できるようにします。これにより、コンテナは仮想マシンのように独自のシステムとして機能します。Docker と仮想マシンには違いがありますが、この例はさらに説明するためのものです。 それでは、Rails アプリケーションを Docker 化してみましょう。これを行うには、Rails アプリケーションに 、 、 3 つのファイルが必要になります。これらの各ファイルを詳しく見ていきましょう。 Dockerfile docker-compose.yml bin/docker-entrypoint 注意: Docker構文の知識が必要です Dockerファイル 、Docker コンテナを作成するための設計図です。Docker がイメージを構築するために使用する一連の命令が含まれており、そのイメージを使用してコンテナを実行できます。Ruby on Rails および React アプリケーションの 詳しく見てみましょう。 Dockerfile Dockerfile . ベースイメージ ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION : という名前のビルド引数を定義します。デフォルト値は です。これはビルド時に上書きできます。 ARG RUBY_VERSION=3.1.4 RUBY_VERSION 3.1.4 : で指定されたバージョンの ベースイメージを使用します。これにより、コンテナが Ruby ランタイムでセットアップされます。前述したように、Rails アプリケーションを実行するには、Ruby がインストールされている必要があります。 FROM ruby:$RUBY_VERSION RUBY_VERSION ruby 2. 依存関係をインストールする RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man : リポジトリからパッケージ リストを更新します。 を指定すると出力は静かになります。 apt-get update -qq -qq : さまざまなパッケージをインストールします: apt-get install -y ... : ソフトウェアをビルドするための必須パッケージ (GCC など)。 build-essential : 画像処理用のライブラリ。 libvips 、 : Bash シェルとその自動補完。 bash bash-completion : 外部関数インターフェースライブラリ。 libffi-dev : タイムゾーンデータ。 tzdata : PostgreSQL データベース クライアント。 postgresql : URL からデータを転送するためのツール。 curl : 取得したパッケージ ファイルのローカル リポジトリをクリーンアップします。 apt-get clean : イメージのサイズを縮小するためにパッケージ リストとドキュメントを削除します。 rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man 3. Node.jsとYarnをインストールする RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn : NodeSource セットアップ スクリプトをダウンロードして実行し、Node.js をインストールします。 curl -fsSL https://deb.nodesource.com/setup_current.x | bash - : Node.js をインストールします。 apt-get install -y nodejs : パッケージを検証するために Yarn GPG キーを追加します。 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - : Yarn のリポジトリをソースのリストに追加します。 echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list : パッケージ リストを更新し、Yarn をインストールします。 apt-get update && apt-get install -y yarn 4. 環境変数 ENV NODE_OPTIONS=--openssl-legacy-provider : Node.js の従来の OpenSSL サポートを有効にする環境変数を設定します。 ENV NODE_OPTIONS=--openssl-legacy-provider 5. 作業ディレクトリを設定する WORKDIR /rails : 後続の命令の作業ディレクトリを に設定します。 WORKDIR /rails /rails 6. ビルド引数と環境変数 ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV : Rails 環境 ( 、 、 など) を指定するための という名前のビルド引数を定義します。 ARG RAILS_ENV development test production RAILS_ENV : 環境変数 ビルド引数の値に設定します。 ENV RAILS_ENV=$RAILS_ENV RAILS_ENV 7. アプリケーションGemをインストールする COPY Gemfile Gemfile.lock ./ RUN bundle install : と を作業ディレクトリにコピーします。 COPY Gemfile Gemfile.lock ./ Gemfile Gemfile.lock : で指定された Ruby gem をインストールします。 RUN bundle install Gemfile 8. フロントエンドの依存関係をインストールする COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile : と を作業ディレクトリにコピーします。 COPY package.json yarn.lock ./ package.json yarn.lock : Yarn を使用してフロントエンドの依存関係をインストールし、 内の正確なバージョンが使用されるようにします。 RUN yarn install --frozen-lockfile yarn.lock 9. アプリケーションコードをコピーする COPY . . : すべてのアプリケーション コードを作業ディレクトリにコピーします。 COPY . . 10. Bootsnap コードを事前コンパイルする RUN bundle exec bootsnap precompile --gemfile app/ lib/ : Rails アプリケーションの起動時間を短縮するために Bootsnap キャッシュを事前コンパイルします。Bootsnap は、高価な計算をキャッシュすることで Ruby と Rails の起動時間を短縮する gem です。 RUN bundle exec bootsnap precompile --gemfile app/ lib/ 11. 制作用にアセットを事前コンパイルする RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi : が に設定されている場合にのみ、アセットの事前コンパイルを条件付きで実行します。この手順は、運用環境用のアセットを準備するために重要です。 RUN if [ "$RAILS_ENV" = "production" ]; then ... RAILS_ENV production 12. エントリポイントスクリプト COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint : カスタム エントリポイント スクリプトをコンテナにコピーします。 COPY bin/docker-entrypoint /rails/bin/ : エントリポイント スクリプトを実行可能にします。 RUN chmod +x /rails/bin/docker-entrypoint 13. エントリポイントとコマンドを定義する ENTRYPOINT ["/rails/bin/docker-entrypoint"] EXPOSE 5000 // you can use any port of your choice CMD ["./bin/rails", "server"] : コンテナの起動時に実行されるエントリポイント スクリプトを設定します。このスクリプトは通常、環境を設定し、データベースを準備し、アプリケーションを起動します。 ENTRYPOINT ["/rails/bin/docker-entrypoint"] : コンテナーがポート 5000 でリッスンすることを示します。これはドキュメント機能であり、ポートを公開するものではありません。 EXPOSE 5000 : コンテナの起動時に実行されるデフォルトのコマンドを指定します。これは Rails サーバーを起動するためのものです。 CMD ["./bin/rails", "server"] ドッカーの作成 ファイルは、マルチコンテナ Docker アプリケーションの定義と実行に使用されます。これにより、アプリケーションのサービス、ネットワーク、ボリュームを 1 つのファイルで構成できます。この例では、2 つのサービスを使用します。以下は、Rails アプリケーションの ファイルです。 docker-compose.yml docker-compose.yml 1. ) データベースサービス ( db codedb: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" : このサービスに使用する Docker イメージを指定します。この場合、Alpine Linux ディストリビューションに基づく PostgreSQL 14.2 イメージです。Alpine イメージはサイズが小さいことで知られており、全体的なイメージ サイズを小さく抑えるのに役立ちます。 image: postgres:14.2-alpine : コンテナに 名前を付けます。この名前は、コマンドとログでコンテナを参照するために使用されます。 container_name: demo-postgres-14.2 demo-postgres-14.2 volumes : 名前付きボリューム をコンテナ内の にマウントします。このディレクトリは PostgreSQL がデータを保存する場所であり、コンテナの再起動後もデータベース データが保持されることを保証します。 postgres_data:/var/lib/postgresql/data: postgres_data /var/lib/postgresql/data : PostgreSQL イメージのデフォルト コマンドを上書きします。最大接続数を 500 に増やす構成オプションを使用して PostgreSQL を起動します。 command: "postgres -c 'max_connections=500'" environment : : 環境変数 を使用して、作成するデフォルトのデータベースの名前を設定します。 POSTGRES_DB: ${POSTGRES_DB} POSTGRES_DB : 環境変数を使用して、PostgreSQL データベースにアクセスするためのデフォルトのユーザー名を設定します。 POSTGRES_USER: ${POSTGRES_USER} POSTGRES_USER : 環境変数を使用して、デフォルト ユーザーのパスワードを設定します。 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_PASSWORD ports : : ホストのポート 5432 をコンテナのポート 5432 にマップします。これにより、ポート 5432 経由でホスト マシン上の PostgreSQL にアクセスできるようになります。 "5432:5432" 2. ) Webアプリケーションサービス( demo-web codedemo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000" build: : Docker イメージのビルド コンテキストを指定します。この場合、 は現在のディレクトリを指します。つまり、Docker は現在のディレクトリの Dockerfile を使用してイメージをビルドします。 context: . . args : : ビルド引数を Docker ビルドプロセスに渡し、Rails 環境 ( 、 、 など) を指定できるようにします。 RAILS_ENV=${RAILS_ENV} RAILS_ENV development test production : Docker イメージのデフォルト コマンドを上書きします。Rails サーバーを起動し、それをすべてのネットワーク インターフェイス ( ) にバインドします。これは、コンテナーの外部からサービスにアクセスできるようにするために必要です。 command: "./bin/rails server -b 0.0.0.0" 0.0.0.0 environment: : 環境変数を使用して、コンテナ内の Rails 環境を設定します。 RAILS_ENV=${RAILS_ENV} RAILS_ENV : PostgreSQL ホストアドレスを設定します。 POSTGRES_HOST=${POSTGRES_HOST} : データベース名を設定します。 POSTGRES_DB=${POSTGRES_DB} : PostgreSQL ユーザーを設定します。 POSTGRES_USER=${POSTGRES_USER} : PostgreSQL ユーザーのパスワードを設定します。 POSTGRES_PASSWORD=${POSTGRES_PASSWORD} : 資格情報やその他のシークレットの暗号化に使用される Rails マスターキーを設定します。 RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes : : 現在のディレクトリ ( ファイルがある場所) をコンテナ内の にマウントします。これにより、ホスト上のファイルを編集し、その変更をコンテナ内に反映させることができます。 .:/rails docker-compose.yml /rails : 名前付きボリューム をコンテナ内の にマウントします。これは通常、ログ、アップロード、キャッシュされたファイルなどの Rails 固有のファイルを保存するために使用されます。 app-storage:/rails/storage app-storage /rails/storage depends_on : : サービスが起動する前に、 サービスの準備ができるまで待機するようにします。Docker Compose は、この設定に基づいてサービスの開始順序を処理します。 db demo-web db ports: : ホストのポート 3000 をコンテナのポート 3000 にマップします。これにより、ポート 3000 経由でホスト マシン上の Rails アプリケーションにアクセスできるようになります。 "3000:3000" ボリューム codevolumes: postgres_data: app-storage: : PostgreSQL データを永続化するために サービスによって使用される名前付きボリューム を定義します。 postgres_data db postgres_data : アップロードやログなどのアプリケーション固有のデータを保持するために、 サービスによって使用される名前付きボリューム を定義します。 app-storage demo-web app-storage bin/docker-エントリポイント スクリプトは、Docker セットアップの重要な部分です。コンテナの起動時に実行され、通常は環境のセットアップ、データベースの準備、およびメイン アプリケーションの起動前に必要なその他の初期化タスクを処理します。次に、 スクリプトの例と各部分の詳細な説明を示します。 bin/docker-entrypoint bin/docker-entrypoint シェバンとエラー時の終了 bashCopy code#!/bin/bash set -e : この行は、スクリプトを Bash シェルを使用して実行することを指定します。 #!/bin/bash : コマンドがゼロ以外の終了コードを返した場合にスクリプトを直ちに終了するように指示します。これにより、いずれかのステップが失敗した場合にスクリプトの実行が停止し、後続のステップが無効な状態で実行されるのを防ぐことができます。 set -e 条件付きデータベースの作成または移行 # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi : この条件文は、スクリプトに渡されたコマンド ( ) が であるかどうかを確認します。 は、スクリプトに渡されるすべての位置パラメータを保持する特別なパラメータです。 if [ "${*}" == "./bin/rails server" ]; then ... fi "${*}" ./bin/rails server * ./bin/railsデータベース : 条件が満たされた場合、このコマンドはデータベースの作成を試みます。これは、データベース設定ファイル ( ) で定義されているようにデータベースを設定する のと同じです。 config/database.yml rails db:create ./bin/railsデータベース : このコマンドは 実行し、データベースがセットアップされ、移行されていることを確認します。データベースが存在しない場合はデータベースを作成し、データベースがすでに作成されている場合は移行を実行します。これは と の組み合わせです。 rails db:prepare rails db:create rails db:migrate メインプロセスの実行 bashCopy codeexec "${@}" : 現在のシェル プロセスを、スクリプトに引数として渡されたコマンドに置き換えます。 記号には、スクリプトに渡されるすべての位置パラメータが含まれます。たとえば、スクリプトが で呼び出される場合、この行はコンテナのメイン プロセスとして を効果的に実行します。 exec "${@}" @ ./bin/rails server ./bin/rails server 結論 適切に作成された 、Ruby on Rails および React アプリケーション用の信頼性が高く一貫性のある環境を作成するために不可欠です。ベースイメージを定義し、環境変数を設定し、依存関係をインストールすることで、アプリケーションがさまざまな環境でスムーズに実行されるようになります。 Dockerfile Docker は開発プロセスを効率化するだけでなく、本番環境でのアプリケーションの信頼性も向上させます。最適化の領域もありますが、これは Rails アプリケーションを Docker 化する方法の一般的な概要にすぎません。 結果として得られる 、 、 完全なスクリプト Dockerfile docker-compose.yml bin/docker-entrypoint ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION # Install dependencies RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man # Install Node.js and Yarn RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn # Set environment variable to enable legacy OpenSSL support ENV NODE_OPTIONS=--openssl-legacy-provider # Rails app lives here WORKDIR /rails # Set environment variable for the build ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install # Install frontend dependencies COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile --gemfile app/ lib/ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi # Entrypoint prepares the database. COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint # Use an absolute path for the entry point script ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 5000 CMD ["./bin/rails", "server"] services: db: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" demo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000" volumes: postgres_data: app-storage: #!/bin/bash set -e # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi exec "${@}"