ホームページ >データベース >mysql チュートリアル >Docker と MySQL を使用した新しい Rails アプリケーションのセットアップ

Docker と MySQL を使用した新しい Rails アプリケーションのセットアップ

Barbara Streisand
Barbara Streisandオリジナル
2025-01-04 18:36:44212ブラウズ

私は中規模のテクノロジーおよびデータ会社のシニア ソフトウェア エンジニアです。これまで私は、顧客獲得フローを構築し、データベース管理を行い、複雑な React 作業を行い、社内で使用するためのフル機能の CMS を作成し、公開用の Golang API マイクロサービスをゼロから構築し、API 認証システムを作成し、さまざまな B2B および B2C 製品を提供したり、複数のチーム (同時に) の技術リーダーを務めたりしました。また、新しい Rails アプリケーションをゼロから構築することに関しては、私は現在かなり慣れていません。それで、試してみようと思いました!

これはかなり基本的なチュートリアルですが、これに関する実用的なガイドが不足していることがわかりました。そうは言っても、これを書くために私が大いに借りた 2 つのチュートリアルを強調したいと思います。これは、これらの投稿に私の個人的な好みを加えたものを統合したものであると考えてください:Tallan Groberg と Nícolas Iensen。早速説明するため、詳細の多くは省略します。私は真新しい M4 Macbook Pro を使用してこれを書いていますが、基本はほとんどの Mac または Linux 環境に引き継がれるはずです。

メインフレームワークとして Rails、データベースとして MySQL (一部はその機能のため、一部はこの投稿で目的を複雑にするため)、および Docker を使用する、シンプルな Ruby アプリケーションを構築します。仮想化とクロスプラットフォーム互換性のため。このチュートリアルではモデルやコントローラーを構築しません。すべてはセットアップに関するものです。チュートリアルが終わるまでに、かなり古典的な Hello World アプリが完成します。この基本概念を取り入れて、構築しているあらゆるアプリケーションに適用できるはずです。

はじめる

まず最初に、これはターミナルと Unix ベースのコンピューターにある程度の知識があることを前提としています。それがある程度意味がある場合は、Docker と Homebrew をインストールする必要があります (Mac を使用していると仮定して)。 zsh をプライマリ シェルとして実行している場合 (最近のほとんどの Mac はデフォルトで zsh です)、brew コマンドを実行できるようにするには、~/.zshrc ファイルに以下を追加する必要がある場合があります:

path+=/opt/homebrew/bin

ファイルを保存したら、source ~/.zshrc を実行すれば問題ありません。

ちょっとしたメモ: $ の接頭辞が付いているコマンドは、ローカル シェル (zsh または bash) で実行されるコマンドを示しますが、# の接頭辞が付いているコマンドは Docker コンテナ内で実行されます。どのような場合でも、プレフィックスはコピーすべきではありません。プレフィックスは改行プロンプトを視覚的に示すものにすぎません。

まず最初に

多くの開発者は、すべてのコーディング プロジェクトを 1 つのディレクトリに配置しています (私のプロジェクトは、Downloads ディレクトリとDocuments ディレクトリの兄弟として存在しており、私はそれを創造的にコードと呼んでいます)。ターミナルで、同等のディレクトリに移動し、次のコマンドを入力します。

$ mkdir my-app
$ cd my-app

この新しいディレクトリ内には、いくつかの新しいファイルが必要です。次のコマンドを使用して作成します:

path+=/opt/homebrew/bin

最初の Dockerfile.dev はベースの Docker イメージを作成し、このプロジェクトで使用する Ruby のバージョン (この記事の執筆時点では最新の 3.3.6) をインストールする既存のイメージを構築してセットアップします。画像がどのように動作するかに関するいくつかの細かい詳細。ファイル名の .dev 部分は、この Dockerfile が運用環境ではなくローカルでのみ使用されることを示しています。チュートリアルの後半で実行するコマンドは、実際には、より堅牢な本番環境に対応した Dockerfile を構築します。この 2 つを区別できるようにしたいと考えています。このチュートリアルの範囲を考えると、そのような詳細は気にする必要はありません。上記のファイルに次の行を追加します:

$ mkdir my-app
$ cd my-app

