VSCodeで始めるDockerコンテナ上にJava開発環境を構築（①WSL環境準備編）

# 目的
Visual Studio Code（以降、VSCodeで記載）、WSL2を使用してDocker環境上に以下のコンテナを作成するために実施した内容を残しておきたいと思います。
Windows環境を汚さず、繰り返し構築可能なJava開発環境の構築を目指します。
※記事は2回に分け、今回は①として「WSL環境準備編」となります。

# Java開発環境（全2回）の概要
* WSL2上のUbuntuにDockerを導入
* VSCodeのDevContainer機能を利用し、Dockerfileやdocker-compose.ymlによるコンテナ作成
* コンテナではSDKMANを導入（複数のJavaのバージョンを切り替え、Mavenを利用）

# 第１回「①WSL環境準備編」における記載範囲
* WSL2：LinuxディストリビューションとしてUbuntuを導入
* VSCodeからDevContainer機能を用いてディストリビューション（Ubuntu）にアクセス

# 1. 前提条件
- エディション：Windows10 Pro
- 環境構築時に使用したソフトウェアやバージョンは以下の通り。

|#|os/software|version|用途|
|--:|:----|----:|:----|
|1|Visual Studio Code|1.93.0|統合開発環境（IDE）として利用<br>DevContainer機能を利用し、コンテナ構築|
|2|WSL|2|ディストリビューションとしてUbuntuを導入|
|3|Ubuntu|22.04|Dockerを導入し、Java開発環境を構築|
|4|SDKMAN|script: 5.18.2<br>native: 0.4.6|JVMベース言語のバージョン管理ツールとして使用|
|5|Java|11.0.24-tem<br>17.0.12-tem<br>21.0.4-tem|Java11、17、21を切り替えて使用|
|6|Maven|3.9.8|Mavenプロジェクトの構築、ビルドで使用|

- 構築する環境はproxyを使用するための設定をしていますが、全ての環境におけるベストプラクティスとは限りません。
各自で利用する環境に合わせて、proxy設定内容が適切かご確認の上ご参考にして頂ければと思います。

# 2. WSL2環境準備
## 2.1. WSLバージョン確認

※以下、バージョンを確認しておきます。
　ver1でない場合、「2.2. WSLバージョンアップ」は読み飛ばし頂いて問題ありません。
```powershell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         1
```

## 2.2. WSLバージョンアップ
以下、手順 3～5を実施してWSL2にバージョンアップを行う。

[以前のバージョンの WSL の手動インストール手順](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)

### 手順 3: 仮想マシンの機能を有効にする
```powershell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

### 手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする
```powershell
PS C:\WINDOWS\system32> wsl.exe --update
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム  はインストールされました。
```

### 手順 5 - WSL 2 を既定のバージョンとして設定する
```powershell
wsl --set-default-version 2
```

### 注意事項
WSLバージョンが"2"であったとしても、「wsl --update」は１回は実行しておいた方が良いと思います。
（systemdコマンドが使えない状態でハマったこともあるため）

```bash
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
```
 
# 3. WSL2環境構築
## 3.1. Ubuntu22.04の導入
Microsoft Storeからダウンロードおよびインストール手順は、以下のサイトに分かりやすく記載されているため、そちらを参照ください。
[Ubunt22.04](https://news.mynavi.jp/techplus/article/20220430-2330411/)

## 3.2. Dockerの導入
Dockerのインストールについては、以下コマンドを実行します。
```PowerShell
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
```
備忘として、参考にさせて頂いたDocker Docs公式サイトも記載しておきます。
[Docker Docs] Install Docker Engine on Ubuntu
[Install using the convenience script](https://docs.docker.com/engine/install/ubuntu/)

コマンド実行時のログ内容については、参考情報として以下に記載。
<details>
<summary>実行ログ</summary>

```PowerShell
ubuntu@DESKTOP-BMGUJA8:~$ curl -fsSL https://get.docker.com -o get-docker.sh
ubuntu@DESKTOP-BMGUJA8:~$ sudo sh ./get-docker.sh
[sudo] password for ubuntu: 
# Executing docker install script, commit: 6d9743e9656cc56f699a64800b098d5ea5a60020

WSL DETECTED: We recommend using Docker Desktop for Windows.
Please get Docker Desktop from https://www.docker.com/products/docker-desktop/


You may press Ctrl+C now to abort this script.
+ sleep 20
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c install -m 0755 -d /etc/apt/keyrings
+ sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" -o /etc/apt/keyrings/docker.asc
+ sh -c chmod a+r /etc/apt/keyrings/docker.asc
+ sh -c echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin >/dev/null
+ sh -c docker version
Client: Docker Engine - Community
 Version:           27.0.3
 API version:       1.46
 Go version:        go1.21.11
 Git commit:        7d4bcd8
 Built:             Sat Jun 29 00:02:33 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.0.3
  API version:      1.46 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       662f78c
  Built:            Sat Jun 29 00:02:33 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.18
  GitCommit:        ae71819c4f5e67bb4d5ae76a6b735f29cc25774e
 runc:
  Version:          1.7.18
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

================================================================================

To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:

    dockerd-rootless-setuptool.sh install

Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.


To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent
         to root access on the host. Refer to the 'Docker daemon attack surface'
         documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================
```
</details>

# 4. VSCodeからディストリビューション（Ubuntu）にアクセス
## 4.1. WSLに接続
* VSCodeにて"><"を選択し、「Connect to WSL using Distro...を選択」を選択

![4.1_①、②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/71bad74c-de1f-5724-85bf-be0878f57b75.png)

* Fileから「Open Folder」を選択し、カレントディレクトリを選択

![4.1_③.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/5b986943-9f5b-dd42-b1f2-4c083e304066.png)

## 4.2. Dockerのバージョン確認
* Dockerがインストールできているか、バージョンを確認してみる。

![4.2_①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/95eff364-aa54-ca69-0cc1-c8f8de0c0dbf.png)

Dockerバージョン確認コマンド
```terminal
docker version
```

<details>
<summary>実行ログ</summary>

```terminal
ubuntu@DESKTOP-BMGUJA8:~/project$ docker version
Client: Docker Engine - Community
 Version:           27.0.3
 API version:       1.46
 Go version:        go1.21.11
 Git commit:        7d4bcd8
 Built:             Sat Jun 29 00:02:33 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.0.3
  API version:      1.46 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       662f78c
  Built:            Sat Jun 29 00:02:33 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.18
  GitCommit:        ae71819c4f5e67bb4d5ae76a6b735f29cc25774e
 runc:
  Version:          1.7.18
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```
</details>

# 次回の予定
Dockerfile、docker-compose.ymlを作成し、Java開発環境を構築する記事を投稿予定。