【docker context】〜VScodeからリモート環境のdocker内にアクセスする方法〜

# はじめに
VScodeを用いてリモート環境内のdocker環境にアクセスします。（接続のイメージは図の通り。）
私はこの方法を知らずこれまでjupyter-labで開発を行ってきましたが、pyファイルの修正やweb系のコード編集が非常に困難でした。。（docker contextを使うだけで簡単に実現できるとは。。）
非常に役に立つ方法ですので、皆さんもぜひ試してみてください！

参考になったと思った方はぜひLGTMいただけると幸いですm(_ _)m

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/d37d3fbf-60fe-af6b-9473-1eb493435881.png)


# 目次
1. ssh接続設定
2. docker contextの設定
3. リモート内のdockerへの接続
4. ローカル内のdockerへ戻る


#1. ssh接続設定 

クライアント側で、ssh接続条件を設定ファイルに記入する

```:~/.ssh/config
Host home-ubuntu
  HostName home-ubuntu.mydns.jp
  IdentityFile ~/.ssh/home_ubuntu
  User shota
  Port 5504
  TCPKeepAlive yes
  IdentitiesOnly yes
```

※ sshサーバー構築から秘密鍵の設定を行う場合は、以下URL参照
https://qiita.com/s-inoue-git/items/fdd7aac2996297424a1f


#2. docker contextの設定

[docker context](https://matsuand.github.io/docs.docker.jp.onthefly/engine/context/working-with-contexts/)とは？（以下ドキュメントから引用）

>1 つの Docker CLI に対しては、複数のコンテキスト（context）を持たせることができます。 各コンテキストには、さまざまなクラスターやノードの管理に必要となる、エンドポイント情報やセキュリティ情報が含まれています。 docker context コマンドを使うと、そういったコンテキストを簡単に設定したり切り替えたりすることができます。コンテキストの設定を一度行ってしまえば、トップレベルのコマンド docker context use <コンテキスト名> を実行するだけで、コンテキストを簡単に切り替えられるようになります。


以下のコマンドからcontextを作成、切り替えを行います

```bash
# 1. contextの追加 
$ docker context create home-ubuntu --docker "host=ssh://shota@home-ubuntu"
# home-ubuntu
# Successfully created context "home-ubuntu"

# 2. contextの切り替え
$ docker context use home-ubuntu
# home-ubuntu

# 3. contextの確認
$ docker context ls
# NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
# default             moby                Current DOCKER_HOST based configuration   # unix:///var/run/docker.sock                         swarm
# home-ubuntu *       moby
```

dockerコマンドでイメージやコンテナを確認すると、ホスト側のdockerに切り替わっていることがわかる

```bash
$ docker ps
# CONTAINER ID   IMAGE                     COMMAND       CREATED       STATUS       PORTS     NAMES
# 451ead9000bf   tensorflow-from-scratch   "/bin/bash"   2 hours ago   Up 2 hours             tensorflow-from-scratch
```


# 3. リモート内のdockerへの接続

以下2つの拡張をVScodeにインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/c356a8cd-e8f2-c5c6-9952-b4306371e2d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/5e73e1a5-bbf9-ff50-84e4-67f7a1b3c14b.png)

remote接続の拡張アイコンをクリックし、windowマークorフォルダマークをクリックすると、先ほど切り替えたホスト側のdocker conteainerを見ることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/66351293-aa13-7d4f-22d4-514d213ded40.png)
アクセス成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/9b10406b-0e81-0225-611d-719ea548cd2a.png)


#4. ローカル内のdockerへ戻る

使用するdockerをローカルに対象を戻す場合

```bash
$ docker ps
# CONTAINER ID   IMAGE                     COMMAND       CREATED       STATUS       PORTS     NAMES
# 451ead9000bf   tensorflow-from-scratch   "/bin/bash"   2 hours ago   Up 2 hours             tensorflow-from-scratch

# 対象を戻す場合
$docker context use default

$ docker ps -a
#CONTAINER ID   IMAGE            COMMAND   CREATED       STATUS                        PORTS     NAMES
#0b0edc2e9df2   conda-init-env   "bash"    2 hours ago   Exited (255) 44 minutes ago             conda-init-env
#↑異なるcontainerが表示されている
```

以上です！
参考になったと思った方はぜひLGTMいただけると幸いですm(_ _)m