2020年版qemuで動作するboot2dockerを用いたvscodeのリモート開発

#やりたいこと
windowsでlocalで簡単にDockerを立ち上げ、vscodeのRemote拡張でサクッと開発したい。
qemu+boot2dockerのisoイメージを利用する手法を用いることで、
Window10の64bit版ならhomeかつvt-xなしでもできそう

#やらないこと
以下のものは便利だが、環境を選ぶのであえて使わない方向で進めてみる
Docker Desktop for Mac and Windows
Docker Machine

#1. qemu インストール
以下より2020年2月7日時点の最新版を取得してインストール
※古いqemuを使うとWindows10でnodejs等が正常に動かなかったため最新版をお勧め。

https://qemu.weilnetz.de/w64/
qemu-w64-setup-20200201.exe  

#2. Diskイメージ作成
データ用
qemu-img create -f qcow2 data.qcow2 100G

SWAP用（本当に必要か分かんない）
qemu-img create -f raw swap.img 1G

#3. boot2dockerのisoイメージ取得
以下より2020年2月7日時点の最新版を取得

https://github.com/boot2docker/boot2docker/releases
v19.03.5のboot2docker.iso

#4. 起動して初期設定（初回のみ）
qemu-system-x86_64 -hda ./data.qcow2 -hdb ./swap.img -cdrom ./boot2docker.iso -smp 2 -m 2G -boot d  -net nic -net user,hostfwd=tcp::22-:22

>CPU割り当て2つ：-smp 2
メモリ割り当て2G：-m 2G
NATとSSHでログインするためのポートフォワード設定： -net nic -net user,hostfwd=tcp::22-:22

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81968/9750913f-a84c-ca19-0459-2fc31147a3cc.png)


※初回設定が終われば「-nographic」オプションをつけてもOK

*ここからqemuで起動したゲストOS(coreOS)での操作*

QEMUのコンソールでもよいが、コピペ等やりにくいのでSSHでやる場合は以下の通り接続

```
ssh docker@localhost
```

>ユーザ：dokcer
パスワード：tcuser
[DockerReadmeより](https://github.com/boot2docker/boot2docker#ssh-into-vm)


#5. debianイメージをとってきて、diskにラベルを設定
ラベルを付けるとboot2dockerが起動時にマウントしてくれるので永続領域となるdata.qcow2とswap.imgにラベルを付ける。

docker run -i -t --rm --privileged -v /dev:/hostdev debian bash

*👇ここからdockerで起動したコンテナ(debian)での操作*

```
fdisk /hostdev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): o
Created a new DOS disklabel with disk identifier 0x25bc3c8f.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-209715199, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715199, default 209715199):

Created a new partition 1 of type 'Linux' and of size 100 GiB.

Command (m for help): w
The partition table has been altered.
Syncing disks.

```

data.qcow2(sda1)にラベル設定

```
apt-get update && apt-get install btrfs-tools
mkfs.btrfs -L boot2docker-data /hostdev/sda1
```

swap.img(sdb)をswapにしてラベル設定

```
mkswap -L boot2dockerswap /hostdev/sdb
```

コンテナを抜ける

```
exit
```

*👆ここまでdockerで起動したコンテナ(debian)での操作*

*👇ここからqemuで起動したゲストOS(coreOS)での操作*

```
sudo reboot
```

マウントされているか確認

```
df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     1.8G    283.6M      1.5G  16% /
tmpfs                   998.6M         0    998.6M   0% /dev/shm
/dev/sda1               100.0G     16.8M     98.0G   0% /mnt/sda1
cgroup                  998.6M         0    998.6M   0% /sys/fs/cgroup
/dev/sda1               100.0G     16.8M     98.0G   0% /mnt/sda1/var/lib/docker
/dev/sda1               100.0G     16.8M     98.0G   0% /mnt/sda1/var/lib/docker/btrfs
```

SWAPも設定されてそう

```
swapon -s
Filename                                Type            Size    Used    Priority
/dev/zram0                              partition       427332  0       -2
/dev/sdb                                partition       1048572 0       -3
```
#6. /home/dockerの永続化

これで/var/libが永続化しているので、dockerを使う分には問題ないが、/home/dockerは永続化されていないので、vscodeのRemote-sshを利用すると毎回インストールが発生する。

boot2dockerの/home/dockerはdockermachineで自動で配備するため、
[こちらの記事](https://qiita.com/tukiyo3/items/07f1eb77b5ffd9031e30)のやり方が正しいのだが、今回はdockermachineは使わないので先ほど作成したDISKにシンボリックリンクを張ることにした。

```
#今のフォルダを永続領域にコピー
sudo cp -rp /home/docker/ /var/lib/boot2docker/userdata

#boot2docker起動時に読み込まれるprofileにリンク設定を追記
vi /var/lib/boot2docker/profile

#/var/lib/boot2docker/profileへ以下を追記
rm -rf /home/docker
ln -s /var/lib/boot2docker/userdata /home/docker
```
※boot2docker上で外部プロキシが必要ならここに追記する。
 
```例：
export http_proxy=http://username:password@your.proxy.address:proxy.port/
export https_proxy=http://username:password@your.proxy.address:proxy.port/
```

んで再起動

```
sudo reboot
```

#7. vscodeにて拡張機能インストール
*👇ここからホストのvscodeでの操作*

[Remote-SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)の拡張をインストール

~/.ssh/config ファイルに以下の内容を追記して

```
Host localhost
  HostName localhost
  User docker
  Port 22
```

拡張機能から接続する。ここではパスワード(tcuser)でログイン

※初回エラーになったらRetryするとつながることがある。

#8.sshキー作成＆公開キー登録
パスワードを入力するのはめんどくさいので、sshキー作成

```ssh-keygen -t rsa -b 4096 -C "your@mail"```

~/.ssh/id_rsa.pub ができるのでこちらを先ほど接続したboot2dockerの~/.ssh/authorized_keys にコピペ

#9. コンテナに接続・・・
力尽きたのでいったん投稿