ねののお庭。

かりかりもふもふ。

【VSCode】踏み台サーバ越しのリモートサーバ内で動いているDockerコンテナにVSCodeをアタッチする。

欲求としては以下みたいな感じ。

f:id:nenoNaninu:20210507193806p:plain

自分は今まではただ単にVSCodeのRemote SSH使ってました。Remote SSHは~/.ssh/configから設定読み込んで上の図の作業環境まで一発で繋いでくれるので楽です。

marketplace.visualstudio.com

今回は繋ぎたい対象がコンテナなので、一工夫(?)必要です。

一応公式に書かれている方法とかあるんですが、自分みたいに踏み台重ねてたり、リモートの作業環境にグローバルIP割り振られてなかったりすると、使えないんですよね。 残念ながら。

code.visualstudio.com

ちなみに上記のサイトに

We recommend using the Visual Studio Code Remote-SSH extension to connect to a remote machine running Docker engine, ...

とか書かれていますが、コンテナ内にもsshサーバでも建てろという事なのだろうか。そんな事はしたくないゾ。

それではどうするかというと。ポートフォワーディングします。 基本的にコンテナとのやり取りはdocker deamonを介して行われます。 で、そのdocker deamonとのやり取りにはUnixドメインソケットが用いられてます。

ソケットが生えている先はデフォルトだとここ

/var/run/docker.sock

なので

Host XXX
  User YYY
  ProxyCommand ssh HUMIDAI -W %h:%p
  LocalForward 9999 /var/run/docker.sock
  IdentityFile ZZZ

とか設定しておくと、localhost:9999に接続すればリモートの作業環境の/var/run/docker.sockに接続したのと同じ事になります。

この時点でssh XXXで作業環境にssh張ってみて、以下のコマンド叩いてみましょう。 (shellでの操作は特にVSCode側に関係ありません、単にテストです)

PowerShellの場合

$env:DOCKER_HOST="localhost:9999"
docker ps

bashの場合

export DOCKER_HOST="localhost:9999"
docker ps

docker psでリモートの作業環境のdockerの稼働状況が表示されればOK。

VSCode側の設定します。 Remote - Containersを入れておきます。

marketplace.visualstudio.com

で、VS Codeの中にあるdocker hostの設定をtcp://localhost:9999とします。

f:id:nenoNaninu:20210507202435p:plain

で、その後Remote-Containers: Attach to Running Container...を選択すれば、リモートの作業環境で動いているコンテナが表示されるので、選択すればめでたく接続されます。

f:id:nenoNaninu:20210507203800p:plain

まぁ、他にもやり方はあるっぽいんですが、ポートフォワーディングしてしまうのが最もシンプルな気がします。