Docker 部署 macOS:一条命令在服务器上跑起带 Web 界面的苹果系统
【免费下载链接】macosMacOS inside a Docker container.项目地址: https://gitcode.com/GitHub_Trending/macos/macos
macos是一个把完整 macOS 装进 Docker 容器的开源项目:它基于 QEMU + KVM 硬件加速,容器首次启动时会自动从苹果官方渠道下载恢复镜像,安装过程在 8006 端口的网页端完成,装好后你得到一台可以在浏览器里直接操作的 macOS 机器,并且支持 VNC 端口、USB 直通、宿主机目录共享和独立 IP 等进阶玩法。下面按"准备 → 启动 → 安装 → 调参 → 扩展"的顺序,把整个过程讲清楚。
这套容器适合什么场景
先明确它解决什么问题:你有一台带 KVM 的 Linux 服务器(或 Win11 上开了嵌套虚拟化的 Docker Desktop),但不想买苹果硬件,又需要一个可用的 macOS 来做以下事情:
- 在非苹果设备上编译、测试 macOS / iOS 应用
- 搭建可随时丢弃、重建的干净构建环境(磁盘文件都在挂载目录里,删掉即重置)
- 通过浏览器远程访问桌面,不用在机房接显示器
需要说明的一点:项目只包含开源代码,macOS 本身由容器在首次启动时自行下载,并不随镜像分发。
启动前验证 KVM 支持
没有 KVM 就没有硬件加速,性能会非常差甚至无法安装,所以这是第一步。在宿主机执行下面两条命令:
sudo apt install cpu-checker sudo kvm-ok输出包含KVM acceleration can be used就说明可用;也可以顺手确认设备文件存在:
ls -l /dev/kvm硬件方面需要满足:
| 项目 | 最低要求 |
|---|---|
| 运行时 | 支持 KVM 的 Linux 主机 + Docker 或 Podman;Win11 需开启嵌套虚拟化 |
| CPU | 支持 AVX2,Intel Haswell(四代 Core)或 AMD Zen(Ryzen 1000 系)及以后 |
| 内存 | 4 GB 可用 |
| 磁盘 | 32 GB 空闲空间(默认磁盘镜像 64 GB 是按需分配的,但下载与系统更新需要余量) |
两个常见坑:Docker Desktop 在 Linux、macOS 和 Windows 10 上都不会把 KVM 暴露给容器,因此不支持;如果kvm-ok通过了但容器里仍报 KVM 不可用,检查 BIOS 里的 VT-x / AMD-V 和宿主是否为虚拟机(虚拟机需开嵌套虚拟化),最后可以在 Compose 里临时加privileged: true排除权限问题。
按你的习惯选择启动命令
三种方式信息完全等价,选顺手的即可。仓库里自带 compose.yml 和 kubernetes.yml,可以直接拿去用。
Docker Compose(日常推荐):把下面内容存成compose.yml,再执行docker compose up -d:
services: macos: image: dockurr/macos container_name: macos environment: VERSION: "15" devices: - /dev/kvm - /dev/net/tun cap_add: - NET_ADMIN ports: - 8006:8006 - 5900:5900/tcp - 5900:5900/udp volumes: - ./macos:/storage restart: always stop_grace_period: 2m几个参数的作用:devices提供 KVM 与 TAP 网络能力,NET_ADMIN用于组建容器内网络;./macos:/storage保存磁盘镜像和固件状态,换目录等于换存储位置;stop_grace_period: 2m对应容器内 ACPI 优雅关机流程,别把它改得太短,否则容易硬断电。
Docker CLI(临时试用):不想维护文件时,一条命令即可,参数与上面一一对应:
docker run -it --rm --name macos -e "VERSION=14" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/macos:/storage" --stop-timeout 120 docker.io/dockurr/macosKubernetes 集群部署:先把仓库 clone 下来拿到kubernetes.yml(含 PVC、Deployment、Service 三件套,其中已配置/dev/kvm、/dev/net/tun的 hostPath 挂载),然后:
kubectl apply -f kubernetes.yml首次安装:跟着恢复菜单走完六步
容器起来后打开http://127.0.0.1:8006,接下来按屏幕提示做。首次启动要下载恢复镜像并安装系统,视网络速度大约十几分钟,中途会出现黑屏加进度条,属正常现象:
- 恢复镜像下载完成后进入 macOS 恢复菜单,选择Disk Utility(磁盘工具)。
- 选中最大的那块Apple Inc. VirtIO Block Media磁盘,点Erase格式化为 APFS,名字随便起。
- 关闭磁盘工具,点Reinstall macOS,安装目标选刚才格式化好的盘。
- 文件拷贝完成后按向导设置地区、语言和键盘。
- Migration Assistant(迁移助理)弹窗选Not now。
- Apple ID界面选Set Up Later,再点Skip;在Create a Computer Account界面自己设置用户名和密码——你的管理员账号就是这里创建的,没有预置账号。
装完重启后即进入桌面,后续所有操作都在 8006 网页端进行。
版本、磁盘与硬件参数的日常调整
所有配置都走环境变量,改完docker compose up -d重建容器即可生效。
选 macOS 版本:VERSION控制要装的版本,不同版本各自使用独立存储目录,互不覆盖:
| 取值 | 版本 | 代号 |
|---|---|---|
15 | macOS 15 | Sequoia |
14 | macOS 14 | Sonoma |
13 | macOS 13 | Ventura |
12 | macOS 12 | Monterey |
11 | macOS 11 | Big Sur |
不设置时默认装 14。官方提醒 macOS 26(Tahoe)目前可以选但运行很慢,暂不推荐。
改 CPU / 内存 / 磁盘:
environment: RAM_SIZE: "8G" CPU_CORES: "4" DISK_SIZE: "256G"默认是 1 核、4 GB、64 GB。DISK_SIZE也可以用来扩容已有磁盘(只增不减、不丢数据),扩完后在 macOS 终端执行下面两条命令让文件系统占满新空间:
diskutil repairDisk disk2 diskutil apfs resizeContainer disk3 0AMD 平台注意:初始安装阶段建议保持 1 核、不超过 8 GB 内存,部分型号多核会降低性能或导致不稳定,超过 8 GB 可能卡在国家选择界面;系统稳定运行数小时后再逐步上调。Intel 平台则可以直接给足核心和内存。
共享文件、音频与设备直通
音频:默认关闭。加AUDIO: "Y"后,再到网页端的Settings → Advanced里打开 Audio,浏览器才能收到声音流;不开时不占带宽。
和宿主机互传文件:挂一个共享目录进容器,再在 macOS 里挂载 9P:
volumes: - ./example:/shared进 macOS 终端执行sudo -S mount_9p shared,然后在 Finder 菜单栏Go → Computer里就能看到./example的内容。
USB 设备直通:先用lsusb查到目标设备的 vendor/product ID,然后:
environment: ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234" devices: - /dev/bus/usb整块磁盘直通:把磁盘或分区映射进容器,/disk1会成为主盘,/disk2及之后作为从盘:
devices: - /dev/sdb:/disk1 - /dev/sdc1:/disk2让 macOS 获得独立 IP 或走 DHCP
默认是桥接(NAT)模式,macOS 与宿主机共享出口 IP,靠端口映射访问。如果需要它像局域网里一台真设备那样有独立地址,可以建 macvlan 网络:
docker network create -d macvlan \ --subnet=192.168.0.0/24 \ --gateway=192.168.0.1 \ --ip-range=192.168.0.100/28 \ -o parent=eth0 vlan子网、网口按你的环境改,然后在 compose 里指定地址:
networks: vlan: ipv4_address: 192.168.0.100 networks: vlan: external: true好处是所有端口自动暴露,不用再做映射;代价是 macvlan 的这台机器无法直接访问 Docker 宿主机本身。
更进一步,想让容器和 macOS 各自拿到路由器的 DHCP 地址,加:
environment: DHCP: "Y" devices: - /dev/vhost-net device_cgroup_rules: - 'c *:* rwm'遇到问题时先查这四处
- 容器报 KVM 不可用:依次检查 BIOS 虚拟化开关、宿主虚拟机的嵌套虚拟化、云厂商是否支持嵌套 KVM;仍不行就临时加
privileged: true定位是否是设备权限问题。 - 安装过程卡住:AMD 平台先按上文回退到 1 核 + ≤8 GB 重试;换
VERSION: "13"之类的旧版本也能绕开新版系统的兼容性问题。 - Web 界面打不开:确认容器还在运行、8006 端口没被占用;VNC 客户端则连 5900 端口(tcp/udp 都已映射)。
- 还有别的参数想调:完整的
VERSION、MODEL、WIDTH/HEIGHT、BALLOONING(动态内存气球)、PROTECT(Web 密码保护)等变量清单见 环境变量文档。
最后提醒一句法务边界:安装 macOS 即接受苹果的最终用户许可协议,该协议不允许在非苹果硬件上安装,所以请只在苹果官方销售的设备上运行此容器。
【免费下载链接】macosMacOS inside a Docker container.项目地址: https://gitcode.com/GitHub_Trending/macos/macos
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考