Yarn ワークスペース、TypeScript、esbuild、React、Express を使用して K8S クラウド ネイティブ アプリケーションを構築する (パート 1)

Yarn ワークスペース、TypeScript、esbuild、React、Express を使用して K8S クラウド ネイティブ アプリケーションを構築する (パート 1)

この記事では、K8S、Docker、Yarn ワークスペース、TypeScript、esbuild、Express、React を使用して基本的なクラウドネイティブ Web アプリケーションをセットアップおよび構築する方法について説明します。このチュートリアルの最後には、K8S 上に完全に構​​築されデプロイされた Web アプリケーションが完成します。

プロジェクトの設定

プロジェクトはモノレポとして構成されます。モノレポの目的は、モジュール間で共有されるコードの量を増やし、それらのモジュールがどのように通信するかをより正確に予測することです (マイクロサービス アーキテクチャなど)。この演習では、構造をシンプルに保ちます。

  • これは、React Web サイトを表すアプリです。
  • Express を使用してアプリを提供するサーバーです。
  • 一般的に、一部のコードはアプリとサーバー間で共有されます。

プロジェクトをセットアップする前の唯一の要件は、マシンに yarn がインストールされていることです。 Yarn は npm のようなパッケージ マネージャーですが、パフォーマンスが優れており、機能が少しだけ豊富です。インストール方法の詳細については、公式ドキュメントをご覧ください。

ワークスペース

プロジェクトを初期化するフォルダーに移動し、お気に入りのターミナルから次の手順を実行します。

  1. mkdir my-app を使用してプロジェクト用のフォルダーを作成します (名前は自由に選択できます)。
  2. cd my-app を使用してフォルダーに入ります。
  3. yarn init を使用して初期化します。これにより、最初の package.json ファイルの作成に関する質問が表示されます (心配しないでください。ファイルは作成後いつでも変更できます)。 yarn init コマンドを使用しない場合は、いつでも手動でファイルを作成し、次の内容をコピーすることができます。
  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0.0」
  4. 「ライセンス」 : 「無許可」
  5. "private" : true // yarnワークスペース必要 仕事 
  6. }

package.json ファイルが作成されたので、モジュール app、common、server 用のフォルダーを作成する必要があります。 yarn ワークスペースによるモジュールの検出を容易にし、プロジェクトの読みやすさを向上させるために、モジュールをパッケージ フォルダーにネストします。

  1. 私のアプリ/
  2. ├─ packages/ // 現在および将来のすべてのモジュールが格納される場所
  3. │ ├─ アプリ/
  4. │ ├─ 共通/
  5. │ ├─ サーバー/
  6. ├─ package.json

各モジュールは小規模で独立したプロジェクトとして機能し、依存関係を管理するために独自の package.json が必要になります。それぞれを設定するには、yarn init (各フォルダー内) を使用するか、手動でファイルを作成します (たとえば、IDE 経由)。

