3

作者:LeanCloud weakish

容器技术可以保证环境一致性,简化项目配置、部署流程,因此很受广大开发者青睐。如果你打算尝试或者已经尝试基于容器简化本地项目环境配置,但又嫌弃 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 -dDescription:    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。


LeanCloud
5k 声望8.4k 粉丝

LeanCloud 提供包括数据存储、文件存储、消息推送、即时通讯、可自动扩容的云引擎容器和大数据分析工具在内的后端服务,全面涵盖互联网产品开发的需求。