Multipass 旋风教程

版主: jvip_chen

回复
头像
virtual
社区管理员
社区管理员
帖子: 16
注册时间: 2019年 1月 4日 08:06 星期五

Multipass 旋风教程

帖子 virtual »

容器技术可以保证环境一致性,简化项目配置、部署流程,因此很受广大开发者青睐。如果你打算尝试或者已经尝试基于容器简化本地项目环境配置,但又嫌弃 docker 用起来还是不够直截了当,那么可以试下 multipass。

安装
macOS(支持 Sierra 以上版本)可以直接通过 Homebrew 安装:

代码: 全选

brew cask install multipass
Windows 用户可以到这里下载安装(只支持 Windows 10,如果是 Windows 家庭版或者 v1803 之前的 Windows 10 专业版/企业版,还需要另外安装 VirtualBox)。

运行一下

代码: 全选

multipass version
命令确认安装成功,顺便查看一下版本:

代码: 全选

multipass  1.1.0+mac
multipassd 1.1.0+mac
可以看到当前版本是这个月刚发布的 1.1.0。对很多用户来说,这个版本最大的更新是支持代理。从 1.1.0 起,multipass 像很多命令行工具一样,会遵循 http_proxy 环境变量中指定的代理。因为 multipass 创建容器时可能需要从网络下载镜像,而很多地方的网络连通性不尽如人意,因此支持代理能够大大改善使用体验。

上手
先来创建一个容器:

代码: 全选

$ multipass launch --name react
Launched: react
初次创建时需要下载镜像,网络畅通的情况下,稍等片刻即可。

容器创建后 multipass 会马上启动它,这样创建好容器后我们就可以直接使用了:

代码: 全选

$ multipass exec react -- lsb_release -d
Description: Ubuntu 18.04.4 LTS
lsb_release 会打印 Linux 发行版的信息。之前我们创建容器的时候并没有指定使用什么样的镜像,上面命令的输出表明,multipass 默认会使用当前 LTS 版本的 Ubuntu。

除了直接在容器上运行(exec)命令外,还可以通过 shell 命令「进入」容器:

代码: 全选

multipass shell react
我们进入了一个完整的 Linux 环境,可以进行各种操作。例如,假设我们看到了一篇介绍 React Hooks 的教程,打算体验一下教程的示例项目:

代码: 全选

git clone https://github.com/hjiang/react-hook-demo.git
cd react-hook-demo
npm install 
哎呀,系统告诉我们 npm 没有安装,并建议通过 apt 安装。

The program 'npm' is currently not installed. You can install it by typing:

代码: 全选

sudo apt install npm
不过,当前 LTS 版本的 Ubuntu 仓库里的 Node.js 比较老旧,我们转而安装 LTS 版本的 Node.js(12):

代码: 全选

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install
npm start
项目跑起来了,太棒了:

Compiled successfully!

You can now view leancloud-react-hook-tutorial in the browser.

Local: http://localhost:3000/
On Your Network: http://192.168.64.5:3000/

Note that the development build is not optimized.
To create a production build, use npm run build.
这里 192.168.64.5 是 Multipass 分配给 react 这个容器的 IP,所以我们可以直接在宿主机上打开浏览器访问 http://192.168.64.5:3000/ 查看效果。

定制
接下来我们尝试容器化手头正在开发的一个 Node.js 项目。和之前不同,我们将对容器进行一些定制,这样用起来更方便。

首先,我们的 Node.js 项目将部署到云平台,所以我们希望容器的规格尽可能和云平台上的生产环境一致。其次,我们之前手动安装了 Node.js,这次我们希望自动化这一安装过程。

因此,我们使用以下命令创建容器:

代码: 全选

multipass launch --name lean --disk 2G --mem 256M --cloud-init lean.yaml 18.04
我们通过命令行参数指定了容器的磁盘和内存大小,并且显式指定使用 Ubuntu 18.04。容器创建成功后,通过 multipass info 可以查看容器的基本信息:

代码: 全选

$ multipass info --all
Name:           lean
State:          Running
IPv4:           192.168.64.2
Release:        Ubuntu 18.04.4 LTS
Image hash:     fe3030939822 (Ubuntu 18.04 LTS)
Load:           0.11 0.30 0.16
Disk usage:     1.3G out of 2.0G
Memory usage:   71.4M out of 229.7M

