Docker Desktopが重いからWSL2でLazyDockerに移行してみた
開発環境のメモリ不足、深刻ですよね。
PCにメモリを32GB積んでいてもブラウザ、IDE、そして最近ではローカルLLM(Ollama等)を同時に立ち上げると、リソースはあっという間に枯渇します。
タスクマネージャーを見ると、常に上位に居座っているのが Docker Desktop 関連のプロセスや、肥大化した Vmmem です。
Vmmemとは?
WSL2などの仮想マシンが使用しているメモリやCPUリソースを管理している、Windows側のプロセスのことです。
WSL2側でメモリを使うと、Windows側ではこのVmmemのメモリ使用量が増加します。
「GUIでコンテナの状態を確認したい」というだけなのに、そのために重厚な仮想マシン管理プロセスを常駐させるのは、リソース効率の観点から最適解とは言えません。
そこで今回は、Docker Desktopをアンインストールし、WSL2ネイティブのDocker Engine + LazyDocker に移行する方法を紹介します。
さらに、「使う時だけ起動し、終わったらメモリを即座に解放する」 運用フローまでを構築し、開発機のスペックを極限まで引き出します。
前提条件: WSL2 で systemd が有効であること。
/etc/wsl.confに[boot]セクションでsystemd=trueが設定されている必要があります。
本記事のゴール
- Go言語の最新版をWSL2にインストールする
- Native Docker Engineを導入し、自動起動を無効化する
- LazyDockerを導入し、マウスレスで快適な管理環境を作る
- コマンド一発で「起動→作業→完全停止」する最強のエイリアスを作る
Step 1. Go言語 (Golang) の導入
LazyDockerはGo製ツールです。
バイナリを直接落とすこともできますが、Go環境を入れておくとアップデート管理が楽ですし、他のモダンなCLIツールも導入しやすくなるため、最初に導入してしまいます。
WSL2 (Ubuntu) 上で以下を実行します。
※ apt install golang はバージョンが古いことが多いため、今回は公式からバイナリを取得して導入します(nvm等で管理したい方はそちらでも構いません)。
# 既存の古いGoがあれば削除
sudo rm -rf /usr/local/go
# 最新版をダウンロードして展開
# バージョンは https://go.dev/dl/ で最新を確認してください
wget https://go.dev/dl/go1.26.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.26.1.linux-amd64.tar.gz
# パスを通す(go install のバイナリ用に $HOME/go/bin も追加)
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bashrc
source ~/.bashrc
# 確認
go version
Step 2. Native Docker Engine の導入と「オンデマンド化」
ここが本記事の肝です。
Docker Desktopを削除し、純粋なLinux版Docker Engineを入れた上で、「PC起動時に勝手に立ち上がらない(Systemdの自動起動無効化)」設定までを一気に行います。
以下のスクリプトをsetup_docker.shとして保存し、実行してください。
#!/bin/bash
set -e
echo ">>> [Phase 1] 古いDocker関連ファイルの削除..."
# Docker Desktopや古いパッケージを一掃します
sudo apt-get remove -y docker docker-engine docker.io containerd runc || true
echo ">>> [Phase 2] リポジトリのセットアップ..."
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# GPGキーとリポジトリの追加(公式最新手順)
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# DEB822形式でリポジトリ登録
sudo tee /etc/apt/sources.list.d/docker.sources << EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
echo ">>> [Phase 3] Native Docker Engine のインストール..."
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# sudoなしでdockerコマンドを打てるようにする
sudo usermod -aG docker $USER
# グループ変更を反映(再ログインでも可)
newgrp docker
echo ">>> [Phase 4] 自動起動の無効化 (オンデマンド運用の準備)..."
# これが重要。PC起動時にはDockerを起動させない。
sudo systemctl disable docker
sudo systemctl disable containerd
sudo systemctl stop docker.service docker.socket
echo ">>> セットアップ完了。"
実行コマンド:
chmod +x setup_docker.sh
./setup_docker.sh
Step 3. LazyDocker のインストール
Go環境が入っているので、インストールは一瞬です。
go install github.com/jesseduffield/lazydocker@latest
もしGoのパス設定等でうまくいかない場合は、以下のインストールスクリプトでも導入可能です。
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
スクリプト方式は ~/.local/bin にインストールされます。PATHが通っていない場合は追加してください:
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
これでlazydockerコマンドが使えるようになりました。
Step 4. 運用:魔法のエイリアスを設定する
ここまでの設定で「Dockerはインストールされているが、動いていない(メモリ消費ゼロ)」状態になりました。 これを使う時だけ叩き起こし、使い終わったら即座にメモリを解放するための設定を .bashrc に記述します。
~/.bashrcの末尾に以下を追記してください。
# --- Docker Control Center ---
# 1. 手動起動関数
# サービスを開始し、Dockerソケットが応答するまで待機する
dstart() {
if systemctl is-active --quiet docker; then
echo "Docker is already running."
else
echo "Wake up Docker..."
sudo systemctl start docker
# ソケットが準備できるまで待つ(これがないとエラーになる)
while ! docker info > /dev/null 2>&1; do
printf "."
sleep 1
done
echo -e "\nDocker is ready."
fi
}
# 2. 完全停止関数
# サービスとソケットを停止し、メモリを解放する
dstop() {
echo "Shutting down Docker..."
sudo systemctl stop docker.service docker.socket
echo "Docker is dead. RAM released."
}
# 3. 便利なエイリアス
# [起動] -> [LazyDockerで作業] -> [終了時に自動停止]
alias lazy='dstart && lazydocker && dstop'
設定を反映します。
source ~/.bashrc
実際のワークフロー
準備は整いました。
あとはターミナルでこのコマンドを打つだけです。
lazy
これだけで以下のフローが自動実行されます。
- Docker起動: 必要な時だけエンジンが立ち上がります。
- LazyDocker起動: リッチなTUIでコンテナログの確認、再起動、掃除を行います。
- 作業終了: q キーでLazyDockerを閉じます。
- 自動停止: 即座に dstop が走り、Dockerプロセスがキルされます。

(キャプション: マウス操作も可能ですが、キーボードだけでサクサク操作できるのが快感です)
メモリ解放の最終手段
WSL2を使っていると、Dockerコンテナを停止してもVmmemプロセスのメモリ使用量がなかなか下がらないことがあります(Linux側のページキャッシュが残るため)。
本当にメモリを空けたい時はlazyで終了した後に以下のコマンドを実行すると、物理メモリがWindows側に返却されます。
# キャッシュをクリアしてメモリを強制解放
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
まとめ
- Docker Desktopは便利だが、リソース(特にメモリ)を食う。
- LazyDockerを使えば、TUIの快適さを維持しつつ、常駐プロセスを排除できる。
- WSL2ネイティブ環境なら、メモリの解放もコマンド一つで制御可能。
浮いた4GBのメモリは、より大きなLLMモデルをロードしたり、ブラウザのタブを増やしたりといったあなたがやりたいことに使えます。
開発環境のダイエットを検討している方は、ぜひ試してみてください!
