VSCodeでリモートサーバのDockerコンテナに引きこもる for Windows10

# 背景

TwitterのTLに流れてきた[VS Code Meetup #6](https://vscode.connpass.com/event/176699/)をなんとなく見ていたんですが、
Shion Tanakaさん(@tnk4on)の発表に触発されました。
[Remote-Containersの接続先ホストにFedora CoreOSを使う](https://speakerdeck.com/tnk4on/using-fedora-coreos-for-remote-containers)


# やりたいこと
- ローカルのWindowsマシンからリモートサーバにあるDockerコンテナへアクセスしたい
- Docker for Windows + VSCodeのようにVSCodeで直接コンテナにアタッチしたい(引きこもりたい)


# 検証環境
- リモートサーバ
    - Ubuntu 20.04 LTS(ESXi上のVM)
    - Docker version 19.03.12, build 48a66213fe
    - dockeradminというdockerコマンドを実行できるユーザを作成済み
- ローカルマシン
    - Windows10 Pro 2004
    - VSCode 1.47.3(Extentionは以下をインストール)
        - [Remote-SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
        - [Remote-Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
        - [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
    - Docker for Windows 19.3.08  
    (ローカルマシンでDockerコンテナを動かす必要はないのですが、CLIコマンドを実行するために必要。Homeの場合は[後述の手順](#Windows10-Homeでもリモートサーバのコンテナに引きこもりたいあなたへ)を確認ください)

## リモートサーバへのDockerのインストール
Docker公式の[手順](https://docs.docker.com/engine/install/ubuntu/)にてdocker-ceをインストールしてます(Ubuntuのdocker.ioじゃないです)
特記事項はないので省略
あと、多分ですけどリモートサーバのDockerとローカルマシンのDocker CLIはバージョンがあってるほうがよさげ

## SSH鍵の用意
今回VSCodeからリモートサーバ側のDockerへのアクセスにはSSHを利用します。
パスワード認証だと、VSCodeのDocker拡張がうまく動いてくれないので、鍵認証する必要があります。

#### 1. キーペアの作成 
クライアントで作るべきなんですがめんどくさいのでリモート側で作成しました・・・

~~~
# 鍵の作成
dockeradmin@container-engine:~$ ssh-keygen -t rsa -b 4096
# 鍵のコピー
dockeradmin@container-engine:~$ ssh-copy-id dockeradmin@localhost
~~~
パスフレーズは入力してません(パスフレーズつけるとうまくいかなかった？)

#### 2. 秘密鍵(id_rsa)をクライアントPCの.sshフォルダにコピー
必ず**C:\Users\\{username}\\.ssh** 配下に格納すること。
いくらか確認したのですが他のパスだとうまくいかない

#### 3. ssh-agentに鍵を登録する
これやらないと駄目でした
やってないとVSCodeさんから「これやってみ？」って以下のURL教えてくれます
https://code.visualstudio.com/docs/containers/ssh
>Windows (OpenSSH): The latest version(s) of Windows 10 include OpenSSH by default. There is a Windows service, ssh-agent that is disabled by default, and needs to be re-enabled and set to automatic start. From an admin command prompt, run sc config ssh-agent start=auto and net start ssh-agent. Then, do ssh-add \<keyfile>.

というわけでやります。

```
Microsoft Windows [Version 10.0.19041.388]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>sc config ssh-agent start=auto
[SC] ChangeServiceConfig SUCCESS

C:\WINDOWS\system32>net start ssh-agent
OpenSSH Authentication Agent サービスを開始します.
OpenSSH Authentication Agent サービスは正常に開始されました。

C:\WINDOWS\system32>ssh-add c:\Users\rohisama\.ssh\id_rsa
Identity added: c:\Users\rohisama\.ssh\id_rsa (dockeradmin@container-engine)
```

## VSCodeの設定

#### VSCodeのSettings.jsonを更新
以下を追加するだけです。追加したらVSCodeを再起動しましょう。
IPの部分はご自身の環境にあわせてどうぞ

```
"docker.host": "ssh://dockeradmin@192.168.0.66",
```

# 本番
確認の為、なんでもいいのでリモートサーバ側でDockerのコンテナを動かしておきます。
今回はなんかの練習用に作った mysql-trainingというイメージのコンテナを動かしてます(元イメージはmysql:8)

### 1. VSCode起動
コンテナを起動したらローカルマシンのVSCodeを起動します。
起動したらDockerのクジラアイコンをクリック
成功している場合、VSCode上でリモートサーバ上で動いているコンテナの状態が確認できると思います(画像左上)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381447/b8a4e431-f40a-b226-7c2e-6cbd82022768.png)

### 2. コンテナにアタッチ
いよいよVSCodeからリモートサーバで動いているコンテナにアタッチします・・・
起動しているコンテナを右クリック→Attach Visual Studio Codeと選択(画像参照)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381447/dcae1c4d-83d1-8f52-4607-90121fb6b835.png)

成功すると新しいウインドウが開くはず
こんな感じ。開いたウィンドウの左下にアタッチ中のコンテナの情報が出ているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381447/fa58e262-4660-6d40-a001-21adb9c16bf9.png)

VSCodeからアタッチできるととても便利で、VSCodeからターミナルを開いてコマンド実行なんてお手の物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381447/d66f4f50-6ebf-bc9e-6d53-0be240b01ec3.png)

コンテナの中にあるファイルをVSCodeで編集するなんてことも可能なんです!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381447/91d13e76-5f61-b944-d323-34b4a5d8c922.png)

## 一旦終わり(Windows10 Homeの人は続きも見てください)
需要があるかはわかりませんが、応用でクラウド上のコンテナに入るなんてことも可能なんじゃないだろうか。

なお筆者は職業上Javaやったりしてるんですが、VSCodeでDockerコンテナに引きこもれる事が分かってからはローカルマシンにはJDKはインストールせずOpenJdkのコンテナに開発用のソースコード一式置いてからのVSCodeで引きこもって開発してます(Java系のExtentionをインストールすれば割と普通に開発できます)

## Windows10 Homeでもリモートサーバのコンテナに引きこもりたいあなたへ
本記事は内部的にDocker CLI(dockerコマンド)を使用している関係で、WindowsにDocker for Windowsをインストールする必要があります。
そのため現状Docker for Windowsがインストール不可であるWindows10 Homeの場合、dockerコマンドが実行できません。
※Insider Preview版だとWSL2使えるのでワンチャンインストール可能なのかもですが未調査です

手元にWindows10 HomeなタブレットPCがあったので確認していたのですが、結果としてはDocker CLIの導入自体は可能でアタッチも問題なく可能なのですが若干の問題があります。
以下の方法を試しました。

### 古いDocker-CEのバイナリから入手(当環境では無理だった)
google様のお知恵を拝借していると以下の[記事](https://yamanxworld.blogspot.com/2019/01/windows-10-docker-cli-21.html)がヒット
以下から古いバージョンのDocker-CEのバイナリが入手できます
https://download.docker.com/win/static/stable/x86_64/

docker-17.09.0-ce.zipをDLし解凍するとdocker.exeがあるので、解凍したパスを環境変数のPathに登録することでdockerコマンドが利用可能になります。
ただし、バージョンが古いためかVSCodeからのアタッチは不可でした
(おそらくDocker CLIがSSHアクセスに対応していない？)

### Docker for WindowsがインストールされているPCからdocker.exeを持ってくる
デフォルトでは**C:\Program Files\Docker\Docker\resources\bin**にdocker.exeがあるので、Windows10 Homeのマシンの任意のパスにコピーします。
環境変数のPathに登録することでdockerコマンドが利用可能となりVSCodeからのアタッチも可能でした。
ただし、この方法にはWindows10 Proが必要になるためあまり現実的ではないかもしれません。
(個別に提供依頼があれば提供できますが・・・していいのか？)


## 終わり
自身の個人用マシンはWindows10 Proなので、こんな事しなくてもVSCodeでコンテナ内部にアタッチできたりとかなり便利に使えてはいましたが、常にDocker起動していたいわけでもなく、いっそサーバ(ESXi)のVMの一つをコンテナ専用にしてそっちで開発も運用もできたらいいなぁと思い色々調べながら今回ようやく出来たのですが、ゴールに至るまでにズバリな回答を得られなかったので今回の記事作成と相成りました。
どれほどの需要があるかわかりませんが、皆様のコンテナ引きこもり生活の一助となれば幸いです。