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

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

## wsl2 Ubuntu（マイクロソフトストアから入れる`Ubuntu 18.04` や `Ubuntu 20.04` のこと）について

まず、そのUbuntuがややこしい

- wsl2 Ubuntu とは、https://docs.microsoft.com/ja-jp/windows/wsl/install-win10  にある、「手順 6 - 選択した Linux ディストリビューションをインストールする」の入れる `Ubuntu 18.04 LTS | Ubuntu 20.04 LTS` のこと

- 誤った認識
    - wsl2を動かすために wsl2 Ubuntuを使う ← 違う、wsl2にUbuntuが必要なわけではない。
    - wsl2の上に乗ってる wsl2 Ubuntuで、そのUbuntuが Docker Desktop for Windows を動かす Ubuntu　←△（確かにwsl2の上でUbuntuは動く、docker Desktop でコンテナを動かすときに、Ubuntu設定はあるけど... , Docker DesktopはWindowsで動き、Docker Desktopとしてバックグラウンドではwsl2使う or docker-desktop自身を使う　それぞれの設定があるのでさらに認識誤りする）

- 不明
    - wsl2 がなくても マイクロソフトストアのUbuntuはインストールできて使える？（不明、やったことない）、おそらく入らないと思うけど
- 正しい
    - wsl2 入れて、wsl2 Ubuntu 入れなくても、Docker Desktop for Windows は動く　← ◯
        - wsl2での wsl -l -v で、dockerが表示される通り、docker側でよしなにやってくれ Docker Desktop for Windows によってLinuxコンテナは動きます
        - wsl2上にマイクロソフトストアからのUbuntuがインストールできず、wsl2 + Docker Desktopでコンテナ使っていたので、そういった構成でも良い
- 正しそうな認識
    - wsl2 Ubuntu は docker hub 等にある Ubuntuではない
    - wsl2 Ubuntu は dockerコンテナのLinux（alpine等）ではない
    - wsl2 Ubuntu は コンテナではない（コンテナではなく、windows上で動くLinuxディストリビューションの１つ。Windows内にインストールするけどコンテナビルドをしたわけではない）
    - docker エンジンのバックエンド裏側として、wsl2を使う
        - dockerエンジンのバックエンドにwsl2を使う時のdockerのwsl2はUbuntuではなく、wsl2である
        - dockerエンジンのバックエンド裏側は、wsl2を使わずにdocker-desktopをバックエンド裏側に使うこともできる

### wsl2単独で考える、ややこしさを増やすものはDocker Desktopが登場するところ
- wsl2 と Docker Desktop for windows  の２つのうち、dockerはいったん切り離して考える
- wsl2 単独では何も意味はなし、そうゆうアーキテクチャ・仕組みがWindows 10 上にあるというだけ
- wsl2 + マイクロソフトストアにあるLinuxディストリビューションのUbuntuが動く
    - まさに、この状態が windowsの中でUbuntuが動いてる。
- 誤解を招くかもしれないが、wsl2は 
    - Windows 10 Pro のwsl2が出る前の Hyper-V 相当
    - wsl2は、VirtualBox の代わり
    - wsl2は、VMWare（VMware Workstation Player）の代わり
    - wsl2は、Macで例えるならば、Parallels Desktop
- この記事書いてて、しっくりきたのは Mac上でWindowsを動かすParallels がwsl2に最も近しいと思った、Mac操作しながらWindows10側のアプリをMac上でシームレスに動かせる、Macの画面上にリモート画面でなくソフトウェアの画面が表示される。あたかもMacでWindowsのアプリを動かしているかのような感覚。

### wsl2入れて、Ubuntu入れて何するの？

そう、そうなんです。Ubuntu 内でやる作業ってあまりない。例えば、どんなことがありえるのか

- Ubuntu内に、Ubuntu向けのdockerエンジンを入れることで、Ubuntuのdockerが動かせる、Windowsのdockerではないため、より実践に近づくし、比較的速い、メモリ使う量が減らせる。
    - Ubuntuのdockerを入れる例、https://dzone.com/articles/wsl2-for-dockerized-net-core-application-subhankar
