メインコンテンツへスキップ

Docker環境でNode.jsを学ぼう_Part1_Node.js基礎編

·
ツール Docker Node.js ハンズオン・チュートリアル
目次
Docker環境でNode.jsを学ぼう - この記事は連載の一部です
パート 1: この記事

はじめに
#

🎯 このメモで理解すべき3つの要点
#

  1. Dockerによる使い捨て学習環境の構築

    • ローカル環境を汚さずにNode.jsを学習
    • docker run --rmで終了時に自動削除される環境
  2. Node.jsの基本概念と役割

    • サーバーサイドJavaScript実行環境
    • フロントエンド開発ツールの基盤
  3. npmを使ったプロジェクト管理の基礎

    • package.jsonによる依存関係管理
    • パッケージのインストールと実行

⚠️ よくある初心者の間違い
#

  • ❌ Dockerコンテナ内でファイルを作成したが、マウントしていないので消えてしまう
  • ❌ コンテナをexitした後、--rmオプションでコンテナが削除されたことに気づかない
  • node_modulesフォルダの肥大化を知らずにローカルにインストールしてしまう

✅ この学習方法のメリット
#

  • 🧹 クリーンな環境維持:ローカルPCにNode.jsをインストール不要
  • 🔄 再現性:同じ環境を何度でも再構築可能
  • 🗑️ 使い捨て:学習後はディレクトリ削除で完全クリーンアップ
  • 🔒 隔離:他のプロジェクトへの影響なし

前提条件
#

必要なもの
#

  • Docker Desktopがインストールされていること
  • ターミナル(コマンドプロンプト、PowerShell、Terminal.app等)の基本操作

Dockerのインストール確認
#

# Dockerのバージョン確認
docker --version
# 出力例: Docker version 24.0.7, build afdd53b

# Dockerが動作しているか確認
docker run hello-world

Part 1: Docker基礎(使い捨て環境の理解)
#

1.1 使い捨てコンテナの基本形
#

# 基本形:対話モードで起動し、終了時に自動削除
docker run -it --rm <イメージ名> bash

オプションの意味
#

オプション意味重要度
-it対話モード(ターミナルで操作可能)⭐⭐⭐
--rmコンテナ終了時に自動削除⭐⭐⭐
-v $(pwd):/workカレントディレクトリをマウント⭐⭐⭐
-w /work作業ディレクトリを指定⭐⭐

1.2 ファイルを残すパターン
#

# ローカルファイルをコンテナ内にマウント
docker run -it --rm -v $(pwd):/work -w /work <イメージ名> bash

重要:マウントしたディレクトリ(/work)で作成したファイルは、コンテナ終了後もローカルに残ります。

✅ このセクションで学んだこと
#

  • docker run -it --rmで使い捨てコンテナを起動
  • -v $(pwd):/workでローカルディレクトリをマウント(ファイルを永続化)
  • --rmオプションでコンテナ終了時に自動削除

Part 2: Node.js概要
#

2.1 Node.jsとは?
#

Node.jsは、JavaScriptをサーバーサイドで実行するための実行環境(ランタイム)です。

JavaScriptの実行環境の変遷
#

【従来】
  JavaScript → ブラウザでのみ実行可能(クライアントサイド)

【Node.js登場後】
  JavaScript → ブラウザ + サーバー + CLI + 開発ツール

Node.jsの特徴
#

特徴説明
V8エンジンGoogle Chromeと同じ高速JavaScriptエンジン
ノンブロッキングI/O非同期処理による高いパフォーマンス
シングルスレッドイベントループによる効率的な処理
npm世界最大のパッケージエコシステム

2.2 なぜNode.jsを学ぶのか?
#

フロントエンド開発における必要性
#

現代のフロントエンド開発では、以下のツールがNode.js上で動作します:

ツール用途
npm / yarnパッケージ管理
Webpack / Viteバンドル・ビルド
Babelトランスパイル(新しいJS→古いJS変換)
ESLint静的コード解析
Prettierコードフォーマット
SassCSSプリプロセッサ

バックエンド開発での活用
#