次は docker-compose.yml ファイルです。このファイルの目的は、多数の Docker コンテナを調整して、構築している Web アプリケーションのすべての構成要素 (Web サーバー、データベース、潜在的に) が連携していることを確認することです。 Redis サーバー、おそらく Elasticsearch サーバーなど。これらすべてのさまざまな要素は独自の「仮想コンピューター」内に存在し、運用環境を模倣した方法で相互に通信できるように接続する必要があります。理論的なことについてはこれで十分ですが、重要なのは、いくつかの構成コードを docker-compose.yml ファイルに追加する必要があるということです。

$ touch Dockerfile.dev
$ touch docker-compose.yml
$ touch Gemfile

細かいことは気にしないでください。基本的には、「これを実行すると、'web' という名前のアプリケーションが実行され、'Dockerfile.dev という名前の dockerfile を使用してメイン アプリケーションを構築しようとします」ということです。 ' そして、Docker システムのネットワークの内部ポート 3000 を、それが実行されているローカル コンピューターのポート 3000 にマップします。また、データベースを起動して、相互に通信できるようにします。」あるいはそのようなものです。すでにアプリケーションをポート 3000 で実行している場合は、左側のポート番号を任意の番号に自由に変更してください。

わかりました!これで、イメージを構築するファイルと、そのイメージを使用してコンテナを実行し、それが起動する小さなネットワークにコンテナをポップする別のファイルができました。ニース!しかし...どうやってそれを行うのでしょうか?

入り込む

いじくり始めるには、構築中のコンテナに実際に入って何かを行う必要があります。これを実行することでこれを実行します:

FROM ruby:3.3.6

WORKDIR /usr/src/app

COPY . .
RUN bundle install

今、私たちはコンピュータの中にいます。そのアイデアは、使用しているコンピューターに特定のソフトウェアをインストールする必要がなく、コンテナーの環境内でコマンドを実行できるようになることです。たとえば、Rails は、コンピューター上で実行されている Docker コンテナー上で実行するために、コンピューター上のどこにでも存在する必要はありません。かなり気の利いたものです。

さて、ここまで来たら、Rails をインストールしましょう:

services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: app
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3307:3306"
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ".:/usr/src/app"
    ports:
      - "3000:3000"
    depends_on:
      - db
    links:
      - db
    environment:
      DB_USER: root
      DB_NAME: app
      DB_PASSWORD: password
      DB_HOST: db

それでは、アプリケーションを作成してみましょう。このアプリケーションは MySQL を使用して構築したいので、次のコマンドの仕様に注目してください:

path+=/opt/homebrew/bin

これには少し時間がかかります。 Gemfile を上書きするかどうかを尋ねられます。 y を押して確認します。このコマンドによって生成される他のファイルについても同じ質問が表示されます。 y/n キーを適宜使用して、新しいバージョンをスキップするか受け入れます。

ハッ!アプリケーションのスケルトンが完成しました。ただし、実際にはこれで終わりではありません。データベースを準備するには、1 つの重要な部分に対処する必要があります。そして、理想的には、重要なセキュリティの詳細に対処する必要があります。

データベースのセットアップ

ローカルで何かを行っているだけで、何もデプロイする予定がない場合、このセクションの最初の部分はあまり必要ないかもしれません。さらに、ここでは考慮すべき点がさらに多くあり、DB 構成と基本的なリポジトリのセキュリティの一部を掘り下げる別のチュートリアルを作成する価値があると思います (特にリポジトリがパブリックの場合) (パブリックな場合でも心配する必要はありません。外では注意してください!) .

前のコマンドでは、膨大な数の新しいファイルとディレクトリが作成されました。そのうちの 1 つは config/database.yml です。私にとって、12行目は次のようなブロックです:

$ mkdir my-app
$ cd my-app

技術的には上記は機能します。それは何も「間違っている」わけではありません。しかし、もっと良くできるはずです。最大の問題は、DB にパスワードがないことです。次の問題は、DB に名前がないことです。最後に、ユーザー名はプレーンテキストで表示されます。私の好みではありません。すべてを次のように変更しましょう (次の最初のフィールドは新しいフィールドで、2 番目の 2 つは既存の値を置き換える必要があります):

$ touch Dockerfile.dev
$ touch docker-compose.yml
$ touch Gemfile

ENV.fetch("VARIABLE_NAME") { "fallback_value" } スタイルを使用することもできます。 ENV["VARIABLE_NAME"] と ENV.fetch("VARIABLE_NAME") の違いは、前者は指定された名前の環境変数が見つからない場合に nil を返すのに対し、後者はいくつかの警告またはエラーを生成する可能性があることです (これを参照) ENV.fetch の詳細については、これを参照してください)。

これで、シェルを終了していないことを前提として (docker-compose run --service-ports Web bash を使用して戻ることができます)、新しいデータベースを作成する必要があります。これを行うには、次のコマンドを使用します:

FROM ruby:3.3.6

WORKDIR /usr/src/app

COPY . .
RUN bundle install

Docker シェルを終了し、ローカルのターミナル環境で次のコマンドを実行します。

services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: app
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3307:3306"
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ".:/usr/src/app"
    ports:
      - "3000:3000"
    depends_on:
      - db
    links:
      - db
    environment:
      DB_USER: root
      DB_NAME: app
      DB_PASSWORD: password
      DB_HOST: db

それだけです!ブラウザ (または Postman などの API クライアント) で localhost:3000 を指定すると、従来の Rails スタートアップ ページが表示されるはず:

Setting up a new Rails application with Docker & MySQL

非常に簡単なセキュリティを追加する

動作するアプリケーションができました!そして、本番運用に対応できる優れたデータベースが付属しています (Rails が提供するデフォルトのデータベースである SQLite は、基本的なアイデアをまとめるのに最適ですが、本番作業向けではなく、作成者は変人です)。ただし、より堅牢なデータベースには、追加の責任も伴います。

このチュートリアルの前半で見たように、データベースの名前、ユーザー名、そのユーザーのパスワードという 3 つの重要な値を提供する必要がありました。現時点では、抽象化レイヤーが 1 つあります。単純に生の文字列値を database.yml に渡すのではなく、Rails 環境からそれらの値をフェッチしています。では、Rails 環境はどこでそれらの値を取得しているのでしょうか? docker-compose.yml ファイルから!

しかし、重要な問題がまだ解決されていません。このコードを運用環境で使用することを想定して、コード自体にシステム管理者以外はアクセスできない情報を含めています。それは素晴らしいことではありません。理論的に構成された特定の貴重な情報への直接の参照を削除する追加の抽象化層が必要です。

ここで、最初の起動時に Ruby 環境で適切に設定された環境変数を実際に GET する必要があります。これを 2 つのステップで実行しますが、慣れている場合は 1 つのステップで実行しても構いません。まず、Rails プロジェクトで DB シークレットを直接参照するのをやめる必要があります。私たちはそうしています。次に、それらを Docker から Rails にパイプする必要があります。最後に、Git から隠しているファイルからシークレット値を追加して、この情報をさらに抽象化し、潜在的な悪者からこの情報を隠します。

Docker から Rails に環境変数をパイプする

いくつかのオプションがありますが、私のおすすめは、これらの値が保存される環境ファイルを作成することです。チームで作業している場合は、この情報を公共のインターネットに公開する危険を冒さずに、より秘密裏の手段 (GPG 暗号化が古典的です) を使用して、このファイルをチーム間で共有できます。少し前に Rails new を実行したときに作成されたと思われる .gitignore ファイルを見ると、プロジェクトのルートに .env で始まるファイルの行項目があることがわかります。それはまさに私たちが望んでいることです。git トラッキングには追加されないが、重要な極秘情報をプレーン テキストで保存できる機密ファイルです。やってみましょう:

path+=/opt/homebrew/bin

開発、運用、テスト環境で異なる環境ファイルが必要になる場合に備えて、.dev 接尾辞を追加しました。新しく作成したファイルに、いくつかの値を追加しましょう:

$ mkdir my-app
$ cd my-app

新しい環境ファイルを実際に使用するには、docker-compose.yml ファイルを更新する必要もあります。 Web サービスの下に、以下を追加します:

$ touch Dockerfile.dev
$ touch docker-compose.yml
$ touch Gemfile

それがそれです! docker compose up を使用してアプリケーションを再度起動し、localhost:3000 に移動して、すべてが正常であることを確認します。

以上がDocker と MySQL を使用した新しい Rails アプリケーションのセットアップの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。