WSL2 + VSCode + Docker 開発環境


## 概要

Windows で Linux の環境を構築できる、WSL2 (Windows Subsystem for Linux ver2) と、Visual Studio Code(以下 VSCode)、 Docker を使って、モダンな開発環境を構築します。

## 本記事の対象の読者

- Windows での開発者
- Docker での開発を行っている人、これから行ってみたい人
- cmd とかやってらんない。bash 使わせろ、な人

## WSL2 のインストール

WSL2 は、Windows10 version 2004 (May 2020 Update) 以降でないと入れられませんでしたが、2020/8 から 1903/1908 でも動作できるようになりました。

> [「WSL 2」が「Windows 10 バージョン 1903/1909」でも利用可能に ～ Microsoft が旧 OS に移植 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1272017.html)

公式の記事も参考にしてください。

https://docs.microsoft.com/ja-jp/windows/wsl/install

以下は、1903/1908/2004 共通の作業です。

1. コントロールパネルを開きます。

    ![2020-09-11_09h44_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/9c09f1bb-4d34-b14d-b9cc-9d884e4c495b.png)


1. 「Windows の機能を有効化または無効化」を開きます。

    ![2020-09-11_09h46_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/0ac675c3-b4a6-185e-9601-0c2b87762a79.png)


1. 「Linux 用 Windows サブシステム」と「仮想マシンプラットフォーム」にチェックを入れ、OK ボタンを押します。

    ![2020-09-11_09h48_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/35d43471-228c-bece-f18c-8f716c88f6e4.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/f143748d-1e77-a6d4-6a15-97f151f0e129.png)


1. インストールが完了したら、再起動する必要があります。

    これは、Linux が動作する環境だけのセットアップで、これに CentOS や Ubuntu ディストリビューションを入れる必要があります。

1. コマンドプロンプトで 既定のバージョンを '2' にします。

```shell
> wsl --set-default-version 2
```

## Ubuntu の導入

Powershell を起動して、下記コマンドを実行します。Ubuntu のダウンロードとインストールが実行されます。

```shell
> wsl --install -d ubuntu
```

完了したら、Ubuntu のターミナルが起動します。はじめにUbuntu上でのユーザーとパスワードを設定する必要があるので、入力してください。

```shell
Installing, this may take a few minutes...
erPlease create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ebihara 　　<- ユーザー名
New password: 　　　<- パスワード（入力しても表示されません）
Retype new password: 　　　<- 確認のため、同じパスワードを入れる
passwd: password updated successfully
Installation successful!
```

## Visual Studio Code を WSL へ接続する

VSCode が入っていない場合は、下記から入れてください。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

VSCode を起動して、拡張機能から、wsl で検索します。

(下記画像では、すでにインストールされています)

![2020-09-11_10h06_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/3f635835-e1d6-dc93-bb3a-bbbc29be7d3c.png)

インストールしたら、一旦 VSCode を閉じます。

## Ubuntu から Visual Studio Code を起動する

Windows のスタートメニューから、[Ubuntu]を選択するとターミナルが起動します。

ここに、空のディレクトリを作って、そこで VSCode を起動します。

```bash
mkdir sample
cd sample
code .
```

VSCode が起動します。ターミナルを起動（ctrl+@, US キーボードの場合は、ctrl+`）して、シェルが bash であることを確認します。

![2020-09-30_14h57_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263961/f09f3638-0849-748b-2596-268ab4451911.png)

既存の git のプロジェクトを VSCode から開きたい場合は、git clone コマンドで、ダウンロードする必要があります。

また、後述しますが、Ubuntu のファイルもエクスプローラで参照できるので、

:::note warn
注意!
Ubuntu から、`/mnt/c/` にアクセスすることで、Windows のファイルにもアクセスできます。
しかし、この下で VSCode の Remote 機能で起動するのは、パフォーマンスが悪くなったり、ファイルの監視ができないため、ファイルを追加変更したときなどの動作に問題が発生します。
VSCode の Remote 機能 を利用する場合は、ホームディレクトリ(`cd ~`でアクセスできる)以下に作成しましょう。
:::

## エクスプローラからのアクセス

エクスプローラから、`\\wsl$\Ubuntu\` にアクセスすることで、Ubuntu のファイルを参照することができます。

Tortoises git も引き続き使うことができます。

## WSL2 に Docker をインストールする

[Docker Desktop](https://www.docker.com/products/docker-desktop/) をインストールすることでも良いのですが、個人利用またはスモールビジネス向けなど以外は有料化したので、Ubuntu 版の Docker を入れることとします。

参考: [Install Docker Engine on Ubuntu | Docker Documentation](https://docs.docker.com/engine/install/ubuntu/)

sudo で、管理者権限でのコマンドを実行します。パスワードを聞かれたら、WSL で Ubuntu をインストールしたときに設定したパスワードを入れてください。

##### apt のパッケージ一覧のアップデート
```shell
$ sudo apt update
```
##### 必要なライブラリの導入
下記ライブラリが必要ですが、既に入っていると思います。ですが、一応念の為実行しておきます。
```shell
$ sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```
##### Docker の証明書をダウンロードして登録する
apt で Docker のサイトからパッケージを入手するのに必要な証明書を導入します。
```shell
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```
##### apt に Docker のリポジトリを追加する
```shell
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
##### apt を利用して、Dockerをインストールする
```shell
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
```
##### docker を起動する。
```shell
$ sudo service docker start
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
（以下略）
```

### sudo がなくても Docker コマンドが実行できるようにする
docker の各コマンドを実行するには、管理者権限が必要です。自分のユーザーを linux の docker グループに追加することで、sudo なしで実行できるようになります。
```shell
$ sudo gpasswd -a $USER docker
```
docker を起動している場合は、dockerの再起動とユーザーの再ログインが必要です。
```shell
$ sudo service docker restart
```
ubuntu のウィンドウを閉じて、再度開きましょう。

sudoなしで実行
```shell
$ docker run hello-world
```

## 最後に

システム開発では、Bash などのシェルが便利で、開発環境として macOS を利用することが多いです。

WSL2 を利用することで、Windows内に Linux 環境が容易に準備でき、Hyper-V等を利用するよりも、パフォーマンス性能が高いです。
さらに、WSLでは 開発プロジェクトに合わせて環境を切り替えることもできます。

今まで、Windowsだけを使っていた方には、Linux の知識を学ぶ必要がありますが、開発に従事するとLinuxとは離れられないことも多いでしょう。これを学習のきっかけにしてもよいのではないでしょうか？