Neovim × Docker:境界線を消滅させ、開発体験を「神」の領域へ
こんにちは。開発環境の最適化に命を懸けているエンジニアです。
皆さんは、VS Codeの「Remote – Containers」の便利さに一度慣れてしまうと、他の環境に戻れなくなる感覚を味わったことはありますか? あの「環境構築の煩わしさからの解放」は、確かに偉大な発明です。
しかし、Neovim使いである私たちが、わざわざGUIの重いエディタに頼る必要はありません。「コンテナ内の開発環境を、まるでローカルにあるかのように操作する」。この理想を、Neovimで極限までスマートに実現する方法を伝授します。
今日は、ただのインストール手順ではなく、「なぜDockerとNeovimをこう繋ぐのか」というアーキテクチャの本質から紐解いていきます。
—
なぜ「コンテナへのダイレクト接続」が最強なのか
Dockerコンテナ内で開発する場合、多くの人は「`docker exec` で入って、コンテナ内でVimを起動」しようとします。しかし、これではホスト側のクリップボード共有や、リッチなプラグインエコシステムを最大限に活かせません。
真の最適解は、「ホストのNeovimが、コンテナ内のLSP(言語サーバー)を操る」という構成です。
アーキテクチャの要点
1. マウントの魔法: ホストの `~/.config/nvim` をコンテナに読み取り専用で共有する。
2. LSPの分離: 言語サーバー(`gopls`, `pyright`, `tsserver` 等)はコンテナ内にインストールし、Neovimはホスト側からそのソケットやポートを通じて通信する。
これにより、「プロジェクトごとに環境を汚さず、かつ最強のNeovim設定をどこでも使える」という状態が完成します。
—
ステップ1:コンテナへの設定自動マウント(Magic Volume)
コンテナを起動するたびに設定を手動でコピーするのは愚行です。`docker-compose.yml` で、Neovimの設定ディレクトリをコンテナ内に「透過的に」マウントしてしまいましょう。
docker-compose.yml
services:
app:
build: .
volumes:
# プロジェクト本体をマウント
- .:/app
# ホストのNeovim設定をコンテナ内にマウント。これでコンテナ内でも同じショートカットが使える!
- ~/.config/nvim:/root/.config/nvim:ro
# Neovimのキャッシュやデータも共有すると、LSPのインデックスも共有可能
- ~/.local/share/nvim:/root/.local/share/nvim
ここがポイント: `ro` (Read Only) オプションをつけることで、コンテナ側からホストの設定を誤って破壊するリスクを排除しています。
—
ステップ2:コンテナ内のLSPをホストから叩く「橋渡し」
Neovimのプラグイン `nvim-lspconfig` を使っているなら、コンテナ内のLSPを認識させるための設定が必要です。ここで重要なのは、LSPはコンテナ内で動いているという事実です。
以下は、コンテナ内のLSPサーバーに接続するための構成例です。
— nvim/init.lua の設定例
local lspconfig = require(‘lspconfig’)
— コンテナ内の開発用コンテナであれば、ローカルのパスとコンテナ内のパスをマッピングする
lspconfig.pyright.setup({
cmd = { “docker”, “exec”, “-i”, “my-container-name”, “pyright-langserver”, “–stdio” },
root_dir = lspconfig.util.root_pattern(“.git”, “pyproject.toml”),
})
この設定により、Neovimは裏側で `docker exec` を実行し、コンテナ内部の言語サーバーと通信を行います。あなたのキーボード操作は即座にコンテナ内の知能と同期されるのです。
—
ステップ3:精度高い動作確認(Hello World)
環境が正しく構築できたか、以下の「診断コード」を実行してください。
1. コンテナを起動: `docker-compose up -d`
2. Neovimを起動: ホスト側からプロジェクトディレクトリで `nvim` を開く。
3. 診断コマンド: `:checkhealth`
もしLSPが正しく繋がっていれば、`checkhealth` の結果に、コンテナ内のパスを指した言語サーバーが表示されるはずです。
究極の確認法:LSPの補完チェック
適当なファイルを作成し、その言語の標準ライブラリの関数を入力してみてください。
- 補完候補が爆速で出る(これはホスト側のレンダリング)
- 定義ジャンプ(`gd`)がコンテナ内のソースコードへ正確に飛ぶ
これが成功した瞬間、あなたは「IDEの重さ」から完全に解放され、ターミナルの軽快さとコンテナの隔離性を両立した「究極の開発環境」を手に入れたことになります。
—
最後に:なぜこの構成が「震えるほど」役立つのか
多くのエンジニアは、Docker環境を作るたびにIDEの再設定を行っています。しかし、このアーキテクチャを導入すれば、「設定は一度だけ、環境は何度でも」が可能になります。
新しい言語を触る際も、Dockerイメージに言語サーバーを1行追加するだけ。ホストのNeovim設定は一切変更する必要がありません。
毎日のコーディングが劇的に楽になるだけでなく、チーム開発においても「環境の再現性」という最も高い壁を、極めてエレガントに突破できます。ぜひ、今日からあなたのNeovimを「クラウド・コンテナ・ネイティブ」に進化させてみてください。
質問があれば、いつでも歓迎します。さあ、最高の開発体験へ飛び込みましょう!