MyOS
TLDR;使用 Docker 作为轻量级虚拟机,以实现可移植、可共享的开发环境
灵感
在担任 Binaris 的产品经理之前,我曾担任我们横向扩展后端计算产品的首席架构师。正如你所料,这份工作涉及大量的ssh 操作 <insert sunny reference here>
,以及远程调试和开发。我很快就厌倦了在每个节点上从头开始重新创建环境。
为什么不使用点文件?
点文件解决了部分问题,但点文件通常不处理软件包安装和其他样板系统配置。包含脚本固然好,但充其量也只是零散的。而且,只有在假设底层操作系统不变的情况下,脚本才有用。对于那些想知道我为什么不直接烘焙 AMI 的人来说,每个 AMI 都针对其上运行的微服务进行了优化,而不是为了满足我的一次性开发需求。我的配置最终包含了点文件、shell 脚本和 Ansible playbook,只是为了创建一个一致的环境。
盗梦空间
几个月前,我开始好奇使用 Docker 作为轻量级虚拟机是否可行/流行。我看到网上很多人在 Docker 中运行远程服务器(特别是 VSCode),但很少有人真正在 Docker 容器内部进行开发。我们在工作中经常使用 Docker,所以我对它的工具和功能非常熟悉。由于我一直想重做我的 dotfiles+config 文件,所以我想为什么不使用 Docker 呢?
MyOS
我努力成果的 Dockerfile 现已成为 MyOS 的基础。Dockerfile 为使用 vi、zsh 和 tmux 进行容器内开发提供了一个半主观的基础。它处理了很多样板工作,例如
- 配置语言环境和颜色
- 创建非root用户并设置必要的权限
- 设置 OpenSSH 以实现无密码登录
- 启用 X11 显示服务器
最初,我使用原生 Ubuntu 作为基础镜像,但为了获得所需的基本功能,我做了太多修改。最终,我发现了Phusion,这是一个很棒的项目,它提供了一些关键功能
- 超轻、高度优化的基础 Ubuntu 映像
- “安全”运行多个进程的机制
- 初始化以 PID > 1 运行用户进程
- 开箱即用的 OpenSSH 服务器
我还包含了一些自定的基准软件包。有些软件包显而易见,例如xauth
用于本机主机复制/粘贴。其他一些软件包我之所以包含,是因为正确设置不仅仅需要运行apt-get
。重点包括:
- ZSH
- 顶部
- Vim8 支持剪贴板
- 从源代码构建的最新 Tmux
- 用于剪贴板支持的 XAuth 和 XDisplay 包
使用 MyOS
MyOS 非常精简。目前主要有三个部分
定义基础 MyOS 镜像。处理内置软件包的安装和系统配置。
控制将哪些主机卷和端口映射到容器中。此文件至关重要,因为它允许我们将编辑器 (vi)、shell (zsh) 和窗口管理 (tmux) 配置文件挂载到容器中,而无需实际将它们存储在容器中。
我需要一种方便反复运行命令的方法。最初我混合使用 sh 和 Make,但一直不太愿意维护用这些工具编写的 CLI。目前,它是基于 Node 的,可以通过 npm 轻松安装(我绝对愿意改变这一点)。
要使用 MyOS,首先全局安装 CLI
$ npm install -g myos
接下来,您需要克隆现有的 MyOS 设置,或者创建一个空模板。
$ myos init myos-config
$ cd myos-config
$ ls
docker-compose.yml tmux vim zsh
进入包含有效 MyOS 安装运行的目录后
$ myos create rysenv
该命令基本上从今天开始create
运行。docker-compose up -d
容器启动后,使用
$ myos connect
就是这样。
值得吗?
免责声明:显然这是对容器模型的完全滥用
容器肯定存在一些局限性,但使用容器作为开发环境会带来一些显著的好处。
- 令人难以置信的可移植性——Docker 是具有原生 OSX、Windows 和 Linux 支持的开发环境的 JVM
- 非常易碎 - 重新创建容器几乎没有任何开销,因此请随意
rm -rf *
- 几乎无状态 - 除了基本必需的功能外,状态来自已挂载的 Docker 卷。这使您可以轻松地在容器环境中处理主机文件,而无需附加到容器。
- 令人惊讶的性能 - 在 Linux 上,期望本机内核性能,以及 OSX 和 Windows VM 级别性能(OSX 上的 Docker 在 VM 中运行)。
- 加速环境迭代 - 由于其分层文件系统,您可以对运行时环境进行大量调整,而无需手动删除和重新安装依赖项。
- 可转移 -与 AWS ECR
docker commit
一起使用docker push
,在保持文件系统状态的同时从一台主机移动到另一台主机(但请保持无状态)
共享
虽然我主要将 MyOS 用于个人开发,但我每天都会浏览/r/vim,而且在 Reddit 子版块上的互动让我不禁思考 MyOS 是否还能有更多用途。MyOS 可以促进整个终端环境的共享,而不仅仅是点文件。分享你的设置,并保证它适用于任何系统上的任何人,这难道不是很酷吗?假设每个人都依赖于一个半稳定的基础镜像,那么共享只需要你发送在基础镜像之上添加的层以及点文件和其他配置即可。
结语
我已将我的所有工作开源,并希望其他人能够使用我的成果。我乐于讨论功能,甚至根据社区需求进行更改,并且非常欢迎提交拉取请求。我已经知道一些项目存在问题。
- 非常注重 vim,想看看它是否可以支持其他编辑器(肯定是 Emacs)
- 需要 CLI 命令,允许您复制另一个用户的 MyOS 环境
- 多个 MyOS 环境应该能够同时运行
- 可以自动生成authorized_keys的SSH密钥
- 可能放弃 NodeJS 转而使用 CLI