multipass + docker  on Mac

# Mac でのDocker環境構築

いよいよ DockerDesktopの猶予期限がくるので、移行しました。
下記どちらでコマンドをうっているのか分かりづらいので セクションタイトルに　Macで実行する場合は "on Mac"、　仮想環境のUbuntuで実行する場合は　"on Ubuntu"と入れる

## multipass (ubuntu の仮想起動環境）インストール on Mac
https://multipass.run/
1. 上記からmac用binaryをDownload
２. installer を起動

## multipass でubuntu:latest(20.04) 起動 on Mac
あとからmemory, disk sizeを変更するのがとても大変なので最初から必要な分指定する。目的としてkubernetesのローカルデバッグをkindを使用して動かすので以下のようにmemory 10G, disk 20G, cpu core 4 程度は最低必要。

``` shell
% multipass launch --name ryujidev -m 10G -d 20G -c 4
Launched: ryujidev                                                              

% multipass ls                          
Name                    State             IPv4             Image
ryujidev                Running           192.168.64.3     Ubuntu 20.04 LTS

% multipass info ryujidev
Name:           ryujidev
State:          Running
IPv4:           192.168.64.3
                172.17.0.1
                172.18.0.1
Release:        Ubuntu 20.04.3 LTS
Image hash:     8fbc4e8c6e33 (Ubuntu 20.04 LTS)
Load:           0.98 0.89 1.09
Disk usage:     12.3G out of 19.2G
Memory usage:   2.3G out of 9.7G
Mounts:         --
```
### あとから cpu, memoryを変更する方法
最初に指定していたほうがよいのですが、kubernetesでpodを起動しようとして、
podのstatusがpendingのままで進まないということがよくあります。
kubectrl describe pods をするとCPUやメモリが足りていないというのがわかります。

```shell
$kubectl describe pods  -n istio-system
...
Events:
  Type     Reason            Age                  From               Message
  ----     ------            ----                 ----               -------
  Warning  FailedScheduling  27m (x1 over 28m)    default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Warning  FailedScheduling  15m (x1 over 16m)    default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Warning  FailedScheduling  14h (x365 over 20h)  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
```
こんなときはしょうがないので以下の手順でmultipassが割り当てる cpu, memoryを変更できます
https://github.com/canonical/multipass/issues/1158#issuecomment-548073024

``` shell
# stop multipassd
sudo launchctl unload /Library/LaunchDaemons/com.canonical.multipassd.plist

# edit /var/root/Library/Application Support/multipassd/multipassd-vm-instances.json
# you'll need sudo for that

# start multipassd again
sudo launchctl load /Library/LaunchDaemons/com.canonical.multipassd.plist
```

以下が編集したあとのmultipassd-vm-instances.jsonの例です

```json
{
    "ryujidev": {
        "deleted": false,
        "disk_space": "21474836480",
        "extra_interfaces": [
        ],
        "mac_addr": "52:54:00:e1:9d:18",
        "mem_size": "10737418240",
        "metadata": {
        },
        "mounts": [
        ],
        "num_cores": 4,
        "ssh_username": "ubuntu",
        "state": 4
    }
}

```
### 参考：あとからDiskSizeを変更する方法
下記に説明があるので、やってみたのですが　２回ともmultipassでstartし直そうとすると
disk imageが壊れてしまったようでした。　深くおっていないですがdisk sizeは変えなくて良いように最初に多めに割り当てておくのが無難です。

https://github.com/canonical/multipass/issues/62#issuecomment-729650082


## ubuntu に local directory をmount, login on Mac
mountするかどうかは任意

``` shell
(base) ~ % multipass mount ~/git  ryujidev:/home/ubuntu/git 
(base) ~ % multipass shell ryujidev                                                     
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-92-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Jan  8 09:05:44 JST 2022

  System load:             0.13
  Usage of /:              28.0% of 4.67GB
  Memory usage:            2%
  Swap usage:              0%
  Processes:               119
  Users logged in:         0
  IPv4 address for enp0s2: 192.168.64.3
  IPv6 address for enp0s2: fd76:3e59:29b1:1bdf:4449:33ff:fe91:8c20


1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


Last login: Sat Jan  8 09:04:25 2022 from 192.168.64.1
ubuntu@ryujidev:~$ ls
git  snap

```

## docker Install on Ubuntu
https://docs.docker.com/engine/install/ubuntu/
上記を直接参照したほうがよいですが何度も再実行するときのメモ用に下記にコマンドを抜き出しておきます。

``` shell
sudo apt-get remove docker docker-engine docker.io ubuntu@ryujidev:~/git$ sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
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
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
```
## sudo なしでdocker実行するためのGroup追加 on Ubuntu
```
sudo gpasswd -a $USER docker
# logout & login, then enabled.
```


## Go package and make install on Ubuntu

```shell
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go
```

```
sudo apt install make
```





## remote debbug on Mac
まず下記のように　multipass 内で生成されたssh 公開鍵をコピーしておく

```shell
sudo install -m 600 -o $USER -g $(id -g) /var/root/Library/Application\ Support/multipassd/ssh-keys/id_rsa ~/.ssh/multipass.id_rsa
```
~/.ssh/config に下記の設定を追記しておく（HostNameはmultipassで起動したubuntuのLocalIPに合わせる）

```config
Host ryujidev
 User ubuntu
 HostName 192.168.64.3
  IdentityFile ~/.ssh/multipass.id_rsa
```
これでmultipass shell だけでなく、　ssh ryujidev でubuntuにアクセスできるようになりました。

あとは下記を参考に vscodeのremote debug で ubuntuに接続し、src code本体は、仮想環境ubuntuにgitで取得して、UIは mac 上の vscodeで編集できます。
https://code.visualstudio.com/docs/remote/ssh#_connect-to-a-remote-host

container のポートフォワード（WebServerのデバッグ等）
https://code.visualstudio.com/docs/remote/ssh#_forwarding-a-port-creating-ssh-tunnel

## docker, k8s の動作確認

以下のように上記vscode remote debugで 仮想 ubuntuにつなぎ、vscodeのターミナルで、kind, k8s をたちあげてistioctl で kialiを開いてみます。(istioctlについての参考：https://qiita.com/kozayupapa/items/dfbabe1bd6eb40f4ddf9)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41631/0ada0b40-230e-5e1b-9f95-30f5131d81c3.png)

上記で実行するとvscode ポートタブに移動すると port forward設定が自動で追加しれてくれています！（便利！！かゆいところにてがとどいているさすがMicrosoft）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41631/6afaa7f7-7da5-5075-4ae1-39511fadf04c.png)

MacのBrowserで localhost:20001 にアクセスするとちゃんと開いて確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41631/809e03b7-979d-676c-f845-b23c0021b78b.png)

これで無事　DockerDesktopを卒業できました。
今後また container CI/CDで利用することになったら再度Dockerファミリにお世話になろうと思います。
しばらくは　AzureのContainerRepositoryを利用する予定なのでmultipassで十分かなと思いました。