multipassを使ってMac上でLinuxを動かす

先日MacにおいてDockerのライセンス体系が変わり大きな事業者はライセンスを購入する必要があります。個人の利用や小さい事業者は無料で利用できますが、Mac上でLinuxを動かし、Linux上でdockerdやcliを使えるように整備したいと思います。

## やりたいこと
Mac上でLinuxを動かす
dockerd/cliを利用する

### Mac上でLinuxを動かす
クライアント仮想化のソフトウェアはバーチャルボックスなど多数ありますが用途などを考えるとmultipassが良さそう。

https://multipass.run/docs/installing-on-macos

公式ではbrew経由のインストール手順の記載がありましたがgitのリリース経由のpkgを入れます

https://github.com/canonical/multipass/releases/

最新の安定板Multipass version 1.9.2

**インストール後のバージョンと管理VMの確認**

```sh
$ multipass version
multipass   1.9.2+mac
multipassd  1.9.2+mac

$ multipass list
No instances found.
```

**起動する**

```sh
$ multipass launch 22.04 --disk 20G
$ multipass list                   
Name                    State             IPv4             Image
national-yak            Running           192.168.64.4     Ubuntu 22.04 LTS
```

**VMのシェルを使ってdockerをインストールする**
https://docs.docker.com/engine/install/ubuntu/

```sh
$ multipass shell national-yak
ubuntu@ sudo apt-get remove docker docker-engine docker.io containerd runc
ubuntu@ sudo apt-get update
ubuntu@ sudo apt-get install ca-certificates curl gnupg lsb-release
ubuntu@ sudo mkdir -p /etc/apt/keyrings
ubuntu@ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
ubuntu@ 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
ubuntu@ sudo apt-get update
ubuntu@ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
ubuntu@ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
```

**Next.jsのイメージをデプロイする**

テスト用コンテナを削除する
```sh
ubuntu@ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
edac709e49db   hello-world   "/hello"   3 minutes ago   Exited (0) 3 minutes ago             objective_gould
ubuntu@ sudo docker rm edac709e49db
edac709e49db
ubuntu@ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

### dockerd/cliを利用する
**dockerをデプロイする環境を整える**
Nodeを導入する（手順は公式のgitを参照）　

https://github.com/nodesource/distributions/blob/master/README.md

```
ubuntu@ sudo apt install nodejs npm
ubuntu@ node -v
v12.22.9
ubuntu@ npm -v
8.5.1
ubuntu@ sudo npm install --global yarn
1.22.19
```

**前回と同じ手順でPJを作成して動作確認する**

```
ubuntu@ npx create-next-app --example with-docker testapp
ubuntu@ cd testapp/
ubuntu@ sudo docker build -t testapp .
ubuntu@ sudo docker run -p 3000:3000 testapp
```

**IPアドレスを確認してブラウザでアクセスする**

```
ubuntu@$ ip a
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:dd:5f:a5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.64.4/24 metric 100 brd 192.168.64.255 scope global dynamic enp0s1
```

画面確認できました
http://192.168.64.4:3000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110457/77c18a09-a9a3-d682-6b85-a8b52446fd74.png)

Mac上でUbuntuのターミナルを利用可能でdockerの稼働も確認できました。後はlinuxとMac間でファイル授受できるようにディレクトリをマウントしたりgit cloneするなどででソースコードやDockerfileを共有していきたい。

何よりCanonical社が提供している機能であるので心強いです。このような技術（仮想化技術など含めて）をインターネット経由で即利用可能な時代に感謝いたします。。

自分のこれまでの経験ではRedhat系のOSを使うことが多かったですが、UbuntuなどDebian系の仕組みやコマンド体系も学習します。