フレームワーク用途
ExpressWebアプリケーションAPI
NestJSエンタープライズ向けフレームワーク
Next.jsReact SSR/SSGフレームワーク

✅ このセクションで学んだこと
#

  • Node.jsはJavaScriptをサーバーサイドで実行する環境
  • V8エンジン、ノンブロッキングI/O、npmが主な特徴
  • フロントエンド開発ツール(Webpack、Babel、ESLintなど)の基盤

Part 3: ハンズオン① 最初のNode.js体験
#

3.1 学習用ディレクトリの作成
#

# 作業ディレクトリを作成
mkdir nodejs-study && cd nodejs-study

3.2 Node.jsコンテナの起動
#

# Node.js 20のコンテナを起動(ファイルをマウント)
docker run -it --rm -v $(pwd):/work -w /work node:20 bash

期待される結果

root@コンテナID:/work#

プロンプトが変わり、コンテナ内に入ったことがわかります。

3.3 Node.jsのバージョン確認
#

# コンテナ内で実行
node -v
# 出力例: v20.x.x

npm -v
# 出力例: 10.x.x

3.4 Node.jsでHello World
#

方法1: 対話モード(REPL)
#

# Node.js REPLを起動
node

# 以下をREPL内で入力
> console.log("Hello, Node.js!");
Hello, Node.js!
undefined

> 1 + 2
3

> const message = "Docker + Node.js 学習中!";
undefined

> message
'Docker + Node.js 学習中!'

# REPLを終了
> .exit

方法2: スクリプトファイル実行
#

# ファイルを作成
echo 'console.log("Hello from script!");' > hello.js

# スクリプトを実行
node hello.js
# 出力: Hello from script!

3.5 コンテナの終了
#

# コンテナから抜ける
exit

確認ポイント:ローカルディレクトリにhello.jsが残っていることを確認

# ローカルで確認
ls
# 出力: hello.js

cat hello.js
# 出力: console.log("Hello from script!");

✅ このセクションで学んだこと
#

  • node:20イメージでNode.js環境を起動
  • nodeコマンドでREPL(対話モード)を起動
  • node <file.js>でスクリプトファイルを実行
  • マウントしたディレクトリに作成したファイルはコンテナ終了後も残る

Part 4: ハンズオン② npmプロジェクトの初期化
#

4.1 コンテナの再起動
#

# 同じディレクトリで
docker run -it --rm -v $(pwd):/work -w /work node:20 bash

4.2 package.jsonの作成
#

# 対話形式で初期化
npm init

# または、デフォルト設定で一括作成
npm init -y

対話形式での質問と回答例
#

package name: (work) my-first-nodejs
version: (1.0.0) 
description: Node.js学習用プロジェクト
entry point: (index.js) 
test command: 
git repository: 
keywords: nodejs, learning
author: Your Name
license: (ISC) MIT

生成されるpackage.json
#

{
  "name": "my-first-nodejs",
  "version": "1.0.0",
  "description": "Node.js学習用プロジェクト",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "nodejs",
    "learning"
  ],
  "author": "Your Name",
  "license": "MIT"
}

4.3 package.jsonの重要な項目
#

フィールド役割
nameプロジェクト名my-first-nodejs
versionバージョン1.0.0
mainエントリーポイントindex.js
scriptsnpmスクリプト{ "start": "node index.js" }
dependencies本番用パッケージ{ "express": "^4.18.0" }
devDependencies開発用パッケージ{ "nodemon": "^3.0.0" }

✅ このセクションで学んだこと
#

  • npm init -yでpackage.jsonを作成
  • package.jsonはプロジェクトの設定ファイル(名前、バージョン、依存関係など)
  • scriptsフィールドでnpmスクリプトを定義

Part 5: ハンズオン③ パッケージのインストール
#

5.1 パッケージのインストール体験
#

# 人気のユーティリティライブラリをインストール
npm install lodash

実行結果の例
#

added 1 package, and audited 2 packages in 1s

found 0 vulnerabilities

5.2 インストール後の変化を確認
#

# package.jsonの確認
cat package.json
{
  "name": "my-first-nodejs",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.21"  // ← 追加された!
  }
}
# node_modulesディレクトリの確認
ls node_modules/
# 出力: lodash

