Docker Hubのイメージ(コンテナ)をWSL2にインポートする方法

[Docker Hub]:https://hub.docker.com
[Rust]:https://www.rust-lang.org
[Scoop]:https://scoop.sh
[Alpine Linux]:https://alpinelinux.org/downloads/
[Alpine WSL]:https://www.microsoft.com/ja-jp/p/alpine-wsl/9p804crf0395
[WSL2+docker+PHPのWindows開発環境構築(1) WSL2編]:https://qiita.com/dozo/items/9d9e958d4acefffb3fb8
[WSL2+docker+PHPのWindows開発環境構築(2) docker編]:https://qiita.com/dozo/items/17d0ebfb05bb4446caed

これで[Docker Hub]から好きな環境ツカエル

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

関連ページ

* [WSL2+docker+PHPのWindows開発環境構築(1) WSL2編]
* [WSL2+docker+PHPのWindows開発環境構築(2) docker編]

----
------------------- ↓ 余談はここから ↓-------------------

WSL2を構築する上で使っていたUbuntuだが、
やっぱりちょっと重いなぁという印象がある。
PHPStorm自体をLinux上に置くとなると、
どうしてもLinux自体の重さが影響してくる。

最近の開発は動作環境はdocker上にあるのなら、
開発環境のLinux自体はUbuntuでなくても良いはず。

ということで前回苦戦したAlpineでの構築を再度試みる。
ただ何度か試したところNodeJSの最新版をインストールすることができなくて途方に暮れていた。

(･ω･) どうしよ・・・
あ、Dockerでalpine-nodeの最新版からWSLのディストリビューションを作れればいいんでない？

実は、[Alpine WSL]は実体を持たず、
インストーラーだけがパッケージされていて、
公式サイトのstable版が動的にインポートされる形になっている。

(ﾟ_ﾟ) だったらdockerから作れるんじゃね？

試しにやってみたらなんとかなったので記録しておく。
前提として

 * Docker Desktop(Edge版)インストール済み
 * WSL2が動作する(令和2年5月9日現在Insider Preview版)

----
------------------- ↓ 本題はここから ↓-------------------

## Docker Hubよりコンテナ作成

この辺Dockerに未だに詳しくない私なので、
違ったら指摘してほしい。

#### Dockerコンテナ作成

Docker Hubより目的に合ったものを探す。
今回は最新のNodeJS14のAlpineLinuxという組み合わせでいく。

https://hub.docker.com/_/node?tab=tags
tag: node:14-alpine

PowerShellで実行

```
PS C:\> docker run -it node:14-alpine /bin/ash
/ # node -v
v14.2.0
/ # npm -v
6.14.4
/ # exit
```



#### DockerコンテナをOSイメージ化

コンテナをWSLインポートするためにOSイメージ化する
saveではなくexportを使用

```
PS C:\> docker ps -a # コンテナIDを表示
CONTAINER ID IMAGE COMMAND  
09e4abfaf0f4 node:14-alpine "docker-entrypoint.s…"
PS C:\> docker export 09e4abfaf0f4 -o alpine-node.tar
```

#### WSLインポート

WSLインポートでOSイメージをWSL側に登録する。
OS名を`Alpine`、インストール先を`C:\Alpine`とすると

```
PS C:\> wsl --import Alpine C:\Alpine alpine-node.tar
PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop         Running         2
  Alpine                 Stopped         2
  docker-desktop-data    Running         2
```

早速起動してみる

```
PS C:\> wsl -d apline
# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.11.6
PRETTY_NAME="Alpine Linux v3.11"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
```


(･∀･) 意外と簡単だったね！

node入れるのに苦労したから、
今後はこれで使っていこう。

DebianのSlimバージョンでもやってみたらうまくいった。
なかなか使い勝手は良さそうだ。

----
------------------- ↓ 後書はここから ↓-------------------



ここからは初期設定の手順を残しておく。
やり方は人それぞれなので参考程度に。
OSは[Alpine Linux]のまま。

#### ユーザー追加

最初に通常使うユーザーの追加とパスワードを設定しておく。
ユーザー名を`newuser`とすると

```
# adduser newuser
New password:
Retype new password:
passwd: password for dozo changed by root
# addgroup newuser wheel
```

#### sudoなど初期で必要なパッケージをインストール

```
# apk add sudo openssl-dev pkgconf shadow alpine-conf wget curl
# visudo
```

以下の行のコメントアウト(#)を消す

```
# %wheel ALL=(ALL) ALL
```

#### 再起動

いったんWSLごと再起動し、
sudoのテストも実行。

```
PS C:\> wsl -t alpine
PS C:\> wsl -d alpine -u newuser
$ sudo test
```

## WSL設定

この時点でネットワーク不良に陥っているので、
各種設定で調整していく。

#### wsl.conf設定

```
# vi /etc/wsl.conf
[automount]
enabled = true
options = "metadata, umask=22, fmask=11"
mountFsTab = false
crossDistro = true

[network]
generateHosts = false
generateResolvConf = false

[interop]
appendWindowsPath = false

[user]
default=newuser
```

resolv.conf設定

```
$ sudo setup-dns -d localhost -n 8.8.8.8
```

#### もう一度再起動

WSLごと再起動し、デフォルトユーザーが切り替わっているかを確認。

```
PS C:\> wsl -t alpine
PS C:\> wsl -d alpine
```

## 最新の環境を設定する

#### リポジトリをEdgeに変更

[Alpine Linux]にはStableバージョンとしてV3.11のようなバージョン番号がついているが、
Latest扱いのEdgeというリポジトリがあるのでそちらを使う。

/etc/apk/repositoriesを以下のように変更

```
$ cat /etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
```

パッケージを更新、最新に変更

```
$ sudo apk update
$ sudo apk upgrade
```


## 開発環境をインストール

コンパイラ系のパッケージを一式、
その他開発系のパッケージを追加。

```
$ sudo apk add build-base git
```

### PHPStormのインストール

#### Javaのインストール

PHPStormを動かすためにJREを別途インストールする

```
$ sudo apk add openjdk11-jre
$ java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+11-alpine-r1)
OpenJDK 64-Bit Server VM (build 11.0.6+11-alpine-r1, mixed mode)
```

#### PHPStormのインストール

```
$ wget https://download.jetbrains.com/webide/PhpStorm-2020.1.1.tar.gz
tar xvf PhpStorm-2020.1.1.tar.gz -C ~/opt/
```


#### X11のインストール

DISPLAY値の設定

```
$ echo "export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0" >> ~/.bashrc
```

テストアプリを実行

```
$ sudo add xeyes
$ xeyes &
```







```
/etc/hosts
54.72.98.183 download.jetbrains.com
```




### Dockerのお掃除

Dockerを使うとゴミが大量発生するので
まとめて削除で綺麗にしておこう。
(※必要なものまで消さないように)

```
$ docker rm $(docker ps -aq)
$ docker rmi $(docker images -aq)
```