はじめに
Remote Developmentの登場によって、サーバやdockerコンテナにVSCodeで簡単に繋ぐことができるようになりました。
しかし、「サーバ上のdockerコンテナ」という二段階のリモート処理を実現する手段が見当たらなかったので、記事にしました。
サーバやdockerコンテナにVSCodeで繋ぐ
まずは基本であるサーバ or dockerコンテナにVSCodeで繋ぐ一段階のリモート処理について説明します。
サーバにVSCodeで繋ぐ
まずは~/.ssh/configを作ります。
例えば、こんな感じ。
Host aws
Hostname 12.345.67.890
User ubuntu
IdentityFile ~/.ssh/hoge.pem
あとは、以下のページのようにRemote Developmentで繋ぐことができます。
https://dev.classmethod.jp/etc/vs-code-remote-development-ec2/
dockerコンテナにVSCodeで繋ぐ
dockerコンテナが作成された状態でRemote Developmentボタンをクリックすると、以下のようにコンテナ一覧が表示されるので、繋ぎたいコンテナを右クリック→"Connect to Container"でコンテナに接続できます。
dockerコンテナにssh接続
本記事では多段sshを利用してサーバ上のdockerコンテナに接続します。
なので、dockerコンテナにssh接続できるようにします。
まず、以下の記事を参考にDockerfileを作り、docker buildします。
https://qiita.com/YumaInaura/items/1d5c18a9e55484ccad89
その後、以下のようなコマンドでコンテナを走らせます。
docker run -d -p 10000:22 image_name
10000のところは任意のポート番号で、自由に変更可能です。
image_nameはdocker imageの名前です。
そして、以下のようなコマンドでssh接続します。
ssh root@127.0.0.1 -p 10000
rootの部分はDockerfileに書いたユーザ名、10000の部分はdocker run時に書いたポート番号で置き換えます。
以上の方法でdockerコンテナにssh接続できますが、この方法だとPATHが通っていない状態でdockerコンテナの中に入ってしまうので、以下のissueを参考に、/etc/profileにPATHをexportするようDockerfileに記述しておきます。
https://github.com/NVIDIA/nvidia-docker/issues/36
多段sshでサーバ上のdockerコンテナにVSCodeで繋ぐ
あとは以上の方法を組み合わせるだけです。
まず、~/.ssh/configに以下のように記述します。
Host aws
Hostname 12.345.67.890
User ubuntu
IdentityFile ~/.ssh/hoge.pem
Host aws_docker
Hostname 127.0.0.1
User root
Port 10000
ProxyCommand ssh -W %h:%p aws
サーバー上でコンテナを走らせた上でVSCodeを見るとaws_dockerが見えるので、上記と同様に接続します。
おわりに
本記事では多段sshを利用して、サーバ上のdockerコンテナにVSCodeで繋ぐ方法を解説しました。
「もっと簡単な方法あるよ」という方は是非教えてください!