- Ubuntu内でWindows側のディレクトリを参照して、grep や sed 等のLinux系のコマンド使う
    - PowerShellで代替できそうだけど、・・・
- Ubuntu好きで、Ubuntuをメインに作業するとか、Ubuntuの操作はWindows Terminal入れて使います.
    - [WSL2+ubuntu20.04: GUI化して使う方法](https://qiita.com/atomyah/items/887a5185ec9a8206c7c4) のように、Windows内でUbuntuにリモート接続してUbuntuの画面操作する
    - [アプリで Linux GUI アプリを実行Linux 用 Windows サブシステム (プレビュー)](https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
        - Windows アプリから Linux アプリを起動スタート メニュー
        - Linux アプリを Windows タスク バーにピン留めする
        - Alt タブを使用して Linux アプリと Windows アプリを切り替える
        - Windows アプリと Linux アプリ間で切り取り + 貼り付け

#### wsl2 Ubuntu不要なケース
- WindowsでDocker コンテナ使いたいならば、wsl2 か wsl1 のみで wsl2 Ubuntuはなくても良い（前述の通り、Docker Desktop for Windowsがよしなにやってくれる。後述でも、wsl2とdocker Desktop について記載しているので参照）
- おそらくMySQLやPostgreSQLのdocker と AWS Fargateに載せるJVMで動くアプリ、Railsアプリ、PHP Laravel、Go などは Ubuntuは使わなくても良い

#### wsl2 のUbuntuへのアクセス、ターミナルとしての接続
1. Windows Terminal を起動し
1. ＋記号での接続先で Ubuntuを選ぶ
    - ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/a17fa9a4-70ff-e4dd-fdd8-529bddad1287.png)
1. 接続したら、Linux系のコマンドが使えます。 
    - `pwd` , `date` , `uname -a` を実行してみた例
    - ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/d02f3bc0-1ab5-aac8-7017-eba13a3e8c8e.png)

#### wsl2 Ubuntu 内から Windows側を参照した場合

```shell
/mnt/ドライブ/ディレクトリ
```

```shell
CドライブのUsersディレクトリへ 
/mnt/c/Users/

Dドライブへ
/mnt/d/
```

- ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/31e2bab7-4bcc-951c-574a-61f1ab763012.png)


#### WindowsのエクスプローラーからUbuntu内のディレクトリを参照した場合

- パスの指定
 
```bat
    \\wsl$Linuxディストリビューション\ディストリビューション内のパス
```
- ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/fa1d3245-5788-0a2c-dc87-593557dfa9de.png)

- `wsl$` 直下に複数表示されるのは

    ```bat
    >wsl -l -v
      NAME                   STATE           VERSION
    * Ubuntu-20.04           Running         2
      docker-desktop-data    Running         2
      docker-desktop         Running         2
    ```
に対応した分だけディストリビューションが表示される

- Ubuntu内の `/home/linux/` をWindows側からエクスプローラーで見ると、
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/7decc437-21b9-0123-c373-f013b507fdf6.png)

## VSCode で wsl2 Ubuntuへのアクセス、ファイル表示や編集

1. Windwos Terminal を起動
1. Ubuntu 内に接続し、`code .` を入力すると
1. Ubuntu内にVSCodeに必要なものがインストールされる

その後に、

-Windows にインストールした VS Code で 左下の><をクリックして、`Reopen Folder in WSL`で開く（Ubuntu内のファイルをUbuntu内に接続したときと同じ状態で開く）。VSCodeの画面左下、「WSL:Ubuntu-20.04」で表示される、VSCodeでUbuntu内のファイルやディレクトリが見え、編集できる。Ubuntuの操作をVSCodeでできる。

<!-- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/d81b096b-04c8-9c96-43a2-4589bef60ceb.png) -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/4ad24632-f229-97ae-7fa9-f79d7ebbedb9.png)


- VS Code で 左下の><をクリックして、`Reopen Folder Locally`（`Reopen Folder In Windows`）で開くと（Windows側のパスとして、WindowsからUbuntu内を参照している、Windowsのエクスプローラーから参照するのと同じ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/92b4fa8c-2713-6e17-e9da-625a1ee816c4.png)


### 参考、wsl2 Ubuntu で、VSCodeを使う
公式の説明 https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode