Docker と MySQL を使用した新しい Rails アプリケーションのセットアップ
私は中規模のテクノロジーおよびデータ会社のシニア ソフトウェア エンジニアです。これまで私は、顧客獲得フローを構築し、データベース管理を行い、複雑な 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 スタートアップ ページが表示されるはず:
非常に簡単なセキュリティを追加する
動作するアプリケーションができました!そして、本番運用に対応できる優れたデータベースが付属しています (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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











完全なテーブルスキャンは、MySQLでインデックスを使用するよりも速い場合があります。特定のケースには以下が含まれます。1)データボリュームは小さい。 2)クエリが大量のデータを返すとき。 3)インデックス列が高度に選択的でない場合。 4)複雑なクエリの場合。クエリプランを分析し、インデックスを最適化し、オーバーインデックスを回避し、テーブルを定期的にメンテナンスすることにより、実際のアプリケーションで最良の選択をすることができます。

はい、MySQLはWindows 7にインストールできます。MicrosoftはWindows 7のサポートを停止しましたが、MySQLは引き続き互換性があります。ただし、インストールプロセス中に次のポイントに注意する必要があります。WindowsのMySQLインストーラーをダウンロードしてください。 MySQL(コミュニティまたはエンタープライズ)の適切なバージョンを選択します。インストールプロセス中に適切なインストールディレクトリと文字セットを選択します。ルートユーザーパスワードを設定し、適切に保ちます。テストのためにデータベースに接続します。 Windows 7の互換性とセキュリティの問題に注意してください。サポートされているオペレーティングシステムにアップグレードすることをお勧めします。

INNODBのフルテキスト検索機能は非常に強力であり、データベースクエリの効率と大量のテキストデータを処理する能力を大幅に改善できます。 1)INNODBは、倒立インデックスを介してフルテキスト検索を実装し、基本的および高度な検索クエリをサポートします。 2)一致を使用してキーワードを使用して、ブールモードとフレーズ検索を検索、サポートします。 3)最適化方法には、単語セグメンテーションテクノロジーの使用、インデックスの定期的な再構築、およびパフォーマンスと精度を改善するためのキャッシュサイズの調整が含まれます。

クラスター化されたインデックスと非クラスター化されたインデックスの違いは次のとおりです。1。クラスター化されたインデックスは、インデックス構造にデータを保存します。これは、プライマリキーと範囲でクエリするのに適しています。 2.非クラスター化されたインデックスストアは、インデックスキー値とデータの行へのポインターであり、非プリマリーキー列クエリに適しています。

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

MySQLデータベースでは、ユーザーとデータベースの関係は、アクセス許可と表によって定義されます。ユーザーには、データベースにアクセスするためのユーザー名とパスワードがあります。許可は助成金コマンドを通じて付与され、テーブルはCreate Tableコマンドによって作成されます。ユーザーとデータベースの関係を確立するには、データベースを作成し、ユーザーを作成してから許可を付与する必要があります。

MySQLは、Bツリー、ハッシュ、フルテキスト、および空間の4つのインデックスタイプをサポートしています。 1.B-Treeインデックスは、等しい値検索、範囲クエリ、ソートに適しています。 2。ハッシュインデックスは、等しい値検索に適していますが、範囲のクエリとソートをサポートしていません。 3.フルテキストインデックスは、フルテキスト検索に使用され、大量のテキストデータの処理に適しています。 4.空間インデックスは、地理空間データクエリに使用され、GISアプリケーションに適しています。

MySQLとMariaDBは共存できますが、注意して構成する必要があります。重要なのは、さまざまなポート番号とデータディレクトリを各データベースに割り当て、メモリ割り当てやキャッシュサイズなどのパラメーターを調整することです。接続プーリング、アプリケーションの構成、およびバージョンの違いも考慮する必要があり、落とし穴を避けるために慎重にテストして計画する必要があります。 2つのデータベースを同時に実行すると、リソースが制限されている状況でパフォーマンスの問題を引き起こす可能性があります。