Name:           react
State:          Running
IPv4:           192.168.64.5
Release:        Ubuntu 18.04.4 LTS
Image hash:     fe3030939822 (Ubuntu 18.04 LTS)
Load:           0.00 0.00 0.00
Disk usage:     1.7G out of 4.7G
Memory usage:   112.1M out of 985.7M
可以看到,之前创建的 react 容器,multipass 默认分配了 5G 硬盘和 1G 内存。而 lean 容器则按照我们的要求分配了 2G 硬盘和 256M 内存(这是我们计划使用的云平台 LeanCloud 云引擎 免费版体验实例的规格)。另外,基本信息中没有 CPU 核心的信息,multipass 默认会给容器分配 1 个 CPU 核心。

至于 lean.yaml 则是容器的初始化配置文件,内容如下:

代码: 全选

#cloud-config

runcmd:
  - curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
  - sudo apt-get install -y nodejs
  - wget https://releases.leanapp.cn/leancloud/lean-cli/releases/download/v0.21.0/lean-cli-x64.deb
  - sudo dpkg -i lean-cli-x64.deb
runcmd 可以指定容器 首次启动 时运行的命令,这里我们复制了之前安装 Node.js 的命令,还加上了安装 lean-cli 的命令(我们通过 lean-cli 将代码部署到云平台)。

容器初始化配置文件遵循 cloud-init 标准,可以通过 yaml 文件进行用户、文件、软件仓库、 DNS 解析、SSH 密钥、puppet、chef 等各种初始化配置。

我们只打算在容器中测试、部署项目,并不打算 multipass shell 到容器内使用 vim 或 emacs 开发项目。所以,我们直接挂载宿主机上的一个目录:

代码: 全选

multipass mount demo lean:/home/ubuntu/demo
demo 是我们的 Node.js 项目目录,如果读者想要测试,可以用下面这个模板项目:

代码: 全选

git clone https://github.com/leancloud/node-js-getting-started demo
同时去 LeanCloud 注册账号、创建应用,方便体验下面的部署操作。

挂载完成后,我们就可以在宿主机上使用趁手的 IDE、编辑器开发项目,之后 multipass shell lean 到容器内测试:

代码: 全选

cd demo
lean login # 使用之前注册的 LeanCloud 账号登录
lean switch # 选择之前创建的应用
npm install # 安装项目依赖
lean up # 本地(容器内)调试
屏幕会输出:
Node app is running on port: 3000
之前通过 multipass info,我们知道 lean 容器的 IP 是http://192.168.64.2,所以在宿主机上访问 http://192.168.64.2:3000/ 即可查看效果。
如果效果符合预期,我们可以在容器内运行 lean deploy --prod 1 部署项目。

更多
运行

代码: 全选

multipass list
可以列出所有的容器:

代码: 全选

Name                    State             IPv4             Image
lean                    Running           192.168.64.2     Ubuntu 18.04 LTS
react                   Running           192.168.64.5     Ubuntu 18.04 LTS
如果希望节约资源,我们可以停止暂时用不到的容器,比如之前创建的 react:

multipass stop react
之后我们可以运行 multipass start react 重新运行容器。如果以后不再使用,那么也可以干脆删除:

代码: 全选

multipass delete --purge react
最后,很多时候,我们只是想要在 macOS 或 Windows 上起一个 Linux 环境,然后进行一些操作,multipass 应付这一使用场景最是得心应手:

代码: 全选

multipass shell
是的,你没看错,只需一条命令,你就可以进入一个与宿主机隔离的 Linux 容器!
multipass 会自动创建并运行一个名为 Primary 的容器(如果还没有创建或运行的话),这个容器也会自动挂载宿主机的 Home 目录,就是这么省心省力。

结语
Multipass 使用起来十分简洁直观。它是由 Canonical (Ubuntu 背后的公司)推出的,因此使用的镜像由 Canonical 负责更新,包含最近的安全更新,以及专门为各个平台的虚拟化方案(Windows 的 Hyper-V、macOS 的 HyperKit、Linux 的 KVM)优化的内核。不过也因为同样的原因,目前支持的镜像也只限于 Ubuntu。
Gilbertjef
帖子: 1
注册时间: 2021年 11月 27日 21:04 星期六

-

帖子 Gilbertjef »

I consider, that the theme is rather interesting. I suggest all to take part in discussion more actively.
回复

回到 “multipass”