Docker で Node プロジェクトをビルドしてデプロイする方法

Docker で Node プロジェクトをビルドしてデプロイする方法

以前、フルスタック ノード プロジェクトを実行しましたが、サーバー側のテクノロジ スタックは nginx + koa + postgresql でした。 CentOS 上で環境構築とデプロイがかなり面倒でした。テストサーバーをデプロイし、オンラインになったら本番環境サーバーをデプロイしました。そこには、退屈で、エネルギーを消費し、感謝されない「肉体労働」が数多く含まれています。そこで、ビルドとデプロイメントの作業のこの部分を自動化する方法を考え始め、Docker にたどり着きました。

Dockerとは

Docker は仮想マシンよりもさらに軽量な仮想化技術です。仮想化される実体はコンテナと呼ばれます。コンテナ自体は、分離されたスコープを持つサンドボックスです。基本的なライブラリとそれが運ぶサービスだけが含まれており、非常に合理化されています。コンテナが実行されるや否や、コンテナはホストマシン内の単なるプロセスとなり、リソースをほとんど占有しません。これにより、優れた操作性と柔軟性を備えた、オペレーティングシステム上でコンテナ クラスターを実行するための条件が整います。

イメージとコンテナの関係は何ですか?イメージはクラス、コンテナはオブジェクトと考えることができます。コンテナはイメージをインスタンス化することで生成されます。もちろん、1 つのイメージから複数のコンテナを生成することもできます。

クライアントサイドDocker

サーバー上でない場合、クライアント上で Docker をどのように使用すればよいでしょうか? Docker Desktop は Windows と OSX、さらに Kitematic で使用でき、どちらもデスクトップ管理ツールであり、一般的な操作に非常に便利です。 Docker Desktop と Kitematic は一部の操作のみを視覚化しており、多くの操作はコマンドラインを使用してのみ実行できるため、コマンドラインは依然として必要です。

基本的なDocker操作

画像名

イメージタグに関して、例えばnginx:1.19.0-alpineの場合、1.19.0はnginxのバージョン番号、alpineはOSのコード名です。

  • ジェシー: debian 8
  • ストレッチ: debian 9
  • バスター: debian 10
  • アルパイン:アルパインは非常に小さいのでお勧めです。

アルパインが一番小さいバージョンで、中には他のバージョンの 4 分の 1 の大きさのものもあります。つまり、ロードされるコンポーネントが少なくなるため、イメージの構築が高速化され、より効率的に実行されるようになり、結果として脆弱性が減少し、セキュリティが向上します。

画像をプルする

docker pull nginx:1.19.0-alpine

コンテナを起動する

  • --name web: コンテナ名をwebとして指定します
  • -p 8080:80: コンテナ nginx はポート 80 をリッスンします。これはローカル ポート 8080 にマッピングされています。
  • -v xxxx:xxxx: コンテナのnginx設定ファイルにマップされたローカル設定ファイルです
  • -d: バックグラウンドで実行
  • nginx:1.19.0-alpine: 使用されるイメージ
docker run --name web -p 8080:80 -v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.19.0-alpine

その他の操作

  • docker イメージ #画像を表示
  • docker rmi xxx #イメージを削除
  • docker ps #実行中のコンテナを表示
  • docker rm xxx #コンテナを削除

Dockerファイル

イメージをビルドするより便利な方法は、イメージの設定ファイルである Dockerfile を使用することです。Dockerfile があれば、いつでもイメージをビルドできます。以下は、構築中に使用されるベース イメージから、非常にシンプルな nginx イメージを構築する方法です。

nginxから
nginx.conf をコピー /etc/nginx/nginx.conf

Docker の作成

プロジェクトに単一のコンテナだけでなく複数のコンテナを実行する必要があり、コンテナが相互に通信する必要がある場合は、より強力な管理ツールが必要になります。たとえば、k8s ですが、現在の小規模なプロジェクトでは、公式の Docker-compose で十分です。

まず、docker-compose.yml 構成ファイルが必要です。たとえば、次のテンプレートは 2 つのコンテナ用です。Image は使用されるイメージ、ports はポート マッピング、volumes はマッピングする必要があるデータ ボリュームを示します。

バージョン: "3"

サービス:
  ウェブアプリ:
    画像: ウェブ
    ポート:
      - 「8080:80」
    ボリューム:
      - "/データ"
  レディス:
    画像: "redis:alpine"

次に、次のコマンド ラインを使用できます。

docker-compose build [options] [SERVICE...] #プロジェクト内のサービスコンテナをビルド(再構築)します docker-compose up -d # Composeプロジェクトを実行します(バックグラウンド実行)

docker-compose up は非常に強力なコマンドで、イメージの構築、サービスの(再)作成、サービスの開始、サービス関連コンテナの関連付けなど、一連の操作を自動的に完了しようとします。リンクされたサービスは、すでに実行されていない限り、自動的に開始されます。ほとんどの場合、このコマンドを通じてプロジェクトを直接開始できると言えます。

nginx-node-postgresプロジェクトをビルドする

上記の基盤があれば、独自のプロジェクトを構築することができます。まず、ノードサービスのDockerfileは主に以下の手順を実行します。

  • コンテナの作業ディレクトリを作成する
  • 関連する設定ファイルをコンテナにコピーします
  • コンテナにnpmパッケージをインストールする
  • pm2を実行してコンテナを起動します
