はじめに#
🎯 このメモで理解すべき3つの要点#
Dockerによる使い捨て学習環境の構築
- ローカル環境を汚さずにNode.jsを学習
docker run --rmで終了時に自動削除される環境
Node.jsの基本概念と役割
- サーバーサイドJavaScript実行環境
- フロントエンド開発ツールの基盤
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 | コードフォーマット |
| Sass | CSSプリプロセッサ |
バックエンド開発での活用#
| フレームワーク | 用途 |
|---|---|
| Express | WebアプリケーションAPI |
| NestJS | エンタープライズ向けフレームワーク |
| Next.js | React 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 |
| scripts | npmスクリプト | { "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.jsonとpackage-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> | スクリプト実行 |
node | REPL起動 |
npm関連#
| コマンド | 用途 |
|---|---|
npm init -y | プロジェクト初期化 |
npm install <pkg> | パッケージインストール |
npm install -D <pkg> | 開発用パッケージインストール |
npm install | 依存関係を再インストール |
npm run <script> | スクリプト実行 |
📚 次のステップ#
npm / yarn の深掘り
- セマンティックバージョニング
- グローバルインストール vs ローカルインストール
フロントエンド開発ツール
- Webpack / Vite でのバンドル
- Babel でのトランスパイル
- ESLint / Prettier でのコード品質管理
バックエンド開発
- Express での REST API 構築
- データベース連携
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