(一部未解決)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サーバ経由でコンテナにリモート接続することはできないようです。

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拡張機能と同様、エラーとなってしまいました。

とりあえず触ってみる程度であればこの方法でも問題なさそうなので、当面はこれでやっていきたいと思います。

参考