# もっと Docker 使おうよ!Node.js を Docker から引っ張ろうよ

Docker だけで Node.js のバージョン管理を完結させたい人向けのメモ。ローカル環境を汚したくない、複数プロジェクトで LTS と最新版を行き来したい人向け。

# Node.js コンテナ alias を作成する

~/.zshrc~/.bashrc に追記して、Terminal を再起動(または source ~/.zshrc)。

# bash でインタラクティブに入りたい場合
alias node18="docker run --rm -it -v $(pwd):/app -w /app node:18 bash"
alias node20="docker run --rm -it -v $(pwd):/app -w /app node:20 bash"
alias node22="docker run --rm -it -v $(pwd):/app -w /app node:22 bash"
alias node24="docker run --rm -it -v $(pwd):/app -w /app node:24 bash"

使い方:

node18  # Node.js 18 の bash を起動
node20  # Node.js 20 の bash を起動
node22  # Node.js 22 の bash を起動
node24  # Node.js 24 の bash を起動

# npm / Yarn / pnpm もコンテナ経由に統一する

CLI ごとに alias を揃えることで、ローカルにインストール済みのコマンドと混ざる事故を防げる。

# Node
alias node18="docker run --rm -it --entrypoint node node:18"
alias node20="docker run --rm -it --entrypoint node node:20"
alias node22="docker run --rm -it --entrypoint node node:22"
alias node24="docker run --rm -it --entrypoint node node:24"

# npm
alias npm18="docker run --rm -it --entrypoint npm -v $(pwd):/app -w /app node:18"
alias npm20="docker run --rm -it --entrypoint npm -v $(pwd):/app -w /app node:20"

# Yarn
alias yarn18="docker run --rm -it --entrypoint yarn -v $(pwd):/app -w /app node:18"
alias yarn20="docker run --rm -it --entrypoint yarn -v $(pwd):/app -w /app node:20"

# pnpm も必要なら
alias pnpm20="docker run --rm -it --entrypoint pnpm -v $(pwd):/app -w /app node:20"

# よくあるハマりポイント

  • 権限エラー: node_modules をホストと共有すると root 権限で書き込まれることがある。--user $(id -u):$(id -g) を指定すると回避できる。
  • パフォーマンス: Apple Silicon では node:22 など公式イメージが linux/arm64 対応なので問題なし。ただし Rosetta 変換が必要な旧イメージは遅いので注意。
  • キャッシュ: 依存関係を毎回入れ直したくない場合、-v node_modules:/app/node_modules のように名前付きボリュームを共通化すると高速化できる。

# Docker 方式のメリット・デメリット

項目 Docker で管理 NVM / Nodebrew
環境の汚れ ほぼゼロ(コンテナ破棄で終了) ローカルにバージョンが溜まる
プロジェクト切替 alias で即切替 nvm use で切替(スムーズ)
npm scripts コンテナ経由なので差分が出にくい ローカルの Node と揃える必要あり
初回起動 イメージ pull が必要 事前インストール済みなら即時
CI/CD 連携 Dockerfile へ転用しやすい 追加設定が必要

「環境差分を極力排除したい」「CI と同一環境で開発したい」なら Docker 方式が優勢。GUI ツールとの連携やネイティブ性能を重視する場合は NVM が楽。

# 公式推奨(NVM)の導入手順

Node.js 公式は依然として NVM を推している。Docker 方式と併用したい人向けに最小セットを残しておく。

# nvm をインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# Node.js をインストール
nvm install 22

# バージョン確認
node -v
nvm current
npm -v

# よくある質問

Q. VS Code の拡張機能(ESLint など)はどうする?
Lint や type-check はローカル Node が必要なケースがある。Docker alias で npm を叩くと node_modules/.bin がホストに生成されるので、VS Code はホストの Node を参照できる。完全にコンテナへ寄せたいなら Devcontainer を使うのがおすすめ。

Q. グローバルインストールした CLI は?
npm install -g firebase-tools などはコンテナ内に閉じるため、毎回消えてしまう。CLI を使い回す場合は独自 Dockerfile を用意し、firebase-tools を事前に入れたイメージを作るとよい。

Q. Windows は対応している?
WSL2 であれば同じ手順が利用可能。PowerShell で alias を貼る場合は function node20 { docker run ... } のように関数化する。

# 参考リンク

2025-02-22

同じタグを持つ記事をピックアップしました。