パッケージ名に使用される命名規則では、各パッケージの前に @my-app/* を付けます。これは NPM の世界ではスコープと呼ばれます。このようにプレフィックスを付ける必要はありませんが、後で役に立ちます。

3 つのパッケージがすべて作成され初期化されると、以下に示すようなものになります。

アプリパッケージ:

  1. {
  2. 「名前」 : 「@my-app/app」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true  
  6. }

共通パッケージ:

  1. {
  2. 「名前」 : 「@my-app/common」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true  
  6. }

サーバーパッケージ:

  1. {
  2. 「名前」 : 「@my-app/server」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true  
  6. }

最後に、Yarn にモジュールを探す場所を伝える必要があるため、プロジェクトの package.json ファイルに戻って編集し、次のワークスペース プロパティを追加します (詳細については、Yarn のワークスペースのドキュメントを参照してください)。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "workspaces" : [ "packages/*" ] // ここに追加
  7. }

最終的なフォルダー構造は次のようになります。

  1. 私のアプリ/
  2. ├─ パッケージ/
  3. │ ├─ アプリ/
  4. │ │ ├─ package.json
  5. │ ├─ 共通/
  6. │ │ ├─ package.json
  7. │ ├─ サーバー/
  8. │ │ ├─ package.json
  9. ├─ package.json

これで、プロジェクトの基本的な設定が完了しました。

タイプスクリプト

ここで、プロジェクトに最初の依存関係である TypeScript を追加します。 TypeScript は、ビルド時に型チェックを可能にする JavaScript のスーパーセットです。

ターミナルからプロジェクトのルート ディレクトリに移動し、yarn add -D -W typescript を実行します。

  • -D パラメータは、開発とビルド時にのみ使用されるため、TypeScript を devDependencies に追加します。
  • -W パラメータを使用すると、ワークスペース ルートにパッケージをインストールして、app、common、server でグローバルに利用できるようになります。

package.json は次のようになります。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "typescript" : "^4.2.3"  
  9. }
  10. }

これにより、yarn.lock ファイル (プロジェクトの存続期間中、依存関係の予想されるバージョンが一定に保たれることを保証する) と、依存関係のバイナリを保持する node_modules フォルダーも作成されます。

TypeScript がインストールされたので、実行方法を指定するのが良いでしょう。これを行うには、IDE によって取得される構成ファイルを追加します (VSCode を使用する場合は、自動的に取得されます)。

プロジェクトのルート ディレクトリに tsconfig.json ファイルを作成し、次のコンテンツをコピーします。

  1. {
  2. "コンパイラオプション" : {
  3. /* 基本 */
  4. 「ターゲット」 : 「es2017」
  5. 「モジュール」 : 「CommonJS」
  6. "lib" : [ "ESNext" , "DOM" ],
  7.  
  8. /* モジュールの解決 */
  9. "モジュール解像度" : "ノード" ,
  10. "esModuleInterop" : true
  11.  
  12. /* パスの解決 */
  13. 「ベースURL」 : 「./」
  14. 「パス」 : {
  15. "@flipcards/*" : [ "packages/*" ]
  16. },
  17.  
  18. /* 高度な */
  19. "jsx" : "反応"
  20. "実験的デコレータ" : true
  21. "JsonModule を解決" : true  
  22. },
  23. "除外" : [ "node_modules" "**/node_modules/*" "dist" ]
  24. }

各 compileoptions プロパティとそのアクションは簡単に検索できますが、最も便利なのは paths プロパティです。たとえば、これは、@my-app/server または @my-app/app パッケージで @my-app/common インポートを使用するときに、コードと型指定を検索する場所を TypeScript に指示します。

現在のプロジェクト構造は次のようになります。

  1. 私のアプリ/
  2. ├─ node_modules/
  3. ├─ パッケージ/
  4. │ ├─ アプリ/
  5. │ │ ├─ package.json
  6. │ ├─ 共通/
  7. │ │ ├─ package.json
  8. │ ├─ サーバー/
  9. │ │ ├─ package.json
  10. ├─ package.json
  11. ├─ tsconfig.json
  12. ├─ 糸.ロック

最初のスクリプトを追加する

Yarn ワークスペースを使用すると、yarn ワークスペース @my-app/* コマンド パターンを介して任意のサブパッケージにアクセスできますが、毎回完全なコマンドを入力するのは非常に冗長になります。この目的のために、開発エクスペリエンスを向上させるヘルパー スクリプト メソッドをいくつか作成できます。プロジェクトのルート ディレクトリにある package.json を開き、次のスクリプト プロパティを追加します。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "typescript" : "^4.2.3"  
  9. },
  10. 「スクリプト」 : {
  11. "app" : "yarn ワークスペース @my-app/app"
  12. "common" : "yarn ワークスペース @my-app/common"
  13. "server" : "yarn ワークスペース @my-app/server"  
  14. }
  15. }

これで、サブパッケージ内にいるかのように任意のコマンドを実行できるようになります。たとえば、yarn server add express と入力して、いくつかの新しい依存関係を追加できます。これにより、サーバー パッケージに新しい依存関係が直接追加されます。

以降のセクションでは、フロントエンドおよびバックエンド アプリケーションの構築を開始します。

Gitの準備

Git をバージョン管理ツールとして使用する予定の場合は、バイナリやログなどの生成されたファイルを無視することを強くお勧めします。

これを行うには、プロジェクトのルート ディレクトリに .gitignore という新しいファイルを作成し、次の内容をそのファイルにコピーします。これにより、チュートリアルの後半で生成されるファイルの一部が無視され、大量の不要なデータが送信されることが回避されます。

  1. # ログ
  2. 糸デバッグ.log*
  3. 糸エラー.log*
  4.  
  5. # バイナリ
  6. ノードモジュール/
  7.  
  8. # ビルド
  9. ディストリビューション/
  10. **/パブリック/script.js

