Windows上でLinux(Ubuntu)を起動しdockerサービスを起動する（所要時間30分）

Windows10 or 11 でWSL2を利用してUbuntuを起動し、dockerサービスを起動するまでの
手順を解説します。

## Windowsの機能の有効化

- [コントロールパネル]-[プログラム]-[プログラムと機能]-[Windowsの機能の有効化または無効化]を起動します。
- [Linux用Windowsサブシステム]と[仮想マシンプラットフォームにチェック]を入れ、[OK]ボタンを押します。  
![image](https://user-images.githubusercontent.com/38905609/185772773-0c24c823-d0f7-409a-bfab-6852f0579685.png)
![image](https://user-images.githubusercontent.com/38905609/185772805-a8a11eb1-e698-43cf-9bed-ce77df711c6f.png)

- Windowsを再起動します。  
![image](https://user-images.githubusercontent.com/38905609/185772831-977e83f6-6869-4496-93b1-e46c7df8e1d4.png)

## WSLの初期設定

- WSL2をデフォルトへ設定

```sh
wsl --set-default-version 2
```

- WSLの最新化

```sh
wsl --update
```

## Ubuntu 22.04 LTSの導入

- Microsoft Storeを起動し[Ubuntu 22.04.1 LTS]を検索してインストールします。
![image](https://user-images.githubusercontent.com/38905609/185773107-d5f56dee-a8aa-4799-93d4-cb85e570be57.png)

- アプリの一覧に[Ubuntu 22.04.1 LTS]が表示されるので、起動します。  
![image](https://user-images.githubusercontent.com/38905609/185773146-5fa396c1-623c-4baa-9b0b-25d676ca72b9.png)

- インストールが開始されます。  
![image](https://user-images.githubusercontent.com/38905609/185773186-8b2834f0-a99b-4e11-ab09-73c12296505e.png)
![image](https://user-images.githubusercontent.com/38905609/185773238-961a0d21-6745-40a9-863f-0fc90b4d4e28.png)
![image](https://user-images.githubusercontent.com/38905609/185773339-ba37802c-afc0-4712-b799-8a2e75db3505.png)
![image](https://user-images.githubusercontent.com/38905609/185773374-3f61729c-4b31-424a-b038-d7e46e50405c.png)
![image](https://user-images.githubusercontent.com/38905609/185773391-c0047ba0-b3ff-4c65-ad68-4e856d8df2ae.png)
![image](https://user-images.githubusercontent.com/38905609/185773404-ce8b524e-8d6d-4e45-97e8-155058030450.png)
![image](https://user-images.githubusercontent.com/38905609/185773438-c1ca1ec1-6834-41cd-b4da-7d62e08e437f.png)

- アップデート

```sh
sudo apt update
sudo apt upgrade
```

## ssh サーバの起動

- パスワードログイン設定

```sh
sudo vi /etc/ssh/sshd_config
```

```text
PasswordAuthentication yes
```

- ssh キー情報の生成

```sh
sudo ssh-keygen -A
```

```sh
-->
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
```

- sshサービス起動

```sh
sudo /usr/libexec/wsl-systemd
sudo /usr/libexec/nslogin
sudo systemctl start ssh
```

ここまでの操作でsshサーバが起動します。

- 接続確認  
![image](https://user-images.githubusercontent.com/38905609/184431306-b7f77730-1af5-4960-8a85-8fb8ff5a4f29.png)
![image](https://user-images.githubusercontent.com/38905609/184431376-e2ec5020-e7d3-451f-b8e6-91fc236ef6c8.png)

## dockerのインストール

- リポジトリセットアップ

```sh
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

- Dockerインストール

```sh
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

- 利用ユーザへのdocker権限付与

```sh
sudo usermod -g docker user001
```

- Dockerサービス起動

```sh
sudo systemctl start docker
```

- エラーが発生します。

```text
user001@DESKTOP-A0AE54A:~$ sudo systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.
user001@DESKTOP-A0AE54A:~$ systemctl status docker.service
× docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: failed (Result: exit-code) since Sun 2022-08-21 12:17:51 JST; 9s a>
TriggeredBy: × docker.socket
       Docs: https://docs.docker.com
    Process: 2253 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/contain>
   Main PID: 2253 (code=exited, status=1/FAILURE)

Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Scheduled restart j>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: Stopped Docker Application Containe>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Start request repea>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Failed with result >
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: Failed to start Docker Application >
...skipping...
× docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: failed (Result: exit-code) since Sun 2022-08-21 12:17:51 JST; 9s a>
TriggeredBy: × docker.socket
       Docs: https://docs.docker.com
    Process: 2253 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/contain>
   Main PID: 2253 (code=exited, status=1/FAILURE)

Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Scheduled restart j>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: Stopped Docker Application Containe>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Start request repea>
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: docker.service: Failed with result >
Aug 21 12:17:51 DESKTOP-A0AE54A systemd[1]: Failed to start Docker Application >

```

- エラー回避

```sh
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --config iptables
```

```sh
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).

  Selection    Path                       Priority   Status
------------------------------------------------------------
  0            /usr/sbin/iptables-nft      20        auto mode
* 1            /usr/sbin/iptables-legacy   10        manual mode
  2            /usr/sbin/iptables-nft      20        manual mode

Press  to keep the current choice[*], or type selection number:1
```

- Docker Service起動

```sh
sudo systemctl start docker
```

- Docker service起動確認

```sh
sudo systemctl status docker
```

```text
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: active (running) since Sun 2022-08-21 12:22:53 JST; 2min 54s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2313 (dockerd)
      Tasks: 13
     Memory: 42.5M
     CGroup: /system.slice/docker.service
             mq2313 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/cont>
```

- Docker 起動確認  
※ 一旦ターミナル(teraterm)を閉じてから再接続して実施する必要があります。

```sh
docker run hello-world
```

## AWS CLIのインストール(AWSを使う場合の参考)

```sh
sudo apt-get install -y curl
sudo apt-get install -y unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo aws/install
```

```sh
aws configure
```

```sh
You can now run: /usr/local/bin/aws --version
user001@DESKTOP-A0AE54A:~$ aws configure
AWS Access Key ID [None]: ************************
AWS Secret Access Key [None]: ************************
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

## Docker AWS LOGの利用

以下の手順を実行することで、DockerログをAWS Cloudwatchへ転送できます。

- AWS認証情報をSystemdへ設定

```sh
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo touch /etc/systemd/system/docker.service.d/aws-credentials.conf
```

```sh
sudo vi /etc/systemd/system/docker.service.d/aws-credentials.conf
```

`aws-credentials.conf`

```text
[Service]
Environment="AWS_ACCESS_KEY_ID=<aws_access_key_id>"
Environment="AWS_SECRET_ACCESS_KEY=<aws_secret_access_key>"
```

- Systemd 設定更新

```sh
sudo systemctl daemon-reload
```

- Docker Service再起動

```sh
sudo systemctl restart docker
```

- Docker service起動確認

```sh
sudo systemctl status docker
```

- ログ出力確認

```sh
docker run --log-driver=awslogs --log-opt awslogs-region=ap-northeast-1 --log-opt awslogs-group=/docker/hello-world --log-opt awslogs-create-group=true hello-world
```

- AWS CloudWatch Log に出力されます。
![image](https://user-images.githubusercontent.com/38905609/185775439-245fc4d7-f3de-46dc-81d6-fe6b140efe2c.png)

## Ubuntuの起動／停止／各種コマンド

- 状態確認

```sh
wsl --list --verbose
```

```sh
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
```

- 停止

```sh
wsl --terminate Ubuntu-22.04
```

```sh
wsl --list --verbose
```

```sh
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
```

- Ubuntuの起動

- アプリケーションメニューの`Ubuntu-22.04`のメニューを選択すれることでUbuntuが起動します。
![image](https://user-images.githubusercontent.com/38905609/185773146-5fa396c1-623c-4baa-9b0b-25d676ca72b9.png)

```sh
wsl --list --verbose
```

```sh
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
```

Ubuntuの停止=>起動を実行すると、systemdサービスが停止状態に戻るので
下記コマンドで[systemd]及び[ssh][Docker]サービスを起動します。

```sh
sudo /usr/libexec/wsl-systemd
```

## Ubuntuのアンインストール

**最初からやり直す場合にだけ実施して下さい。**

```sh
wsl --unregister Ubuntu-22.04
```

```sh
登録を解除しています...
```

## 👇参考URL

- [WSL コマンドのインストール](https://docs.microsoft.com/ja-jp/windows/wsl/install#install-wsl-command)
- [Windows Subsystem for Linuxにssh接続する](https://qiita.com/ezmscrap/items/30eaf9531e240c992cf1)
- <https://docs.docker.com/engine/install/ubuntu/>
- [Linux ディストリビューションの登録解除またはアンインストール](https://docs.microsoft.com/ja-jp/windows/wsl/basic-commands#unregister-or-uninstall-a-linux-distribution)
- <https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html>
- <https://www.osarusystem.com/misc/windows11_wsl_ubuntu2204.html>
- <https://level69.net/archives/31296>
- <https://wdullaer.com/blog/2016/02/28/pass-credentials-to-the-awslogs-docker-logging-driver-on-ubuntu/>