VSCodeからDockerコンテナへアタッチする手順

## 概要
Dockerコンテナを開発環境として活用する際、VSCodeと連携したい、デバッグしたいというニーズがあります。特にホストPCからssh接続したサーバやPC上に存在するコンテナにアタッチして開発したいという状況はあるのではないでしょうか。
![step_00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/cb94c410-15da-012a-23f4-c6fd50b09f10.png)
ここでは詳細手順を示します。

## 前提条件
- VSCodeがホストPCにインストール済である事
- サーバへアクセスするためのユーザアカウントとパスワードを付与されている事
- サーバ側でアタッチするコンテナを生成済である事

## 作業環境
- ホストPC
    ```
    エディション Windows 10
    バージョン 22H2
    ```

- サーバ
    ```
    Distributor ID: Ubuntu
    Description:    Ubuntu 20.04.5 LTS
    Release:        20.04
    Codename:       focal
    ```

- VSCode  
    バージョン： 1.81.0

なおアタッチするコンテナは、サーバにて生成・起動しており、コンテナ名は「test_container」とします。

## サーバへのssh接続
はじめにサーバとssh接続する必要があります。ただしサーバとの初回接続時には設定が必要になります。ここではエクステンション「Remote-Development」のインストールからssh接続完了までを示します。

1. VSCodeのエクステンション「Remote-Development」をインストールします。
※図は既にインストール済の状態のため、「インストール」ボタンが表示されていません。
![step_00_rd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/aa45def5-cada-9805-6e51-89f956dd0c5b.png)

1. Remote-Developmentのインストール完了すると左側にリモートエクスプローラのアイコンが表示されので、リモートエクスプローラのアイコンをクリックした後、図のギア（SSH構成ファイルを開く）アイコンをクリックします。
![step_00_prepro_ssh_00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/cc596a7a-93cb-a3c4-abc8-daf93ce54c37.png)

1. ssh構成ファイルの選択を要求されます。
    環境によって若干異なりますが、選択肢は概ね以下の二つです。
    - C:\Users\\<ユーザ名>\.ssh\config
    - C:\ProgramData\ssh\ssh_config
    どちらを選択しても問題ありません。
![step_00_prepro_ssh_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/16b22b51-9db0-4d7b-d20f-0154d5a22f2d.png)

1. 自動的にssh設定ファイルが開くので、ssh接続の設定を入力します。
    入力項目は以下のようになります。
    |No|タグ名|入力内容|
    |:-:|:-|:-|
    |1|Host|接続先の名称（わかりやすい名称を任意に設定）|
    |2|HostName|接続先のIPアドレス|
    |3|User|接続先にログインする際のユーザ名|
    |4|Port|ssh接続に使用するポート番号（デフォルト：22）|

    ![step_00_prepro_ssh_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/f58d795e-9e4e-b75c-b570-e2b315a0ab61.png)


1. ssh設定の入力が完了したら保存した後、リモートエクスプローラの更新アイコンをクリックします。
![step_00_prepro_ssh_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/ede7d470-397d-5ff1-88b8-98cb3a82257a.png)

1. 先ほど設定した接続先（Hostタグに入力した値）が表示されたら成功です。
次に接続先の名称を右クリックして、実際の接続処理を行います。今回は「development_env」に接続してみます。このとき「現在のウィンドウでアタッチする」と「新しいウィンドウでアタッチする」が表示されますが、どちらを選んでも構いません。
![step_00_prepro_ssh_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/ac83b099-d1d9-b0d6-19e3-621b80160ff3.png)

1. 次のような画面に遷移するので、接続先の環境に併せて選択してください。
    今回は接続先サーバのOSがUbuntuですので、「Linux」をクリックします。
![step_00_prepro_ssh_05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/a845a3f0-f5ce-a663-d8c0-1662843f1484.png)

1. 次にパスワードの入力を求められるので、接続先サーバにログインする際のユーザに紐づくパスワードを入力してください。
![step_00_prepro_ssh_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/666af563-848c-9982-b562-05ab55ff5849.png)

1. ログインが成功すると次のような画面になります。左下に接続先情報が表示されているので、確認してみてください。
![step_00_prepro_ssh_07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/8e6cd0de-beb8-9c25-475b-19d53f6135ac.png)

## トラブルシュート
何事もなくssh接続することが出来ればよいのですが、「接続できない！」ということもあるかと思います。全てのケースを網羅する事は出来ませんが、私たちが実施した確認と対策について共有します。ちなみにssh接続に失敗すると以下のようなダイアログが表示されます。
![step_00_prepro_ssh_08_troubleshoot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/e33ac3ff-df07-888b-a5d0-fecfa58d4a47.png)

### 確認① ssh構成ファイルのパス設定
先程設定したssh構成ファイルですが、上記の作業にて自動的にVSCodeへパス設定されます。
このためssh構成ファイルのパス設定を確認してみます。
確認手順ですが、まず左下のギアアイコンをクリック後、「設定」を選択します。
![step_00_prepro_ssh_09_troubleshoot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/dadb52f5-6946-edef-e84c-00bacf9db823.png)

