# もっと Docker 使おうよ!Node.js を Docker から引っ張ろうよ
Docker だけで Node.js のバージョン管理を完結させたい人向けに、環境構築の全手順とコマンド集、そして NVM/Nodebrew と比較したメリット・デメリットをまとめました。キーワードは「Docker Node.js バージョン管理」。ローカル環境を汚したくない、複数プロジェクトで LTS と最新版を行き来したい人は必見です。
# この記事で得られること
- Docker イメージから Node.js をバージョン別に起動する方法
~/.zshrcに貼るだけの alias セット- npm / Yarn / pnpm をコンテナ経由で動かすコツ
- NVM(公式推奨)との住み分けと選定基準
# 前提条件
- macOS / Linux(WSL2 でも可)
- Docker Desktop などで Docker CLI が利用できること
/Users/xxx以下にソースコードが存在し、$(pwd)を共有マウントしたいケース
# Composer / Sail の Docker alias 例
PHP 開発で Docker 化した Composer/Sail を使っているなら、以下のような alias を既に貼っているはずです。
alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
alias composer='docker run --rm -itv $PWD:/app composer:2.7.1'
この発想を Node.js にも広げ、ローカルへ Node をインストールしなくても済むようにしていきます。
# Step1: 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 を起動
# Step2: 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
# FAQ
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 ... } のように関数化してください。
# まとめ
- Docker alias だけで Node.js のマルチバージョン切替が可能
- npm / Yarn / pnpm も統一しておくと事故が減る
- 権限やキャッシュの扱いに注意しつつ、CI と同じ環境をローカルに再現できる
- 公式推奨の NVM も軽く押さえ、必要に応じて使い分ける
Docker を活用すると「Node.js のバージョン管理は NVM しか勝たん」という常識をいい意味で裏切れます。チーム開発でバージョン差異が出て困っている人は、今日から alias を貼ってみましょう。