Neovim × Docker:Devcontainerの「重さ」を脱ぎ捨て、ネイティブ速度でコンテナ開発を制するアーキテクチャ
VS CodeのDevcontainerは素晴らしい。だが、数千ファイルあるプロジェクトでインデックス作成に待たされ、メモリを食いつぶす「重さ」に辟易していないか?
我々エンジニアが求めるのは、「コンテナの隔離環境」と「ローカルエディタの爆速レスポンス」の完全な融合だ。今回は、Neovimをメインエディタとしつつ、Dockerコンテナの恩恵を最大限に受けるための「透過的開発環境」の構築術を伝授する。
—
1. アーキテクチャの核心:LSPの「コンテナ・ホスト間ブリッジ」
多くのエンジニアは「コンテナ内にNeovimを入れる」というアプローチを採るが、これは愚策だ。キーバインド、プラグイン管理、クリップボード連携など、ローカルの快適さをすべて捨てることになる。
真の正解は「LSPサーバーをコンテナ内で起動し、ホスト側のNeovimからUnix Domain SocketまたはTCP経由で接続すること」だ。
実装戦略:`nvm-remote-lsp` 的アプローチ
コンテナ内の `gopls` や `pyright` をホストから叩くために、`socat` を利用してコンテナ内のポートをホストに転送する。
コンテナ起動時に実行するサイドカー的なsocatコマンド
コンテナ内のLSPポート(例: 8080)をホストのローカルポート(8080)へバインド
socat TCP-LISTEN:8080,fork,reuseaddr TCP:localhost:8080 &
これにより、Neovimは「ローカルで動いているLSP」と錯覚して通信を行う。パスの解決(`root_dir`)が最大の鬼門だが、`nvim-lspconfig` の `root_pattern` をコンテナ側の絶対パスにマッピングする設定を `init.lua` に記述する。
—
2. 開発効率を極限まで高める「絶対神プラグイン」構成
ただツールを入れるだけでは生産性は上がらない。チーム全体で「体験」を統一するための厳選プラグインだ。
- [snacks.nvim](https://github.com/folke/snacks.nvim): 今のNeovimエコシステムの決定版。これ一つで `picker`、`notifier`、`dashboard` を網羅できる。VS Codeの重厚なUIを軽量に再現するならこれ一択。
- [conform.nvim](https://github.com/stevearc/conform.nvim): 保存時の自動フォーマットを非同期で実行。チーム開発において「フォーマット論争」を物理的に消滅させるための必須装備。
- [oil.nvim](https://github.com/stevearc/oil.nvim): ディレクトリを単なる「テキストファイル」として編集可能にする。ファイル移動やリネームが、エディタ操作の延長で行えるため、マウスに触れる時間が0.1秒減る。
—
3. チーム開発における「設定の共有化」ルール
`init.lua` を個人の趣味の館にしてはならない。チームで共通化すべきは「LSPの設定」と「フォーマッタ」だ。
推奨構成:`.nvim/` ディレクトリ運用
プロジェクトルートに `.nvim/` を作成し、ローカル設定を分離する。
— .nvim/init.lua (プロジェクト固有設定)
— コンテナ環境下でのパス解決を自動化する魔法のコード
local project_root = vim.fn.getcwd()
require(‘lspconfig’).gopls.setup({
cmd = { “docker”, “exec”, “-i”, “my-container”, “gopls” },
root_dir = function(fname)
return vim.fs.root(fname, {“.git”, “go.mod”})
end,
})
このように、`docker exec` をLSPのコマンドとして直接指定することで、コンテナの再起動にも即座に追従できる。
—
4. プロの隠しコマンド:作業速度を倍にするキーバインド
優秀なエンジニアは「指の移動距離」を最小化する。
— leaderキーをスペースに設定
vim.g.mapleader = ” ”
— 【極秘】直前のバッファと現在のバッファを瞬時に切り替え
vim.keymap.set(‘n’, ‘
— 【極秘】コンテナ内のログを別ウィンドウで追跡するコマンド
vim.keymap.set(‘n’, ‘
特に `
—
5. 最後に:なぜ「Neovim×Docker」なのか
VS Codeは「汎用的なツール」であり、あなたのプロジェクト専用には最適化されていない。Neovimは「あなたの指先に最適化されたツール」だ。
コンテナ内のLSPをホスト側で操り、`.nvim/` にプロジェクト特有のワークフローをコードとして刻み込む。これにより、「新人がプロジェクトにアサインされた瞬間、`nvim`と打つだけで、そのプロジェクトの標準化された開発環境が完成する」という状態が実現できる。
ツールに振り回されるな。ツールをプロジェクトのアーキテクチャの一部として組み込み、開発者体験(DX)という名の武器を磨き続けろ。
さあ、次は `lazy.nvim` の遅延読み込み設定を突き詰め、起動時間を100ms以下に削り出す旅に出る時間だ。健闘を祈る。