# もっと 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 を貼ってみましょう。

2025-02-22
  • javascript

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