5.3 インストールしたパッケージを使う
#

# index.jsファイルを作成
cat << 'EOF' > index.js
// lodashをインポート
const _ = require('lodash');

// 配列操作の例
const numbers = [1, 2, 3, 4, 5];
const doubled = _.map(numbers, n => n * 2);

console.log('元の配列:', numbers);
console.log('2倍にした配列:', doubled);

// オブジェクト操作の例
const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 25 }
];

const grouped = _.groupBy(users, 'age');
console.log('年齢でグループ化:', grouped);
EOF

# 実行
node index.js

期待される出力
#

元の配列: [ 1, 2, 3, 4, 5 ]
2倍にした配列: [ 2, 4, 6, 8, 10 ]
年齢でグループ化: { '25': [ { name: 'Alice', age: 25 }, { name: 'Charlie', age: 25 } ], '30': [ { name: 'Bob', age: 30 } ] }

5.4 npmスクリプトの設定
#

# package.jsonのscriptsを編集
cat << 'EOF' > package.json
{
  "name": "my-first-nodejs",
  "version": "1.0.0",
  "description": "Node.js学習用プロジェクト",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "hello": "echo 'Hello from npm script!'"
  },
  "dependencies": {
    "lodash": "^4.17.21"
  }
}
EOF

# スクリプトを実行
npm run hello
# 出力: Hello from npm script!

npm start
# index.jsの実行結果が表示される

✅ このセクションで学んだこと
#

  • npm install <pkg>でパッケージをインストール
  • インストールしたパッケージはnode_modules/に配置
  • require()でパッケージをインポートして使用
  • npm run <script>でnpmスクリプトを実行

Part 6: ハンズオン④ 開発用パッケージ
#

6.1 devDependenciesとは
#

種類用途インストールコマンド
dependencies本番環境で必要npm install <pkg>
devDependencies開発時のみ必要npm install -D <pkg>

6.2 nodemonのインストール
#

# 開発用パッケージとしてインストール
npm install -D nodemon

package.jsonの変化
#

{
  "dependencies": {
    "lodash": "^4.17.21"
  },
  "devDependencies": {
    "nodemon": "^3.0.0"  // ← 追加された!
  }
}

6.3 nodemonを使った開発体験
#

# package.jsonのscriptsを更新
cat << 'EOF' > package.json
{
  "name": "my-first-nodejs",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js"
  },
  "dependencies": {
    "lodash": "^4.17.21"
  },
  "devDependencies": {
    "nodemon": "^3.0.0"
  }
}
EOF

# nodemonで起動(ファイル変更を監視)
npm run dev

nodemonの特徴

  • ファイルの変更を検知して自動で再起動
  • 開発効率が大幅に向上
  • Ctrl + Cで終了

6.4 コンテナを終了
#

exit

✅ このセクションで学んだこと
#

  • npm install -D <pkg>で開発用パッケージをインストール
  • dependenciesは本番環境で必要、devDependenciesは開発時のみ必要
  • nodemonはファイル変更を検知して自動再起動するツール

Part 7: ハンズオン⑤ 依存関係の再インストール
#

7.1 node_modulesを削除してみる
#

# ローカルで実行(コンテナの外)
rm -rf node_modules
ls
# 出力: hello.js  index.js  package-lock.json  package.json

7.2 npm installで復元
#

# コンテナを起動
docker run -it --rm -v $(pwd):/work -w /work node:20 bash

# 依存関係を再インストール
npm install

実行結果
#

added 2 packages, and audited 3 packages in 2s

found 0 vulnerabilities

重要package.jsonがあれば、npm installで依存パッケージを完全に復元できます。

7.3 package-lock.jsonの役割
#

ファイル役割
package.json必要なパッケージとバージョン範囲を記録
package-lock.json実際にインストールされた正確なバージョンを記録

ベストプラクティス

  • package.jsonpackage-lock.jsonはGitにコミット
  • node_modulesはGitにコミットしない

✅ このセクションで学んだこと
#

  • node_modulesを削除してもnpm installで復元可能
  • package-lock.jsonは正確なバージョンを記録
  • node_modulesはGitにコミットしない(package.jsonから復元可能)