フォルダ構造は次のようになります。

  1. 私のアプリ/
  2. ├─ パッケージ/
  3. ├─ .gitignore
  4. ├─ package.json

コードを追加

このセクションでは、共通パッケージ、アプリ パッケージ、サーバー パッケージにコードを追加することに焦点を当てます。

一般

このパッケージはアプリとサーバーの両方で使用されるため、まず common から始めます。その目的は、共有ロジックと変数を提供することです。

書類

このチュートリアルでは、共通パッケージは非常にシンプルになります。まず、新しいフォルダーを追加します。

src/ フォルダーにはパッケージのコードが含まれています。

このフォルダを作成したら、次のファイルを追加します。

src/index.ts

  1. エクスポート const APP_TITLE = 'my-app' ;

エクスポートするコードができたので、他のパッケージからインポートするときにそのコードを探す場所を TypeScript に指示します。これを行うには、package.json ファイルを更新する必要があります。

パッケージ.json

  1. {
  2. 「名前」 : 「@my-app/common」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "main" : "./src/index.ts" // TS のエントリ ポイントを提供するためにこの行を追加します
  7. }

これで共通パッケージは完成です!

構造上の注意:

  1. 一般/
  2. ├─ 出典/
  3. │ ├─インデックス.ts
  4. ├─ package.json

アプリ

依存関係

アプリ パッケージには次の依存関係が必要です。

  • 反応する
  • 反応する

プロジェクトのルート ディレクトリから、次のコマンドを実行します。

  • 糸アプリに反応を追加 react-dom
  • yarn app add -D @types/react @types/react-dom (TypeScript の型指定を追加)

パッケージ.json

  1. {
  2. 「名前」 : 「@my-app/app」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. 「依存関係」 : {
  7. "@my-app/common" : "^0.1.0" , // このインポートを手動で追加したことに注意してください
  8. 「反応」 : 「^17.0.1」
  9. "react-dom" : "^17.0.1"  
  10. },
  11. 「devDependencies」 : {
  12. "@types/react" : "^17.0.3"
  13. "@types/react-dom" : "^17.0.2"  
  14. }
  15. }

書類

React アプリケーションを作成するには、次の 2 つの新しいフォルダーを追加する必要があります。

  • ベース HTML ページとアセットを保持する public/ フォルダー。
  • アプリケーションのコードが含まれる src/ フォルダー。

これら 2 つのフォルダーが作成されると、アプリケーションをホストする HTML ファイルの追加を開始できます。

公開/index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <ヘッド>
  4. <title>私のアプリ</title>
  5. <meta name = "description" content = "私のアプリケーションへようこそ!" />
  6. </head>
  7. <本文>
  8. <noscript>このアプリを実行するには、 JavaScript を有効にする必要あります。</noscript>
  9. <! -- この div に React アプリケーションを挿入します -->  
  10. <div id= "ルート" ></div>
  11. <! -- これはアプリケーションを含むスクリプトへのパスです -->  
  12. <script src= "script.js" ></script>
  13. </本文>
  14. </html>

レンダリングするページができたので、次の 2 つのファイルを追加することで、非常に基本的でありながら完全に機能する React アプリケーションを実装できます。

src/index.tsx

  1. *をReactとしてインポート  '反応する' ;
  2. *をReactDOMとしてインポート  'react-dom' ;
  3.  
  4. {App}インポート  '。/アプリ' ;
  5.  
  6. ReactDOM.render(<App />, document.getElementById( 'root' ));

このコードは、HTML ファイルのルート div にフックし、React コンポーネント ツリーを挿入します。

src/App.tsx

  1. {APP_TITLE}インポート  '@flipcards/common' ;
  2. *Reactとしてインポート  '反応する' ;
  3.  
  4. 関数App() をエクスポートします: React.ReactElement {
  5. const [ count , setCount] = React.useState(0);
  6.  
  7. 戻る
  8. <div>
  9. <h1>{APP_TITLE}ようこそ!</h1>
  10. <p>
  11. これは私たちのアプリケーションメインページです
  12.  動的 下のボタンをクリックしてください
  13. </p>
  14.  
  15. <p>現在の カウント: {カウント}</p>
  16. <button onClick={() => setCount((prev) => prev + 1)}>増分</button>
  17. </div>
  18. );
  19. }

