ローカルのVSCodeからリモートホスト上のDockerコンテナ内のプログラムをデバッグする

ローカル(Windows)のVSCodeからリモートホスト(ubuntu)上のDockerコンテナ内のプログラムをデバッグする

概要

Windows上のVSCodeからUbuntu上のDockerコンテナに接続してデバッグする方法。

UbuntuへのDockerインストール方法はこちら sudo なしで Docker動かせるようにしとく必要あり

リモートホストへの接続

UbuntuへのSSH接続の準備についてはこちら

手順

[!NOTE] 一度接続すればリモートエクスプローラ(SSH TARGETS)に表示されるのでそこから接続しても良い。

リモートホスト上のプログラムをデバッグしたい場合はここでフォルダを開いてごちょごちょやればよい。

Dockerコンテナへの接続

準備

WindowsマシンにDocker desktop for windows が必要になるので、インストールしておく。
WindowsへのDockerインストール方法はこちら
CLIだけでよさそうなんだけど、CLIだけってのがどこかにあるのか分からんかったのでとりあえず全部入れた。
Docker Desktopは動いてなくて良いので、Exitして可。
普段から使わないならDocker Dashboardの設定のGeneralから「Start Docker Desktop when you log in」のチェックを はずしておけばOK。

docker.exeで疎通確認

コマンドプロンプト等で以下を実行

set DOCKER_HOST=ssh://«ユーザ名»@«ホスト»
docker ps -a

リモートホスト上のコンテナの状態が返ってくるか確認。

DOCKER HOSTの設定

VScodeのsettings.json に以下の一文を追加する。もちろん上で確認した内容で。

    "docker.host": "ssh://«ユーザ名»@«ホスト»",

[!NOTE] ローカルにつなぎたいときはこの行をコメントアウト(//をつける)すればOK。
setting.jsonはJSONファイルだけど、 //でコメントアウトできる。

[!NOTE] VScode settings.json の開き方

  • メニュー ファイル→ユーザ設定→ 設定
  • 設定画面の右上のボタン「設定(JSON)を開く」をクリック

または

  • メニュー表示→コマンドパレット
  • Preference: Open Settings(JSON) を選択

VScodeでリモート エクスプローラからリモートホストに接続(その1)

リモートホストに拡張機能 Docker と Docker Explorer をインストールしておき、 Dockerペインを開くとリモートホスト上のコンテナとかが見える

ここでは既にリモートホスト上でコンテナ作成済みとする。
(イメージからコンテナ作ったりDockerfileからBuildしたりできると思うけど、今はおいとく)

あとはリモート SSH や ローカルのDockerでのデバッグと同じ。

接続の終了

接続を終了する場合は

このとき、コンテナからだけでなく、リモートホストからも切断される。

VScodeでリモート エクスプローラからリモートホストに接続(その2)

リモートエクスプローラ(Containers)で接続するコンテナを右クリックし、「Attach to Container」または「Attach in New Window」を選択
(コンテナが起動されていなければ起動して)コンテナに接続される。

あんまりごちょごちょしなくて済むのでこっちの方がおススメかな。

ネットワークポート

通常Cockerコンテナ内のネットワークポートをホストや外部コンピュータからアクセスするには、
コンテナ作成時に-p (–publish) オプションで接続を受け入れるポート番号を指定する必要があるが、
VScodeから接続している場合は、Docker内のネットワークポートにVScodeが実行されているマシンからlocalhost:«ポート番号»で接続できる。
(アクセス遅いけど、ちょっと別のポート開けて試したい なんて時には便利)

ただし、これはDockerが動作しているホストコンピュータや他のコンピュータからはアクセスできない。
これらからアクセスするには-pオプションを指定する必要がある。

その他

https://qiita.com/Yuki_Oshima/items/d3b52c553387685460b0
↑ここにある、「Remote-Containers: Open Folder in Container…」での手順はリモートホストに接続した状態では実行できないらしい。
どうしてもこのコンテナでデバッグしたい場合は、
一旦リモートホスト上でVSCodeを起動してコンテナを作成しておき、
その後ローカルPCからこのコンテナにアタッチするような手順をふめばデバッグできる。