表示された設定画面の「設定の検索」に「ssh」と入力します。これにより、ssh接続に関連する設定情報が列挙されます。この中で、「Remote.SSH: Config File」を確認してみます。
![step_00_prepro_ssh_10_troubleshoot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/7623ad37-17d5-996c-3594-9018fe7afd08.png)

もしssh接続に失敗した際に、ここが空であればssh構成ファイルのパスを設定してみてください。
大抵の方は以下のどちらかと思います。
- C:\Users\\<ユーザ名>\\.ssh\config
- C:\ProgramData\ssh\ssh_config

ただ環境によって異なる場合もありますので、適宜置き換えて設定ください。
ssh構成ファイルのパスについては、リモートエクスプローラのギア（SSH構成ファイルを開く）アイコンをクリックすると、先程作成したssh構成ファイルのパスを確認することが出来ます。
![step_00_prepro_ssh_13_troubleshoot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/d424d028-2029-33e3-2d82-c84805620c47.png)

### 確認② ssh.exeのパス設定
ssh接続にはsshの実行ファイル（ssh.exe）が必要です。
[Windows10(ビルド1809以降)はOpenSSHがインストール済](https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse)で環境変数にパスが登録されているはずですので、Windowsの「システムのプロパティ」->「環境変数…」を確認してみてください。
（私の環境では「システム環境変数」に登録されていました）

このとき環境変数にOpenSSHのパスが見当たらない場合や、OpenSSHのパスは登録されているがうまくいかない場合は、個別にVSCodeの設定にてOpenSSHのパス設定することで問題が解決するかもしれません。
設定手順ですが、[「確認①-ssh構成ファイルのパス設定」](#確認①-ssh構成ファイルのパス設定)のssh接続に関連する設定情報を確認するところまで同じです。設定情報の中の「Remote.SSH: Path」にssh.exeまでの絶対パスを設定してください。

![step_00_prepro_ssh_12_troubleshoot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/632fb855-f969-11c5-638d-a08ba0b83af8.png)

## コンテナへのアタッチ
サーバへのssh接続が完了したので、次はコンテナへアタッチします。
以下の操作はサーバへssh接続したVSCodeにて行ってください。

1. 「リモートエクスプローラ」のアイコンをクリックします。
![step_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/15668405-2c40-ee80-cd97-312122cf893d.png)

1. 表示されたドロップダウンリストをクリックします。
![step_03-0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/e6a3b6dd-731c-1a87-f51b-efbf05fba0e2.png)

1. ドロップダウンリストの「開発コンテナー」をクリックします。
![step_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/394f7f9e-48ab-740e-81a6-ac6b0dac9891.png)

1. 下図のように表示されるため、「更新」をクリックする
![step_05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/e9fc72b9-026f-931e-493e-e32e98e86b83.png)

1. パスワードの入力を求められるため、接続先サーバへのログインパスワードを入力してください。
![step_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/cc7ee43d-2302-ab08-2d93-d1fca9c42e96.png)

1. 接続可能なコンテナのリストが表示されるため、任意のコンテナ（今回の場合、test_container）を選択し、右クリックします。「現在のウィンドウでアタッチする」か「新しいウィンドウでアタッチする」を選択してクリックしてください。
![step_07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/a26fae57-bf23-16b8-ce05-5100c2e43936.png)

    このとき、次のように警告のダイアログが表示される場合がありますが、ダイアログに記載のとおり**アタッチするコンテナが信頼できる事を確認したうえで「了解」をクリックするようにしてください。**
    ![step_07_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/b8ace3fc-d0d9-3d9a-72bc-6f28be785936.png)

1. 再度パスワード入力を求められるため、接続先サーバへのログインパスワードを入力してください。
![step_08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/1444a5b0-7c29-8a5d-818e-ed05236e418f.png)

1. 暫く待つとコンテナへの接続が完了します。
右下にカーソルをあてると接続先コンテナの情報を確認できます。
![step_09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452276/81638d1c-c90c-98da-5349-2f33ed4b0766.png)

以降は通常のPC内の開発環境と同様に扱う事ができます。
例えばPython開発を行いたい場合は、コンテナにアタッチ後、VSCodeの拡張機能「Python」をインストールするなどを実施してください。

## 免責事項
本記事の掲載にあたり、記事内容について精査・確認をしておりますが、ご利用による損害などが発生したとしても、筆者および筆者の所属組織は責任を負うものではありません。
自己責任の範疇でご利用ください。

##
今回の記事は以上になります。
最後まで読んでいただき、ありがとうございました！  

今後も機械学習の活用を始め、開発環境やシミュレーションなど幅広く技術情報発信をしていく予定です！  
最後になりますが、本記事の内容に誤りなどあれば、コメントにてご教授お願いいたします。