このシンプルな App コンポーネントは、アプリのタイトルと動的なカウンターをレンダリングします。これが React ツリーのエントリ ポイントになります。必要なコードを自由に追加してください。

それでおしまい!非常に基本的な React アプリケーションが完成しました。現時点ではあまり機能しませんが、後から戻って機能を追加することもできます。

構造上の注意:

  1. アプリ/
  2. ├─公開/
  3. │ ├─インデックス.html
  4. ├─ 出典/
  5. │ ├─ アプリ.tsx
  6. │ ├─インデックス.tsx
  7. ├─ package.json

サーバ

依存関係

サーバー パッケージには次の依存関係が必要です。

  • コア
  • 急行

プロジェクトのルート ディレクトリから、次のコマンドを実行します。

  • 糸サーバーにcors expressを追加
  • yarn server add -D @types/cors @types/express (TypeScript の型指定を追加)

パッケージ.json

  1. {
  2. 「名前」 : 「@my-app/server」
  3. 「バージョン」 : 「0.1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. 「依存関係」 : {
  7. "@my-app/common" : "^0.1.0" , // このインポートは手動で追加したことに注意してください
  8. "cors" : "^2.8.5" ,
  9. 「エクスプレス」 : 「^4.17.1」  
  10. },
  11. 「devDependencies」 : {
  12. "@types/cors" : "^2.8.10"
  13. "@types/express" : "^4.17.11"  
  14. }
  15. }

書類

React アプリケーションの準備ができたので、最後に必要なのはそれを提供するサーバーです。まず、次のフォルダを作成します。

  • サーバー コードを含む src/ フォルダー。

次に、サーバーのメイン ファイルを追加します。

src/index.ts

  1. {APP_TITLE}インポート  '@flipcards/common' ;
  2. corsインポートする  'cors' ;
  3. 輸入エクスプレス  '急行' ;
  4. インポート { join }から  'パス' ;
  5.  
  6. ポート = 3000;
  7.  
  8. express() は、定数です。
  9. app.use(cors());
  10.  
  11. // 「public」フォルダから静的リソースを提供する(例:表示する画像がある場合)
  12. app.use( express.static ( join (__dirname, '../../app/public' )));
  13.  
  14. // HTMLページを提供する
  15. app.get( '*' 、 (必須:任意、解像度:任意) => {
  16. res.sendFile( __dirname, '../../app/public' 'index.html' )に参加します
  17. });
  18.  
  19. app.listen(ポート, () => {
  20. console.log(`${APP_TITLE} のサーバーはhttp://localhost:${PORT}リッスンしています`);
  21. });

これは非常に基本的な Express アプリケーションですが、シングル ページ アプリケーション以外のサービスがなければこれで十分です。

構造上の注意:

  1. サーバ/
  2. ├─ 出典/
  3. │ ├─インデックス.ts
  4. ├─ package.json

アプリを構築する

バンドラー

TypeScript コードを解釈可能な JavaScript コードに変換し、すべての外部ライブラリを 1 つのファイルにバンドルするには、バンドラーを使用します。 JS/TS エコシステムには、WebPack、Parcel、Rollup など多くのバンドラーがありますが、ここでは esbuild を選択します。他のバンドラーと比較して、esbuild にはデフォルトでロードされる多くの機能 (TypeScript、React) が付属しており、パフォーマンスが大幅に向上しています (最大 100 倍高速)。さらに詳しく知りたい場合は、著者の FAQ をお読みください。

これらのスクリプトには次の依存関係が必要です。

  • esbuildはバンドラーです
  • ts-nodeはTypeScript REPLであり、スクリプトを実行するために使用します。

プロジェクトのルート ディレクトリから、次のコマンドを実行します: yarn add -D -W esbuild ts-node。

パッケージ.json

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "esbuild" : "^0.9.6"
  9. "ts-node" : "^9.1.1"
  10. "typescript" : "^4.2.3"  
  11. },
  12. 「スクリプト」 : {
  13. "app" : "yarn ワークスペース @my-app/app"
  14. "common" : "yarn ワークスペース @my-app/common"
  15. "server" : "yarn ワークスペース @my-app/server"  
  16. }
  17. }

