苹果发布了名为Container Machine的项目,旨在为Mac用户提供一个高度集成、流畅的Linux开发环境。这一项目基于标准OCI镜像构建,集成了主机级别的功能特性,让开发者在Mac和Linux之间实现真正的无缝切换。
为什么需要Container machine?
传统的容器通常以应用程序为中心进行构建,而Container Machine则以Linux环境为中心进行构建。它运行镜像的init系统,允许用户注册长期运行的服务,或在进程监管下测试应用程序。
Container Machine会自动将用户名和主目录映射到Linux环境中。开发者的仓库和配置文件在两个平台都可用——可以在macOS上使用自己熟悉的编辑器和IDE,同时在Linux环境内部构建和运行应用程序。
核心理念:在Mac编辑,在Linux构建
Container Machine的设计哲学可以用一句话概括:"在Mac编辑,在Linux构建。"
开发者的仓库位于macOS的$HOME目录,同时挂载到容器内的/Users/<username>路径。这意味着开发者可以用macOS原生的编辑器或IDE进行开发工作,同时在容器内编译和运行应用程序。
同时,macOS上的原生工具——如性能分析器、截图工具、浏览器和GUI调试器——都能看到容器内相同的文件。"我构建了它"和"我正在检查它"之间没有任何同步延迟。
支持真实的Linux系统服务
Container Machine不只是一个简单的命令行环境。它支持运行完整的系统服务,如数据库或任何栈所需的组件。只要镜像安装了systemd,就可以使用systemctl start postgresql这样的命令启动真实的数据库服务。这对于需要在真实Linux服务环境下测试应用的开发者来说尤为重要。
开发者可以为每个目标发行版创建一个Container machine——alpine、ubuntu、debian等,每个都有相同的$HOME和来自Mac的相同配置文件。可以快速在不同发行版中测试应用程序的兼容性。
快速上手
创建和运行一个Container machine非常简单:
首先创建一个Container machine:container machine create alpine:latest --name dev
然后运行命令或获取shell:container machine run -n dev whoami(返回主机用户名而非root)、container machine run -n dev pwd(显示/home/<you>——Mac主目录的挂载点)、直接运行container machine run -n dev则进入交互式shell。
灵活的资源配置
Container Machine支持动态调整CPU和内存配置。使用container machine set -n dev cpus=4 memory=8G可以修改资源配置,修改后需要重启生效。内存默认值为主机内存的一半。
同时支持修改home挂载模式:rw(默认,可读写)、ro(只读)或none(不挂载)。
自定义容器镜像
任何包含/sbin/init的Linux镜像都可以作为Container machine使用。项目文档提供了一个Ubuntu 24.04镜像的Dockerfile示例,包含systemd、SSH服务器以及常用命令行工具。开发者可以基于这个示例构建自己的定制化开发环境。
如果需要在首次启动时执行自定义配置,可以添加一个可执行脚本到/etc/machine/create-user.sh,Container Machine会在首次启动时以root身份执行这个脚本。
面向未来的开发工作流
Container Machine的推出体现了苹果对开发者工作流的持续思考。对于需要在macOS和Linux之间频繁切换的开发者,这个工具提供了一个统一的、持久化的开发环境。与虚拟机相比,它更轻量;与传统容器相比,它更接近完整的Linux系统体验。
参考来源:https://github.com/apple/container/blob/main/docs/container-machine.md