(一部未解決)Windowsマシン上にDockerホストを立ててVSCodeでコンテナにリモート接続する
結論から言うと、VSCodeのRemote-Containers拡張機能から稼働中のコンテナに再接続することはできませんでした。
しかしリモートDockerホストにあるコンテナ一覧を表示したり、VSCodeからコンテナを操作することはできたので、その方法を記しておきます。
目的
普段使用しているノートパソコンは数年前のものであり、徐々にRAMやSSDの容量が足りなく感じてきたので、別途パソコンを用意してそちらに開発環境を構築することにしています。
しかし、リモートデスクトップで画面を転送するとモニターの表示領域を余分に占領することになってしまい、ノートパソコン側のWebブラウザで調べ物をしながら開発するにはいまいち使いづらく、また開発環境を分けて管理できた方が何かと便利なので、VSCodeでリモートマシン上のDockerコンテナに接続できるようにしてみました。
環境
ホスト
- OS: Windows 10 Home 21H1
- VSCode: 1.65.2
リモート
- OS: Windows 10 Pro 21H2
- Docker Desktop: 4.4.4 (73704)
- Docker Engine: 20.10.12
- ホスト名: DESKTOP-27AIHDU
- ログインユーザ: dev
設定方法
VSCodeに拡張機能をインストールする
下記の拡張機能をVSCodeにインストールします。
リモートマシンにOpenSSHをインストールし起動する
スタートメニューから「設定」ウィンドウを開き、「アプリ」→「アプリと機能」から「オプション機能」を選択します。
「機能の追加」から選択して下記をインストールします。
- OpenSSH クライアント
- OpenSSH サーバー
また、インストールしたSSHサーバを自動的に起動するよう設定しておきます。
スタートメニューを右クリックして「コンピューターの管理」を選択して「コンピューターの管理」ウィンドウを開きます。
「サービスとアプリケーション」→「サービス」から「OpenSSH SSH Server」を探し、ダブルクリックしてプロパティウィンドウを開きます。
「開始」をクリックしてサービスを開始します。
また、スタートアップの種類を「自動」に変更しておきます。
ホストマシンで公開鍵と秘密鍵を作成して登録する
Windows10ではssh-keygen
で作成できます。
ログインしているユーザのフォルダ内の.ssh
配下に、任意の名前で公開鍵と秘密鍵を作成します。
下記のようなコマンドをコマンドプロンプト等で実行します。
ssh-keygen -t rsa -f %USERPROFILE%\.ssh\DESKTOP-27AIHDU_dev
作成した鍵はssh-agent
を使ってホストマシンに登録します。
「OpenSSH Authentication Agent」サービスを有効化していない場合は、「サービス」からプロパティを開いて「開始」をクリックし、スタートアップの種類を「自動」に設定しておきます。
下記のようにコマンドを実行します。
ssh-add DESKTOP-27AIHDU_dev
リモートマシンに公開鍵を登録する
ログインユーザのユーザフォルダ配下の.ssh
フォルダに、公開鍵のファイルをコピーします。
リモートデスクトップであればクリップボード経由でファイルを転送できます。
SSHサーバの設定を変更する
設定ファイルの内容を変更します。
設定ファイルは%ProgramData%\ssh\sshd_config
にあります。
このファイルに一時的に書き込み権限を付与してから編集します。
アクセス権限は、ファイル名を右クリックして「プロパティ」からプロパティウィンドウを開き、「セキュリティ」タブの「詳細設定」をクリックして開いたウィンドウから変更できます。
一覧にないユーザに権限を追加したい場合、「アクセス許可の変更」をクリックして編集画面にし、更に「追加」をクリックして開いた画面から設定します。
設定ファイルを開いたら、下記の行をコメントアウトして保存します。
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
また、作成した公開鍵をauthorized_keys
にリネームしてから、OpenSSHサーバを再起動します。
サービスのプロパティウィンドウから再起動できます。
SSH接続用の設定ファイルを作成する
VSCodeからSSH接続するための設定ファイルを作成します。
リモートエクスプローラーのプルダウンから「SSH Targets」を選択します。左から2番目のボタンである「Configure」をクリックし、表示される一覧からユーザフォルダ配下の.ssh\config
を選択してファイルを開きます。
このファイルに対して、下記のようにリモートマシンのホスト名とログインユーザ、ホストマシン側の鍵の格納先を記載します。
Host dev-pc
HostName DESKTOP-27AIHDU
User dev
IdentityFile C:\Users\xxxxxxxx\.ssh\DESKTOP-27AIHDU_dev
VSCodeの設定を変更する
SSHトンネリングを用いて、拡張機能でリモートマシン上のコンテナの一覧を表示できるよう設定します。
VSCodeの設定ファイルを開き(Ctrl ,
)、「設定の検索」でdocker.host
と入力して表示された項目に、下記のように接続先の情報を設定します。
ssh://dev@DESKTOP-27AIHDU
ここまで設定することで、一応コンテナ一覧が表示され、接続できるようになります。
実行結果
Remote-Containers拡張機能からは接続できない
稼働中のコンテナに接続する場合は、リモートエクスプローラーのプルダウンから「Containers」を選択し、表示されたコンテナの「Attach to Container」をクリックすることで、新たにウィンドウが開かれて表示されます。
しかし、以下のようにエラーが表示されてしまい、コンテナのシェルを表示することはできませんでした。
Shell server terminated (code: 1, signal: null)
下記のGitHubのissueを見ると、現時点ではWindowsのSSHサーバはサポートされておらず、SSHサーバ経由でコンテナにリモート接続することはできないようです。
- ‘Remote-Containers: Reopen in Container’ resulted in an error · Issue #6045 · microsoft/vscode-remote-release · GitHub
- Remote-Containers: Connect through Windows SSH server · Issue #6055 · microsoft/vscode-remote-release · GitHub
WSLにインストールしたOpenSSHサーバであればできるような気がしますが、未確認なので機会があれば試したいと思います。
(2022/04/03追記)
WSLのSSHサーバを構築してアクセスできました。
コンテナへのアタッチの問題も解消できます。
リモートマシンのWSLにOpenSSHサーバとDockerを入れてVSCodeからリモートアクセスできるようにする - てのひら
Docker拡張機能からコンテナを作成して接続することはできる
IMAGESからイメージを右クリックして、「Run Interactive」でコンテナを作成しシェルにアタッチすることはできました。
Docker拡張機能からシェルをアタッチすることはできる
稼働中のコンテナにも、CONTAINERSからコンテナを右クリックして「Attach Shell」でシェルにアタッチすることもできました。
但し、「Attach Visual Studio Code」でのアタッチはRemote-Containers拡張機能と同様、エラーとなってしまいました。
とりあえず触ってみる程度であればこの方法でも問題なさそうなので、当面はこれでやっていきたいと思います。
参考
- OpenSSH をインストールする | Microsoft Docs
- Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた - Qiita
- Windows10+SSHサーバーにWindows10のSSHクライアントにて公開鍵認証でパスワード入力なしで接続できるようにしたときの覚え書き | 技術屋さんの日記帳
- VSCodeからSSH接続をする方法 | server-memo.net
- Connect to Docker engine running on a remote machine
- VS CodeのRemote-Containersでリモートサーバー上のコンテナーの開発を行う方法 - Qiita
- ssh接続先のdockerコンテナにVSCodeのRemote Developmentで繋ぐ - Qiita
- VSCodeでリモートホスト上のDocker上で開発する - Qiita