ノード:14.5.0-alpine3.12 から
# 作業ディレクトリ WORKDIR /usr/src/app
# 設定ファイルをコピーします COPY package*.json ./
process.yml をコピーします。
npm set registry を実行します https://registry.npm.taobao.org/ \
  && npm をインストール pm2 -g \
  && npm インストール
# pm2 を使用して CMD を管理します ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"]
エクスポーズ3010

次にdocker-compose.ymlを設定します

  • db構成はpostgresデータベースであり、データボリュームはデータベースディレクトリと初期化手順をマップします。
  • アプリはノードサービスで構成されます。build は dockerfile が配置されているディレクトリです。depends_on は依存コンテナと起動順序を示します。ここでは、db が最初に起動され、次に node が起動されます。links は、db 名をアプリコンテナにマッピングすることを示します。
  • nginxコンテナはappコンテナに依存し、転送ノードのサービスを設定します。
バージョン: '3'

サービス:
  デシベル:
    イメージ: postgres:12.3-alpine
    コンテナ名: postgres
    環境:
      - TZ=アジア/上海
      - POSTGRES_PASSWORD=xxxx です
    ボリューム:
      - ./postgres/data:/var/lib/postgresql/data
      ./postgres/init:/docker-entrypoint-initdb.d を参照してください。
    ポート:
      -5432:5432
    restart: always #常に再起動してください。本番環境での推奨設定は常に再起動してください。
    さらす:
      - 5432
      
  アプリ: 
    画像: koa-pg
    コンテナ名: koa
    ボリューム:
      - ./dist:/usr/src/app/dist
      - ./logs:/usr/src/app/logs
    建てる: 。/
    環境:
      - TZ=アジア/上海
    再起動: 常に
    依存:
      -db
    リンク:
      -db
    さらす:
      - 3010
      
  nginx:
    イメージ: nginx:1.19.0-alpine
    コンテナ名: nginx
    ボリューム:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ポート:
      -8080:80
    環境:
      - TZ=アジア/上海
    再起動: 常に
    依存:
      - アプリ
    リンク: # nginx 転送を構成するには IP ではなくホスト名を使用します - アプリ
    さらす:
      - 8080

プロジェクトを設定したら、次のステップはそれを実行することです。

docker-compose を起動する

これは、ローカル開発マシンの場合もそうですし、サーバーにデプロイする場合も同様です。必要な数のサーバーをデプロイできます。Docker がインストールされていれば、コマンドライン 1 つだけで解決できます。

いくつかのコンテナを起動するには、docker-compose.yml の設定を変更し、docker-compose up を再度実行します。とても簡単です!

これで、Docker を使用して Node プロジェクトをビルドしてデプロイする手順に関するこの記事は終了です。Docker を使用して Node をビルドしてデプロイする方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker+jenkins+node.js の自動デプロイメント環境をゼロから構築する方法

<<:  Vueのよく使われる組み込み命令の詳細な説明

>>:  MySql 8.0 と対応するドライバー パッケージの一致に関する注意事項

推薦する

Vue ページ印刷で自動ページングを実装する 2 つの方法

この記事では、ページ印刷の自動ページングを実現するためのVueの具体的なコードを例として紹介します。...

Linux で圧縮ファイルの内容を表示する 10 の方法 (要約)

一般的に、アーカイブされたファイルや圧縮されたファイルの内容を表示するには、まず解凍してから表示する...

MySQL の制限ページング最適化ソリューションの実装に関する簡単な説明

MySQL のページングステートメントの使用制限Oracle や MS SqlServer と比較す...

nginxディレクトリパスをリダイレクトする方法

ドメイン名に続くパスがデフォルトの Web ディレクトリではなく、ローカル ディスク上の他のディレク...

mysql8.x docker リモートアクセスの詳細な設定

目次環境条件エラーが発生しました回避策1. mysql dockerにログインする2. ルートパスワ...

crontab でスケジュールされたタスクが実行されない理由の概要

序文最近、仕事でいくつかの問題が発生しました。crontab でスケジュールされたタスクが実行されま...

TypeScript の Enum が問題となる理由

目次どうしたの?いつ使うか列挙の数を制御するビット値コントロールインデックス非数値列挙結論はType...

JavaScript を使用してタイムラインとアニメーション効果を実装するためのサンプル コード (フロントエンドのコンポーネント化)

目次コードのクリーニングJavaScript の「フレーム」 「フレーム」の実装方法1. 間隔を設定...

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪...

jsを使用してシンプルな弾幕スクリーンシステムを実装する

この記事では、弾幕効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的な...

MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27の詳細なダウンロード、インストール、および構成チュートリアルは参考までに、具...

JavaScriptはクリックするとランダムなグラフィックを生成します

この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...

MySQLにおけるテーブルインデックスの定義方法と導入

概要インデックスは、テーブル内の 1 つ以上の列に基づいて DBMS によって特定の順序で作成される...

Node.js を使用して png 画像に透明なピクセルがあるかどうかを判断する方法

背景PNG 画像は jpg 画像よりも多くのストレージスペースを占有しますが、PNG 画像の品質は大...

MySQLのバッファプールの詳細な説明

MySQL のデータはディスクに書き込む必要があることは誰もが知っています。ディスクの読み取りと書き...