建てる

これで、アプリケーションを構築するために必要なツールがすべて揃ったので、最初のスクリプトを作成しましょう。

まず、プロジェクトのルートに scripts/ という新しいフォルダーを作成します。

スクリプトは TypeScript で記述され、ts-node を使用してコマンドラインから実行されます。 esbuild には CLI がありますが、より複雑なパラメータを渡したり、複数のワークフローを組み合わせたりする場合は、JS または TS 経由でライブラリを使用する方が便利です。

scripts/ フォルダーに build.ts ファイルを作成し、次のコードを追加します (コードの動作についてはコメントで説明します)。

スクリプト/build.ts

  1. インポート {ビルド}   'esbuild' ;
  2.  
  3. /**
  4. * ビルド中に渡される共通オプション。
  5. */
  6. インターフェース BuildOptions {
  7. 環境: 'production' | '発達' ;
  8. }
  9.  
  10. /**
  11. * アプリ パッケージのビルダー関数。
  12. */
  13. 非同期関数buildApp(options: BuildOptions)をエクスポートします。
  14. const { env } = オプション;
  15.  
  16. ビルドを待つ({
  17. entryPoints: [ 'packages/app/src/index.tsx' ], // このエントリポイントからReactアプリケーションを読み取ります
  18. outfile: 'packages/app/public/script.js' , // public / フォルダにファイルを出力します ( HTML ページで"script.js"を使用したことを思い出してください)
  19. 定義する: {
  20. 'process.env.NODE_ENV' : ` "${env}" `, // アプリケーションをビルドするにはNode.js環境を定義する必要があります
  21. },
  22. バンドル: true
  23. 縮小: env === 'production'
  24. ソースマップ: env === 'development'
  25. });
  26. }
  27.  
  28. /**
  29. * サーバー パッケージのビルダー関数。
  30. */
  31. 非同期関数buildServer(options: BuildOptions)をエクスポートします。
  32. const { env } = オプション;
  33.  
  34. ビルドを待つ({
  35. エントリポイント: [ 'packages/server/src/index.ts' ],
  36. 出力ファイル: 'packages/server/dist/index.js' ,
  37. 定義する: {
  38. 'process.env.NODE_ENV' : ` "${env}" `,
  39. },
  40. external: [ 'express' ], // 一部のライブラリは外部ライブラリとしてマークする必要があります
  41. プラットフォーム: 'node' , // Node用にビルドする場合は、そのための環境を設定する必要があります
  42. ターゲット: 'node14.15.5'
  43. バンドル: true
  44. 縮小: env === 'production'
  45. ソースマップ: env === 'development'
  46. });
  47. }
  48.  
  49. /**
  50. * すべてのパッケージのビルダー関数。
  51. */
  52. 非同期関数buildAll() {
  53. Promise.allを待機します [
  54. ビルドアプリ({
  55. env: 'production'
  56. })、
  57. ビルドサーバー({
  58. env: 'production'
  59. })、
  60. ]);
  61. }
  62.  
  63. // このメソッドは、ターミナルからts-nodeを使用してスクリプトを実行するときに実行されます
  64. すべてを構築します。

コードは非常にわかりやすいですが、何かが足りないと感じた場合は、esbuild の API ドキュメントでキーワードの完全なリストを確認してください。

ビルド スクリプトが完成しました。最後に、ビルド アクションを簡単に実行できるように、package.json に新しいコマンドを追加します。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "esbuild" : "^0.9.6"
  9. "ts-node" : "^9.1.1"
  10. "typescript" : "^4.2.3"  
  11. },
  12. 「スクリプト」 : {
  13. "app" : "yarn ワークスペース @my-app/app"
  14. "common" : "yarn ワークスペース @my-app/common"
  15. "server" : "yarn ワークスペース @my-app/server"
  16. "build" : "ts-node ./scripts/build.ts" //ここにこの行を追加
  17. }
  18. }

これで、プロジェクトのルート フォルダーから yarn build を実行して、プロジェクトに変更を加えるたびにビルド プロセスを開始できるようになりました (ホット リロードを追加する方法については後で説明します)。

構造上の注意:

  1. 私のアプリ/
  2. ├─ パッケージ/
  3. ├─ スクリプト/
  4. │ ├─ build.ts
  5. ├─ package.json
  6. ├─ tsconfig.json

