軽量なVMマネージャ Multipass の使い方(Dockerを添えて)

f:id:Naotsugu:20220405213032p:plain


Multipass とは

Multipass は、macOS, Linux, Windows で使えるマルチプラットフォームの軽量なVMマネージャです。

macOSではHyperKit、Linux では KVM、WindowsではHyper-V を使用するため、最小限のオーバーヘッドでVMを実行することができます。

Ubuntu の開発元である Canonical社により提供されているため、VMイメージは Ubuntu に限られますが、コマンド1つで新鮮な Ubuntu 環境がすぐに利用可能となり、さらに cloud-init がサポートされるため、開発環境で小規模なクラウド展開をシミュレートすることができます。

また、昨今では、Docker Desktop の代替としての利用も増えています。


macOS でのインストール

インストーラからインストールできる他、

Homebrew からインストール可能です。--cask でインストールします。

$ brew install --cask multipass

...
installer: Package name is multipass
installer: Installing at base path /
installer: The install was successful.
🍺  multipass was successfully installed!

インストールが完了すると、アプリケーションに Multipass が追加され、multipass コマンドが利用可能となります。

$ multipass version
multipass   1.8.1+mac
multipassd  1.8.1+mac

アンインストールは以下で行えます。

$ brew uninstall multipass


Windows でのインストール

インストーラをダウンロードしてセットアップ ウィザードに沿ってインストールします。

f:id:Naotsugu:20220405214517p:plain

f:id:Naotsugu:20220405214557p:plain

f:id:Naotsugu:20220405214618p:plain

f:id:Naotsugu:20220405214642p:plain

f:id:Naotsugu:20220405214703p:plain

f:id:Naotsugu:20220405214720p:plain

f:id:Naotsugu:20220405214739p:plain

f:id:Naotsugu:20220405214758p:plain

インストールが完了すると、ユーザの環境変数にパスが追加されているので、multipass コマンドが利用可能となります。

トールが完了すると、ユーザの環境変数にパスが追加されているので、multipass コマンドが利用可能となります。

> multipass version
multipass   1.8.0+win
multipassd  1.8.0+win


VM起動から終了まで

launch コマンドで、OSイメージの取得からバーチャルマシンの起動までが可能です。

OSイメージはデフォルトで、Ubuntu の LTS が選択されます(初回はイメージのダウンロードにそれなりの時間がかかります)。

$ multipass launch

Launched: respected-hornbill

--name オプションでインスタンス名を指定することもできます。

省略時はランダムな名前(上記例では respected-hornbill)が付与されます。

--name オプションを指定する場合は以下のようになります。

$ multipass launch --name myVM

インスタンスは list コマンドで一覧できます。

$ multipass list
Name      State         IPv4             Image
myVM      Running       192.168.64.2     Ubuntu 20.04 LTS

起動しているインスタンスのシェルに入るには shell コマンドを使います。

$ multipass shell myVM

以下のようなメッセージとともに、VM内のシェルに接続できます。

f:id:Naotsugu:20220405214226p:plain

シェルからは exit で抜けることができます。

ワンライナーなコマンドは、シェルに入らずに exec コマンドで以下のように実行することもできます。

$ multipass exec myVM -- uname -r

5.4.0-105-generic

起動しているインスタンスを停止するには stop コマンドを使います。

$ multipass stop myVM

インスタンスを削除するには delete コマンドを使います。

$ multipass delete myVM

delete したインスタンスは multipass recover で再度利用することもできます。

インスタンスを完全に削除するには purge します。

$ multipass purge

以下のようにすることで、delete と purge を同時に行うこともできます。

$ multipass delete --purge myVM


利用可能なOSイメージの一覧

利用可能なOSイメージは find コマンドで確認できます。

$ multipass find
Image                  Aliases    Version   Description
18.04                  bionic     20220325  Ubuntu 18.04 LTS
20.04                  focal,lts  20220322  Ubuntu 20.04 LTS
21.10                  impish     20220309  Ubuntu 21.10
anbox-cloud-appliance             latest    Anbox Cloud Appliance
charm-dev                         latest    A development and testing environment for charmers
docker                            latest    A Docker environment with Portainer and related tools
minikube                          latest    minikube is local Kubernetes

dockerminikubeCharm のテスト環境用のイメージも提供されています。

デフォルトは最新の LTS である Ubuntu 20.04 となります。

以下のようにイメージ名またはエイリアス名を指定してOSイメージを指定することができます。また、イメージ名の代わりに、カスタムイメージのURLを指定することもできます。

$ multipass launch --name myVM 21.10



VMのスペックを指定

デフォルトでは、CPU:1、ディスク:5G、メモリ:1G となります。

必要に応じて、以下のように指定することができます。

$ multipass launch --cpus 2 --disk 40G --mem 4G --name myDocker docker

Launched: myDocker

docker イメージからVMが起動すれば docker が利用可能です。

$ multipass exec myDocker -- docker version

Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:48:07 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:45:56 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


ホストディレクトリをマウントする

mount コマンドにて、ローカルディレクトリ VM名:VM側のマウントポイント を指定します。

$ multipass mount ~/doc myDocker:/mnt/doc

Windows 環境の場合は、管理者権限にて、set コマンドでマウント可に設定する必要があります。

> multipass set local.privileged-mounts=true

その後、以下のようにマウントします。

> multipass mount .\doc myDocker:/mnt/doc

アンマウントは umount コマンドを使います。

$ multipass umount myDocker:/mnt/doc

全てアンマウントするには以下のようにすることもできます。

$ multipass umount myDocker


VMの情報を確認する

VMの情報は info コマンドで見ることができます。

$ multipass info myDocker

Name:           myDocker
State:          Running
IPv4:           192.168.64.5
                172.17.0.1
Release:        Ubuntu 21.10
Image hash:     96768217b9b5 (Ubuntu 21.10)
Load:           0.00 0.00 0.00
Disk usage:     2.1G out of 38.6G
Memory usage:   193.5M out of 3.8G
Mounts:         /Users/xxx/doc => /mnt/doc
                    UID map: 501:default
                    GID map: 20:default

先程マウントした内容も反映されていますね。


Docker で Nginx を起動する

作成した VM myDocker で Nginx を起動してみましょう。

$ multipass exec myDocker -- docker run -d --rm -p 8080:80 nginx

info コマンドで確認したIPアドレスでアクセスすれば、Nginx の起動が確認できます。今回の場合は、http://192.168.64.5:8080 となります。

f:id:Naotsugu:20220405223448p:plain


cloud-init でVMを初期設定する

Multipass は、cloud-init を利用できるため、システムの起動時にインスタンスの初期化を自動化できます。

cloud-config.yaml として以下のようなファイルを用意し、

#cloud-config

locale: en_US.UTF8
timezone: Asia/Tokyo

package_upgrade: true

packages:
 - apache2

--cloud-init オプションで指定することで、インスタンスの初期化時のタスクを自動化できます。

$ multipass launch --cloud-init cloud-config.yaml

上記設定では apache2(httpd) が動きます。

f:id:Naotsugu:20220405235724p:plain

cloud-init の詳細は以下を参照してください。

cloudinit.readthedocs.io