Docker: Node.js

Dockerを使用してNode.jsアプリを利用・デプロイする方法

👋 Stackheroのドキュメントへようこそ!

Stackheroは、DockerクラウドCaaS (Containers as a Service) の即時利用可能なソリューションを提供し、多くの利点があります。例えば:

  • docker-compose up だけでコンテナを簡単に本番環境にデプロイ
  • HTTPSで保護されたカスタマイズ可能なドメイン名(例: https://api.your-company.com, https://www.your-company.com, https://backoffice.your-company.com)。
  • プライベートで専用のVMによる最適なパフォーマンスと強力なセキュリティ
  • ワンクリックでの簡単なアップデート

時間を節約し、生活を簡素化:StackheroのDocker CaaSクラウドホスティング ソリューションを試して、コンテナを本番環境にデプロイするのに5分しかかかりません!

このガイドは、Node.jsアプリを開発し、迅速かつ簡単に本番環境にデプロイするための堅実な基盤を提供します。

Dockerの事前知識は必要ありません。すべてがスムーズな体験を保証するように設定されています。必要なのは、コンピュータにDockerがインストールされていることだけです。

このドキュメントは、初心者から経験豊富なユーザーまで、無駄な複雑さなしに、最新でスケーラブルな技術を使用してNode.jsアプリケーションをデプロイしたい方を対象としています。

このソリューションの主な特徴は以下の通りです:

  • 💪 最小限の労力で簡単にセットアップ
  • 🐳 開発および本番環境の両方でDockerを利用
  • 🔄 nodemonを使用してコード変更時にNode.jsを自動リロード
  • 🚀 単一コマンドでの本番環境へのデプロイ
  • 🔒 安全なHTTPS暗号化のためのTLS証明書管理
  • 🚧 ステージングおよびプレプロダクションプラットフォームのサポート
  • 🧱 モジュラーでスケーラブルなアーキテクチャ

Dockerがまだコンピュータにインストールされていない場合は、Docker公式サイトからダウンロードできます。Dockerが正しく動作していることを確認するには、ターミナルを開いてdocker versionを実行してください。エラーなしでバージョン情報が表示されるはずです。

Dockerをインストールした後、以下のボイラープレートリポジトリをクローンします:

git clone https://github.com/stackhero-io/nodejsWithDockerGettingStarted/
cd nodejsWithDockerGettingStarted

次に、make development-startを実行して開発プラットフォームを開始するか、make helpで利用可能なすべてのコマンドを確認します。

開発プラットフォームを開始するには、以下を実行します:

make development-start

このコマンドはDockerイメージをビルドし、実行し、my-app/package.jsonに定義されたdevスクリプトを実行します(これはnpm run devを実行するのと同等です)。

この例では、Expressを使用したシンプルなREST APIが作成されます。http://localhost:5000に移動すると、ページに「Hello World」と表示されるはずです。

次に、お好みのIDEでmy-app/src/app.jsファイルを開き、次の行を変更します:

res.send('Hello World');

これを以下に変更します:

res.send('Updated!');

ファイルを保存します。Node.jsコードは自動的にリロードされ、http://localhost:5000をリフレッシュすると更新されたAPIレスポンスが反映されます。

おめでとうございます - これで完全に動作する開発プラットフォームができました!

追加のパッケージをインストールする必要がある場合は、make development-shellを実行してコンテナシェルにアクセスできます。内部に入ったら、NPMを使用してnpm install <package>またはYarnを使用してyarn add <package>で必要なパッケージをインストールします。

既存のNode.jsプロジェクトをDockerと統合したい場合は、次の手順に従ってください:

  1. プロジェクト内にmy-appという新しいディレクトリを作成します。

  2. .gitignoreおよび.gitファイルを除くすべてのプロジェクトファイルをmy-appディレクトリに移動します。

  3. ボイラープレートからdockersecrets、およびMakefileをプロジェクトのルートディレクトリにコピーします。

  4. プロジェクト内の.gitignoreファイルを編集し、次の行を追加します:

    node_modules/
    secrets/*.production
    secrets/*.staging
    

このボイラープレートは、アプリがポート5000でリッスンすることを前提としています。別のポートを希望する場合は、docker/docker-compose.development.ymlファイルを編集し、make development-startで環境を再起動できます。

異なるNode.jsバージョンを指定したい場合は、次の手順に従ってください:

  1. アプリのDockerイメージを定義するdocker/my-app.dockerfileファイルを開きます。
  2. FROM node:<version>-alpineと記載された最初の行を見つけます。
  3. <version>を選択したNode.jsバージョンに置き換えます。長期サポート(LTS)バージョンを使用することをお勧めします。最新のLTSバージョンはNode.jsのウェブサイトで確認できます。例えば、最新のLTSバージョン(現在22)を使用するには、行をFROM node:22-alpineに更新します。特定のバージョン番号を希望する場合は、FROM node:22.13.0-alpineのように使用できます。
  4. Dockerfileに変更を保存します。

開発プラットフォームの環境変数は、secrets/my-app.developmentファイルに設定します。

本番環境では、secrets/my-app.productionファイルを使用します。

secrets/my-app.productionファイルをGitリポジトリにコミットしないでください!このファイルには機密情報が含まれており、誤って共有されないようにボイラープレートの.gitignoreでデフォルトで無視されています。

Node.jsアプリがファイルを保存する必要がある場合(例えば、ユーザーのアップロード)、MinIOのようなオブジェクトストレージサービスを使用することを検討してください。オブジェクトストレージサービスは、アプリケーションがシームレスにスケールし、潜在的な問題を軽減するのに役立ちます。

ローカルにファイルを保存することを希望する場合は、常にDockerボリュームを使用するようにしてください。コンテナ内に直接ファイルを保存すると、データ損失が発生する可能性があります。このボイラープレートは、ファイルを安全に保存するために/persistentにマウントされたボリュームを提供します。

カスタムボリュームを作成し、設定に確信がある場合を除き、/persistentディレクトリ外に永続データを保存しないでください。/persistent外にファイルを保存するとデータ損失が発生します!

このボイラープレートを簡単に変更してステージング環境を追加できます。以下の手順を実行してください:

  1. docker/docker-compose.production.ymlのコピーを作成し、docker/docker-compose.staging.ymlと名前を付けます。このファイルは、ステージング環境のコンテナと設定を定義します。
  2. データベースのパスワードやAPIキーなど、ステージングに必要な機密情報を含むsecrets/my-app.stagingファイルを作成します。
  3. Makefile内で「Staging platform」とラベル付けされたセクションを見つけてコメントを解除します。

最後に、make helpを実行して、新しく利用可能になったステージングコマンドを確認します。

まだStackhero for Dockerサービスをお持ちでない場合は、Stackheroダッシュボードから簡単に作成できます。約2分でアクティブになります。

Stackheroが初めての方は、Dockerコンテナクラウドホスティングを1か月間無料でお試しいただけます。

アプリを本番環境にデプロイする前に、いくつかの設定ファイルを準備する必要があります:

  1. secrets/global.production.examplesecrets/global.productionにコピーします。
  2. secrets/global.productionを編集し、Stackheroダッシュボードから取得したDockerサービスのホスト名で<XXXXXX>.stackhero-network.comを置き換えます。
  3. secrets/my-app.production.examplesecrets/my-app.productionにコピーします。
  4. secrets/my-app.productionを編集し、資格情報を挿入します。
  5. docker/docker-compose.production.ymlを更新し、<XXXXXX>.stackhero-network.comをDockerサービスのホスト名で置き換えます。

本番環境へのデプロイは簡単です:以下を実行します:

make production-deploy

このコマンドはDockerコンテナを作成し、プロジェクトデータを転送して本番環境のDockerサービスに送信します。ブラウザを開き、Dockerサービスのホスト名(例:https://<XXXXXX>.stackhero-network.com)に移動します。REST APIが「Hello World」と応答するはずです。

make productionを使用することもでき、コンテナをデプロイし、リアルタイムログを表示します。

本番環境を監視したり、問題をトラブルシューティングしたりするために、以下のコマンドを使用してログを表示できます:

  • ライブログをストリームするには、make production-logs-liveを実行します。
  • すべての保存されたログを取得するには、make production-logsを実行します。
  • 特定の日のログを取得するには(YYYY-MM-DDを希望の日付に置き換えます)、make production-logs | grep "YYYY-MM-DD"を実行します。

https://<XXXXXX>.stackhero-network.comの代わりに別のドメイン名を使用したい場合、Stackhero for DockerはTraefikを統合してドメイン管理を簡素化します。TraefikはHTTPルーティングとTLS暗号化(HTTPS)を処理します。

ドメイン名をカスタマイズするためのいくつかの例を以下に示します:

  • api.my-company.comをポート5000でTLS暗号化を使用してコンテナmy-app経由で提供するには、docker/docker-compose.production.ymlファイルのlabelsセクションを以下に置き換えます:

        labels:
          - "traefik.enable=true" # このコンテナへのトラフィックをルーティングするためにTraefikを有効にする
          - "traefik.http.routers.my-app.rule=Host(`api.my-company.com`)" # ホストを定義する
          - "traefik.http.routers.my-app.tls.certresolver=letsencrypt" # TLS証明書にletsencryptを使用する
          - "traefik.http.services.my-app.loadbalancer.server.port=5000" # ポート5000を指定する
    
  • my-company.comをポート5000でコンテナmy-app経由で提供し、www.my-company.comからmy-company.comへのすべてのリクエストをリダイレクトするには、同じファイルのlabelsセクションを以下に更新します:

        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.my-app.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # 両方のドメインを含める
          - "traefik.http.routers.my-app.tls.certresolver=letsencrypt"
          - "traefik.http.services.my-app.loadbalancer.server.port=5000" # ポート5000を指定する
    
          # www.my-company.comをmy-company.comにリダイレクトする:
          - "traefik.http.routers.my-app.middlewares=redirect-www"
          - "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
          - "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
          - "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
    

my-company.comwww.my-company.comのDNSを設定し、それぞれがCNAMEとしてhttps://<XXXXXX>.stackhero-network.comのDockerサービスを指すようにすることを忘れないでください。