仕える

アプリケーションが構築され、世界中で使用できる状態になりました。package.json に最後のコマンドを 1 つ追加するだけです。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0」
  4. 「ライセンス」 : 「無許可」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "esbuild" : "^0.9.6"
  9. "ts-node" : "^9.1.1"
  10. "typescript" : "^4.2.3"  
  11. },
  12. 「スクリプト」 : {
  13. "app" : "yarn ワークスペース @my-app/app"
  14. "common" : "yarn ワークスペース @my-app/common"
  15. "server" : "yarn ワークスペース @my-app/server"
  16. 「ビルド」 : 「ts-node ./scripts/build.ts」
  17. "serve" : "node ./packages/server/dist/index.js" //ここにこの行を追加します
  18. }
  19. }

現在は純粋な JavaScript を扱っているので、ノード バイナリを使用してサーバーを起動できます。さあ、yarn serve を実行しましょう。

コンソールを見ると、サーバーが正常にリッスンしていることがわかります。ブラウザを開いて http://localhost:3000 に移動し、React アプリを表示することもできます 🎉!

実行時にポートを変更する場合は、環境変数をプレフィックスとして serve コマンドを開始できます: PORT=4000 yarn serve。

ドッカー🐳

このセクションでは、コンテナの概念を理解していることを前提としています。

コードからイメージを作成するには、コンピューターに Docker がインストールされている必要があります。 OS に応じてインストールする方法については、公式ドキュメントを参照してください。

Dockerファイル

Docker イメージを生成するには、まずプロジェクトのルート ディレクトリに Dockerfile を作成します (これらの手順はすべて CLI で実行できますが、ビルド手順を定義するデフォルトの方法は構成ファイルを使用することです)。

  1. ノード:14.15.5-alpineから
  2.  
  3. ワークディレクトリ /usr/src/app
  4.  
  5. # 依存関係を早めにインストールして、アプリケーションが
  6. # 一部のファイルが変更されましたが、Docker は依存関係を再度ダウンロードする必要はありません。
  7. # 代わりに次のステップ ("COPY ..") から開始します。
  8. ./package.json をコピーします。
  9. ./yarn.lock をコピーします。
  10. コピー ./packages/app/package.json ./packages/app/
  11. コピー ./packages/common/package.json ./packages/common/
  12. コピー ./packages/server/package.json ./packages/server/
  13. RUNヤーン
  14.  
  15. # アプリケーションのすべてのファイルをコピーします(.gitignore で指定されているものを除く)
  16. コピー 。 。
  17.  
  18. # アプリをコンパイルする
  19. RUNヤーンビルド
  20.  
  21. # ポート
  22. エクスポーズ3000
  23.  
  24. # 仕える
  25. CMD [ "yarn" "serve" ]

ここで何が起こっているのか、そしてこれらの手順の順序がなぜ重要なのかをできるだけ詳しく説明したいと思います。

  1. FROM は、現在のコンテキストに指定されたベースイメージを使用するように Docker に指示します。私たちの場合、Node.js アプリケーションを実行できる環境が必要です。
  2. WORKDIR はコンテナ内の現在の作業ディレクトリを設定します。
  3. COPY は、現在のローカル ディレクトリ (プロジェクトのルート) からコンテナー内の作業ディレクトリにファイルまたはフォルダーをコピーします。ご覧のとおり、このステップでは依存関係に関連するファイルのみをコピーします。これは、Docker が各ビルド内のコマンドの各結果をレイヤーとしてキャッシュするためです。ビルド時間と帯域幅を最適化するため、依存関係が変更された場合にのみ再インストールする必要があります (通常はファイルの変更よりも頻度は低くなります)。
  4. RUN シェル内でコマンドを実行します。
  5. EXPOSE はコンテナの内部ポート用です (アプリの PORT env とは関係ありません)。ここでの値はどれでも問題ありませんが、さらに詳しく知りたい場合は公式ドキュメントを確認してください。
  6. CMD の目的は、コンテナを実行するためのデフォルト値を提供することです。

これらのキーワードについて詳しく知りたい場合は、Dockerfile リファレンスを参照してください。

.dockerignore を追加する

.dockerignore ファイルの使用は必須ではありませんが、強くお勧めします。

  • コンテナにジャンクファイルをコピーしないように注意してください。
  • COPY コマンドの使用が簡単になります。

