WSL2の理解度を深める、Ubuntu と Docker Desktop とコンテナ の知見（その３／４）

その１　https://qiita.com/ssugimoto/items/668d33e4b151933b2e19
その２　https://qiita.com/ssugimoto/items/1b19083f5045e190e4ae
その３　この記事
その４　https://qiita.com/ssugimoto/items/a14262fa0bc8f60efee8

## Docker Desktop for Windows と wsl2 Ubuntuを連携して使う（wsl2 Ubuntu 内のコンテナを動かす）

- wslconfigの設定（以下の wsl -l -v で Ubuntuに * マークが付くようにする）

```bat
>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
```

- wslの設定変更例
 
```bat
>wslconfig /setdefault  Ubuntu-20.04

>wslconfig /list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
docker-desktop-data
docker-desktop

変更したら確認
>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
```

- Docker desktop 側の設定
    - 設定例、wsl2 Ubuntu(Linuxディストリビューション)で Docker desktop for windowsを使ってコンテナを起動する場合。言い換えると、UbuntuのDockerは使わずにWindowsにインストールしたDockerのバックグラウンドにwsl2 Ubuntuを使う
    - Docker desktop の `Settings` > `Resources` -> `WSL Integration` で  `Enable integration with my default WSL distro`  はチェックON  
    - 表示されているLinuxディストリビューションで、`Ubuntu-XX` のどれか１つをチェックON
![11-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/c6b38ced-4703-922e-22bd-0cb15af580c3.png)
    - 「Apply & Restart」を押す
- 上記の設定により、wsl2 Ubuntuからwindows側にインストールした docker-desktop for windowsにつながる（連携される）
- wsl2 Ubuntu内からdockerコマンドが使えるので、以下のコマンドが実行できる

```shell
$ docker images

$ docker ps

$ docker rm imageID
等
```

#### 設定の参考

- https://codeaid.jp/blog/docker-windowswsl2/ 
    `設定画面で「Use the WSL2 based engine」が有効になっていることを確認します。` あたりから参考に
- https://code.visualstudio.com/blogs/2020/03/02/docker-in-wsl2
    - `Once installed, Docker will recognize that you have WSL installed and prompt to enable WSL integration. You want to Enable WSL integration for this tutorial.    If you have multiple Linux distros, make sure you only have WSL integration turned on for the correct one in your Docker settings:` の説明あたり


### wsl2 Ubuntu + Docker Desktop for Windows でコンテナを動かすのは
以下のどちらにも対応できる

- windowsのディレクトリに置いたコンテナ（Docker ファイルや docker-compose.yml）やリモートコンテナ（.devcontainer）
    - リモートコンテナの例 `C:\work\mysystem\.devcontainer`
    - docker-composeの例 `D:\work\mysystem\docker-compose.yml`
    - <b>wsl2ではWindows側をマウントすると激遅なので注意</b>
- wsl2のUbuntu内のディレクトリに置いたコンテナやリモートコンテナ（この記事の後述参照）
    - リモートコンテナの例 `\\wsl$\Ubuntu-20.04\home\linux\mysystem\.devcontainer`
    - docker-composeの例 `\\wsl$\Ubuntu-20.04\home\linux\mysystem\docker-compose.yml`



## wsl2 Ubuntu内に リモートコンテナ用のコンテナを置く場合

- 環境イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/2f2bea5a-2655-8f0c-df81-ce9c9ed065d2.png)
    - `/home/linux/リモートコンテナのディレクトリ` が wsl2 Ubuntu内のローカルディレクトリで、そこにリモートコンテナのファイルを置く
    - VSCode Remote Container機能を使い、wsl2 Ubuntuへの接続やwsl2 Ubuntu内のファイル編集
    - Docker Desktop for Windows が Ubuntu内にあるリモートコンテナを動かす
    - リモートコンテナからはUbuntu内のローカルディレクトリ・ファイルを使う

### 実際の例
前段の情報をすっ飛ばしてしまいますが（https://dev.classmethod.jp/articles/vscode-container-connect/ を参考にしても良いです）、コンテナをUbuntu内で実行する場合のVSCodeからの接続例です。

- リモートコンテナは、https://github.com/toricls/aws-amplify-sns-workshop-in-vscode のリポジトリでも良いです、そのリポジトリはAmplifyのworkshop向けのリモートコンテナです。
- Ubuntu内へのコンテナ用のファイルの配布は、Windwosのエクスプローラーから実施しても良いし、UbuntuからGitコマンド等を使ってファイルをダウンロードしても どちらでも良いです

1. リモートコンテナのファイルをwsl2 Ubuntu内に置く
1. Windows側の VS Codeを開き、 、左下の><をクリックして、`Reopen Folder in WSL`で開いた後に、`Reopen in container`で開く
1. すると、コンテナのビルドがされていない場合は、ビルドされコンテナが起動する。ビルドされた後は、コンテナ起動していなければコンテナが自動起動する。

- リモートコンテナを接続して表示している画面例 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/f0eaf2a8-ecde-7c10-2a51-6d5bb5faf6b3.png)

### メリットなどの説明
- Ubuntu内のディレクトリを使うメリット
    - Ubuntu内のコンテナが壊れても、コンテナのリビルドしても Ubuntuを消さない・Ubuntuが動く限りファイルは残っている
    - `\\wsl$\Ubuntu-20.04\home\linux\sugimoto-local-develop-container` のように、Windows側からファイルアクセスできる

- Ubuntu内に置いたコンテナ＋Ubuntu内のディレクトリにソース vs  Windowsに置いたコンテナ＋コンテナ内のディレクトリ
    - ディスクアクセスはあまり変わらない。若干Windowsに置いたコンテナの方が速く感じるがキャッシュの影響かもしれない
    - VSCodeのリモートコンテナを使えば違いはない
    - Windowsに置いたコンテナはコンテナ消したり、コンテナリビルドするとファイルが消えてしまうので注意。コンテナ内のファイルをたまにホスト側にコピーするshellを実行すればファイル等のバックアップはできる。

- コンテナから、Windows側のマウントパス `/mnt/c/usr` などのディレクトリが使えなかった（コンテナビルドでエラーになる。wsl2のubuntu側からみたパスを設定した）。設定方法が悪いだけかもしれない。Ubuntu内のディレクトリを使うのであれば、問題なし。
- 以下、動かず、エラーになる

```devcontainer.json
    "mounts": [
                "source=/mnt/c/usr/20210500/sugimoto-local-develop-container/amplify,target=/root/amplify,type=bind,consistency=cached",
    ],
```