Part 8: ハンズオン⑥ 簡単なWebサーバー
#

8.1 Expressのインストール
#

# コンテナ内で
npm install express

8.2 Webサーバーの作成
#

# server.jsを作成
cat << 'EOF' > server.js
const express = require('express');
const app = express();
const PORT = 3000;

// ルートパスへのGETリクエスト
app.get('/', (req, res) => {
  res.send('Hello from Express in Docker!');
});

// JSONを返すAPI
app.get('/api/info', (req, res) => {
  res.json({
    message: 'Docker + Node.js + Express',
    timestamp: new Date().toISOString(),
    nodeVersion: process.version
  });
});

// サーバー起動
app.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}`);
});
EOF

8.3 ポートを公開してコンテナを起動
#

# 一度exitしてから、ポート指定で再起動
exit

# ポート3000を公開してコンテナを起動
docker run -it --rm -v $(pwd):/work -w /work -p 3000:3000 node:20 bash

# サーバーを起動
node server.js

8.4 動作確認
#

別のターミナルを開いて:

# curlで確認
curl http://localhost:3000
# 出力: Hello from Express in Docker!

curl http://localhost:3000/api/info
# 出力: {"message":"Docker + Node.js + Express","timestamp":"...","nodeVersion":"v20.x.x"}

またはブラウザで http://localhost:3000 にアクセス

8.5 サーバーの停止
#

# Ctrl + C でサーバー停止
# exitでコンテナ終了
exit

✅ このセクションで学んだこと
#

  • Expressは人気のWebアプリケーションフレームワーク
  • -p 3000:3000でコンテナのポートをホストに公開
  • app.get()でルーティングを定義、res.send()/res.json()でレスポンス

Part 9: 後片付けと学習の振り返り
#

9.1 学習ファイルの確認
#

# ローカルで確認
ls -la
# 出力:
# hello.js
# index.js
# node_modules/
# package-lock.json
# package.json
# server.js

9.2 クリーンアップ
#

# 学習ディレクトリを削除
cd ..
rm -rf nodejs-study

# または、node_modulesだけ削除して軽量化
rm -rf nodejs-study/node_modules

✅ このセクションで学んだこと
#

  • 学習後はrm -rf <directory>でクリーンアップ
  • node_modulesだけ削除すればディスク容量を節約できる
  • 必要になったらnpm installで復元可能

まとめ
#

🎯 学んだこと
#

Docker関連
#

コマンド用途
docker run -it --rm使い捨てコンテナを起動
-v $(pwd):/workディレクトリをマウント
-w /work作業ディレクトリを設定
-p 3000:3000ポートを公開

Node.js関連
#

コマンド用途
node -vバージョン確認
node <file.js>スクリプト実行
nodeREPL起動

npm関連
#

コマンド用途
npm init -yプロジェクト初期化
npm install <pkg>パッケージインストール
npm install -D <pkg>開発用パッケージインストール
npm install依存関係を再インストール
npm run <script>スクリプト実行

📚 次のステップ
#

  1. npm / yarn の深掘り

    • セマンティックバージョニング
    • グローバルインストール vs ローカルインストール
  2. フロントエンド開発ツール

    • Webpack / Vite でのバンドル
    • Babel でのトランスパイル
    • ESLint / Prettier でのコード品質管理
  3. バックエンド開発

    • Express での REST API 構築
    • データベース連携
  4. Node.jsバージョン管理

    • nvm / nodenv でのバージョン切り替え

💡 Tips: 学習用コマンドチートシート
#

# Node.js学習環境を一発で起動
mkdir study && cd study
docker run -it --rm -v $(pwd):/work -w /work node:20 bash

# ポート公開付き(Webサーバー学習用)
docker run -it --rm -v $(pwd):/work -w /work -p 3000:3000 node:20 bash

# プロジェクト初期化からパッケージインストールまで
npm init -y && npm install express

# 学習終了後のクリーンアップ
cd .. && rm -rf study

参考資料
#

Docker環境でNode.jsを学ぼう - この記事は連載の一部です
パート 1: この記事