すでに使い慣れている場合は、.gitignore ファイルと同じように機能します。以下の内容を Dockerfile と同じレベルの .dockerignore ファイルにコピーすると、自動的に取得されます。

  1. README.md
  2.  
  3. ギット
  4. .gitignore
  5.  
  6. # ログ
  7. 糸デバッグログ
  8. 糸エラー.log
  9.  
  10. # バイナリ
  11. ノードモジュール
  12. */*/ノードモジュール
  13.  
  14. # ビルド
  15. */*/建てる
  16. */*/dist
  17. */*/script.js

最終的な画像を明るくするために無視したいファイルを自由に追加してください。

Dockerイメージのビルド

アプリケーションが Docker に対応できるようになったので、Docker から実際のイメージを生成する方法が必要になります。これを行うには、ルート package.json に新しいコマンドを追加します。

  1. {
  2. 「名前」 : 「my-app」
  3. 「バージョン」 : 「1.0.0」
  4. 「ライセンス」 : 「MIT」
  5. 「プライベート」 : true
  6. "ワークスペース" : [ "パッケージ/*" ],
  7. 「devDependencies」 : {
  8. "esbuild" : "^0.9.6"
  9. "ts-node" : "^9.1.1"
  10. "typescript" : "^4.2.3"  
  11. },
  12. 「スクリプト」 : {
  13. "app" : "yarn ワークスペース @my-app/app"
  14. "common" : "yarn ワークスペース @my-app/common"
  15. "server" : "yarn ワークスペース @my-app/server"
  16. 「ビルド」 : 「ts-node ./scripts/build.ts」
  17. 「サーブ」 : 「ノード ./packages/server/dist/index.js」
  18. "docker" : "docker build . -t my-app" //この行を追加します
  19. }
  20. }

dockerビルド。 -t my-app コマンドは、Docker に現在のディレクトリ (.) を使用して Dockerfile を検索し、結果のイメージに (-t) my-app という名前を付けるように指示します。

ターミナルで docker コマンドを使用できるように、Docker デーモンが実行されていることを確認してください。

コマンドがプロジェクトのスクリプトに追加されたので、yarn docker を使用して実行できます。

コマンドを実行すると、次のターミナル出力が表示されます。

  1. ビルド コンテキストをDocker デーモン送信しています 76.16 MB
  2. ステップ 1/12:ノード:14.15.5-alpineから
  3. ---> c1babb15a629  
  4. ステップ 2/12: WORKDIR /usr/src/app
  5. ---> b593905aaca7  
  6. ステップ 3/12: ./package.json をコピーします。
  7. ---> e0046408059c  
  8. ステップ 4/12: ./yarn.lock をコピーします。
  9. ---> a91db028a6f9  
  10. ステップ 5/12: ./packages/app/package.json をコピーします。./packages/app/
  11. ---> 6430ae95a2f8  
  12. ステップ 6/12: ./packages/common/package.json をコピーします。./packages/common/
  13. ---> 75edad061864  
  14. ステップ 7/12: ./packages/server/package.json をコピーします。./packages/server/
  15. ---> e8afa17a7645  
  16. ステップ8/12: 糸を通す
  17. ---> 2ca50e44a11a  
  18. ステップ 9/12: コピーします。 。
  19. ---> 0642049120cf  
  20. ステップ10/12: 糸のビルドを実行する
  21. ---> 15b224066078 で実行中 
  22. 糸ラン v1.22.5
  23. $ ts-node ./scripts/build.ts
  24. 3.51秒完了しました
  25. 中間コンテナ 15b224066078 の削除
  26. ---> 9dce2d505c62  
  27. ステップ11/12: EXPOSE 3000
  28. ---> f363ce55486b で実行中 
  29. 中間コンテナ f363ce55486b を削除しています
  30. ---> 961cd1512fcf  
  31. ステップ 12/12: CMD [ "yarn" , "serve" ]
  32. ---> 7debd7a72538 で実行中 
  33. 中間コンテナ 7debd7a72538 を削除しています
  34. ---> df3884d6b3d6  
  35. df3884d6b3d6 を正常に構築しました
  36. my-app:latest のタグ付けに成功しました

それでおしまい!これで、Docker で使用するためにイメージが作成され、マシンに登録されました。利用可能な Docker イメージを一覧表示したい場合は、docker image ls コマンドを実行します。

  1. → dockerイメージls
  2. リポジトリ タグ イメージ ID 作成サイズ 
  3. my-app 最新 df3884d6b3d6 4分前 360MB

次のようにコマンドを実行します

コマンドラインから動作するDockerイメージを実行するのは、次のように簡単です: docker run -d -p 3000:3000 my-app

  • -d はコンテナをデタッチモード(バックグラウンド)で実行します。
  • -p はコンテナを公開するポートを設定します (形式は [ホスト ポート]:[コンテナ ポート])。したがって、コンテナ内のポート 3000 (Dockerfile の EXPOSE パラメータに注意してください) をコンテナ外のポート 8000 に公開したい場合は、-p フラグに 8000:3000 を渡します。

コンテナが実行中であることは、 docker ps で確認できます。実行中のコンテナがすべて一覧表示されます。

  1. → docker ps
  2. コンテナID イメージ コマンド 作成ステータス ポート名
  3. 71465a89b58b my-app "docker-entrypoint.s…" 7 秒前 6 秒前にアップ 0.0.0.0:3000->3000/tcp determination_shockley

次に、ブラウザを開いて次の URL http://localhost:3000 に移動し、アプリケーションが実行中であることを確認します 🚀!

<<:  Kubernetes が Docker を放棄するのはなぜですか?

>>:  このツールはKubernetesクラスタをイメージにパッケージ化できる

推薦する

AppleとMicrosoftのWebサイトのユーザビリティからマーケティング重視のWebサイト構築を考える

起業家および事業主の皆様へ:こんにちは、マーケティング反逆者です。ここで皆さんにシェアするのは、Pi...

egihosting-$75/i7-3770/16g メモリ/500g ハードディスク/10T トラフィック/サンノゼ

Egihosting は、特別価格のプロモーション独立サーバーをいくつかリリースしました。コンピュー...

ウェブサイトのコンバージョン率を効果的に向上させる5つの要素

簡単に言えば、従来の中小企業がオンラインマーケティングを行う目的は、インターネットを通じて自社の露出...

Zookeeper を簡単に説明する (パート 2) Zookeeper に基づく分散ロックとリーダー選出

1. Zookeeperの機能1. Zookeeperノードタイプ上記の「Zookeeper アーキ...

「百度はブランドプロモーションを知っている」のSEOプロモーションで関連検索を確立

「Baidu Knows」は皆さんもよくご存知だと思います。さまざまな目的でプロモーションを行うため...

extravm: シンガポール VPS - 60% オフ、月額 5 ドルから、Ryzen 9 7900 + 10Gbps 帯域幅 + 無制限の高防御、モバイル回線に最適

現在、extravmのシンガポールデータセンターのVPS再入荷が40%オフで販売されています。新しい...

SEO実践共有:302はBaiduによってウェブサイトの価値を下げる原因となる

302 ステータス コードは、一般的な HTTP ステータス コードの 1 つです。302 は一時的...

8月22日のBaiduアルゴリズムのアップグレード、あなたのウェブサイトは準備ができていますか?

百度ウェブマスタープラットフォームは8月22日、百度のアルゴリズムアップグレードが不正サイトの掲載や...

onliveserver: 香港 (CN)、日本、マレーシア、シンガポール、タイなど 30 か国で VPS および専用サーバーを運営しています。

onliveserver は 2008 年に設立されたインド企業で、主にドメイン名、仮想ホスティング...

Oracle Marketing Cloud が Royal FrieslandCampina の精密マーケティングの成功を支援

消費の高度化と新小売時代の到来により、中国は世界第2位の乳幼児消費市場となった。乳児用調製粉乳業界に...

百度のレインボープロジェクトは医療業界にとって新たな打撃となるのか?

12月10日、百度百科が最近「虹プロジェクト」と呼ばれる項目編集計画の開始を発表したと報じられた。よ...

BitAccel-1g メモリ/60g ハードディスク/1T トラフィック/G ポート/月額 3.5 ドル

正直、bitaccel がスタートした当初は暴走するかもしれないと思いました。設立当初の価格は本当に...

ウェディングウェブサイトのロングテールキーワードを掘り出す方法

キーワードはウェブサイトにとって非常に重要です。キーワードはウェブサイトのラベルです。ユーザーはこれ...