编程 苹果 container 深度实战:41K Star 的原生容器工具,Apple Silicon 上的 Linux 容器新范式

2026-06-27 09:45:33 +0800 CST views 7

苹果 container 深度实战:41K Star 的原生容器工具,Apple Silicon 上的 Linux 容器新范式

2026年6月,苹果在 GitHub Trending 上扔出了一颗"深水炸弹"——用 Swift 编写的 Linux 容器运行时 apple/container,一周狂揽 41,937 个 Star,直接冲进 GitHub 周榜前五。它不是 Docker Desktop 的套壳,也不是 Lima 的 Fork,而是一套完全重构 macOS 容器化思路的官方方案:一个容器 = 一个轻量级虚拟机,零 Docker Desktop,零第三方依赖,原生 Apple Silicon 优化。

本文从架构原理、源码解析、安装部署到生产实战,彻底吃透这个项目。


一、背景:macOS 上的容器困境

1.1 为什么 Linux 容器在 macOS 上是个"先天残疾"问题

Linux 容器(Namespace、Cgroups)是 Linux 内核的功能。macOS 内核是 XNU,和 Linux 完全不沾边。所以理论上,macOS 根本跑不了 Linux 容器。

这不是 bug,是物理限制。

Docker Desktop 的解法是:在 macOS 上启动一个完整的 Linux 虚拟机(用 HyperKit/Virtualization.framework),这个虚拟机里跑 Docker daemon,所有 docker 命令实际上是在远程操控这个虚拟机里的 daemon:

macOS Host
  └── Linux VM (HyperKit/Virtualization.framework)
        └── Docker Daemon
              └── Containers (Namespace 隔离)

这套方案的问题积累多年,业内早已有共识:

问题Docker DesktopLima / Colima
资源占用完整 VM + Docker Daemon,内存 2GB+轻量一些,但仍是共享 VM
启动速度慢(完整 Linux 启动)中等
隐私所有容器共享一个 VM,数据全部挂载进去同左
架构支持跨架构镜像靠 Rosetta 翻译,性能损耗同左
授权Docker Desktop 商业授权限制开源,但非官方

Lima(Linux Machine)是 macOS 上运行 Linux 容器的非官方方案,Docker Desktop for Mac 的底层实际上也在用类似架构。但两者本质上都是一个共享 Linux VM 跑所有容器

苹果的困境在于:开发者(尤其是 AI/ML 工程师)大量使用 macOS + Apple Silicon 开发,但容器生态完全是 Linux 的。如果要跑 AI 推理、Docker Compose 编排、CI/CD 本地验证,几乎必须装 Docker Desktop——一个商业授权产品。

这就是 apple/container 诞生的背景。

1.2 苹果的破局思路

苹果没有选择"改进 Docker Desktop",也没有选择"继续用第三方方案",而是开源了一整套自研的容器化技术栈:

  • apple/container:命令行工具(CLI + 服务端)
  • apple/containerization:底层 Swift 包,负责 VM、进程、镜像管理
  • 底层依赖:Virtualization.frameworkvmnetXPCLaunchd

核心思路:一个容器 = 一个轻量级 VM,而不是把容器塞进一个共享 VM。


二、核心概念:从 OCI 标准到 per-container VM

2.1 OCI:容器互操作性的基石

在深入 container 之前,必须理解 OCI(Open Container Initiative)。

OCI 是 Linux Foundation 下的标准组织,制定了两个核心规范:

  • OCI Image Spec:容器镜像的格式标准——一个 tar 包 + manifest.json,定义了如何打包、分发镜像
  • OCI Runtime Spec:容器运行时的标准接口——定义了如何从镜像启动容器

Docker、containerd、Kubernetes CRI、Podman——所有主流容器实现都遵循 OCI 标准。这意味着只要你的工具能读写 OCI 镜像,就能和整个容器生态无缝对接。

container 的第一个特点就是:完全兼容 OCI。你可以在 container 里跑 Docker Hub 的镜像,也可以把 container 打包的镜像推到任何 OCI registry。

2.2 per-container VM vs 共享 VM:本质区别

这是 container 与 Docker Desktop、Lima 最大的架构差异:

Docker Desktop / Lima:共享 VM 模型
┌─────────────────────────────────┐
│      macOS Host                  │
│  ┌───────────────────────────┐   │
│  │   单一 Linux 共享 VM        │   │
│  │  ┌────┐ ┌────┐ ┌────┐     │   │
│  │  │ C1 │ │ C2 │ │ C3 │     │   │ ← 所有容器 Namespace 隔离
│  │  └────┘ └────┘ └────┘     │   │   但共享内核、共享网络
│  └───────────────────────────┘   │
└─────────────────────────────────┘

container:per-container VM 模型
┌─────────────────────────────────┐
│      macOS Host                  │
│  ┌────┐   ┌────┐   ┌────┐       │
│  │ VM1│   │ VM2│   │ VM3│       │ ← 每个容器 = 独立轻量 VM
│  │ C1 │   │ C2 │   │ C3 │       │   完全独立内核、网络命名空间
│  └────┘   └────┘   └────┘       │
└─────────────────────────────────┘

per-container VM 的三大优势:

1. 安全性更强:传统容器依赖 Linux Namespace 隔离,但共享内核意味着内核漏洞可能影响所有容器。per-container VM 的每个容器有独立内核,攻击面天然隔离。苹果在 README 中明确提到:"使用最小化的核心工具和动态库集合,减少资源占用和攻击面(attack surface)"。

2. 隐私更好:共享 VM 模型下,要让某个容器访问特定数据,必须先把数据挂载到共享 VM 里,再从 VM 挂载进容器。这意味着共享 VM 里会积累大量可能敏感的临时数据。per-container VM 只挂载该容器明确需要的数据。

3. 架构原生支持:在 Apple Silicon 上,container 的 ARM64 容器直接跑在原生硬件上,没有模拟开销。x86-64 镜像则通过 Rosetta 2 转译(因为 Apple Silicon 的 Hypervisor.framework 支持嵌套虚拟化)。


三、技术架构:Swift 原生栈的完整解析

3.1 整体架构图

┌─────────────────────────────────────────────────────┐
│              container CLI(命令行)                  │
│         统一入口:container run/build/pull/push      │
└──────────────────┬──────────────────────────────────┘
                   │  XPC(本地进程间通信)
┌──────────────────▼──────────────────────────────────┐
│         container-apiserver(Launch Agent)           │
│  负责容器生命周期管理、网络资源分配、API 服务           │
└────┬─────────────────────────────────────┬─────────┘
     │                                     │
┌────▼─────────────┐           ┌───────────▼──────────┐
│container-core-images│       │container-network-vmnet │
│   (XPC Helper)     │       │    (XPC Helper)        │
│  镜像管理 + 内容存储  │       │   虚拟网络管理          │
└────────┬──────────┘           └───────────┬──────────┘
         │                                  │
┌────────▼──────────────────────────────────▼─────────┐
│              Containerization Swift 包               │
│    核心 VM 管理、容器生命周期、进程隔离                │
└────┬─────────────────────┬─────────────────────┬─────┘
     │                     │                     │
┌────▼────┐      ┌─────────▼──────┐      ┌──────▼──────┐
│Virtuali│      │   vmnet        │      │   Launchd   │
│zation  │      │  (虚拟网络)     │      │  (服务管理)  │
│.frame- │      │                │      │             │
│work    │      │                │      │             │
└────────┘      └────────────────┘      └─────────────┘

3.2 Virtualization.framework:轻量级 VM 的基石

macOS 自 Big Sur(11.0)起引入了 Virtualization.framework,这是苹果官方提供的 Swift/Objective-C API,用于创建和管理 Linux 虚拟机。与用户态的 QEMU 不同,Virtualization.framework 是内核级 Hypervisor 扩展,性能损耗极低。

container 使用 Virtualization.framework 的主要功能:

// 伪代码:创建 Linux VM 的核心流程
import Virtualization

// 配置 Linux VM
let config = VZVirtualMachineConfiguration()
config.bootLoader = LinuxBootLoader(kernelURL: kernelURL, initialRamdiskURL: initrdURL)
config.cpuCount = 4  // 可通过 --cpus 配置
config.memorySize = 1 * 1024 * 1024 * 1024  // 默认 1GB,可通过 --memory 配置
config.serialPorts[0] = VZVirtioConsoleDeviceSerialPortConfiguration()

// 网络配置
config.networkDevices[0] = VZVirtioNetworkDeviceConfiguration()
(config.networkDevices[0] as! VZVirtioNetworkDeviceConfiguration)
    .interface = VTVirtualSocketNetworkDeviceAttachment()

// 挂载 OCI 镜像文件系统
config.directorySharingDevices[0] = VZVirtioFileSystemDeviceConfiguration("rootfs")

let vm = VZVirtualMachine(configuration: config)
vm.start()

Virtualization.framework 的关键优势:

  • 性能接近原生:基于 Apple Silicon 的硬件虚拟化指令(HVF),VM 启动时间 1-2 秒,接近普通容器启动速度
  • Metal / GPU 直通:支持将 Apple GPU 暴露给 Linux VM,这对 AI/ML 开发至关重要
  • 统一 API:Swift 原生,不需要桥接 C 库

3.3 Containerization Swift 包:底层基础设施

Containerizationapple/containerization 这个独立仓库中的核心 Swift 包,container 工具完全依赖它:

// Containerization 包的核心接口(简化版)
import Containerization

// 创建容器(每个容器 = 一个轻量 VM)
let container = try Container.create(
    image: "docker.io/library/ubuntu:latest",
    resources: ContainerResources(
        cpuCount: 4,
        memoryBytes: 4 * 1024 * 1024 * 1024
    )
)

// 启动容器
try container.start()

// 执行命令
let output = try container.exec(["python3", "-c", "print('Hello from container!')])

// 挂载宿主机目录
try container.mount(source: "/Users/dev/project",
                    target: "/workspace",
                    readOnly: false)

// 停止并清理
try container.stop()

Containerization 包同时提供了 镜像构建 能力。通过解析 Dockerfile,启动一个 Builder VM 执行构建步骤:

// 从 Dockerfile 构建镜像
let builder = try Builder.start(resources: BuilderResources(cpuCount: 8, memoryBytes: 32 * 1024 * 1024 * 1024))
try builder.build(dockerfile: "/path/to/Dockerfile", tag: "my-app:latest")

// 多架构支持
try builder.build(dockerfile: "/path/to/Dockerfile",
                  tags: ["my-app:latest"],
                  platforms: [.linux/arm64, .linux/amd64])

这个 Builder VM 通过 gRPC 与宿主机通信,使用 grpc-swiftswift-protobuf

3.4 vmnet + XPC:网络与服务架构

container 的网络模型使用 macOS 的 vmnet 框架,每个容器 VM 获得独立的虚拟网卡(类似于 Tap/Tun 设备在 Linux 上的作用):

  • container-network-vmnet(XPC Helper)负责管理虚拟网络池
  • 容器 VM 通过 Virtio-Net 与虚拟网络通信
  • 虚拟网络通过 vmnet 与宿主机网络桥接

这种设计比 Docker Desktop 的宿主机网络模式更干净:容器之间天然网络隔离,不需要复杂的 docker0 网桥配置。

3.5 Launchd 集成:系统级服务管理

container system start 命令将 container-apiserver 注册为 Launch Agent,随系统启动自动运行:

# 启动系统服务
container system start

# 查看服务状态
container system status

# 停止服务
container system stop

这意味着 container 不是普通命令行工具,而是一个系统级守护服务。CLI 只是客户端,真正的容器管理逻辑运行在后台 apiserver 中。


四、实操:从零安装到第一个容器

4.1 系统要求

根据 README(v0.4.1):

  • 硬件:Apple Silicon Mac(必须)
  • 系统:macOS 26(当前 beta,正式版预计 2026 年 Q4)
  • 构建(可选):Xcode 26

⚠️ 注意:目前 container 依赖 macOS 26 的新功能,尚不支持 macOS 25 及更早版本。这是目前最大的使用门槛。

4.2 安装

方式一:下载安装包(推荐正式用户)

# 1. 下载最新安装包
# 访问 https://github.com/apple/container/releases 下载 .pkg 文件

# 2. 双击安装,按提示输入管理员密码
# 安装程序将文件放到 /usr/local/bin 和 /usr/local/libexec

# 3. 启动系统服务
container system start

方式二:从源码构建

# 克隆仓库
git clone https://github.com/apple/container.git
cd container

# 编译并测试
make all test integration

# 安装到 /usr/local
sudo make install

升级/降级

# 升级到最新版
/usr/local/bin/update-container.sh

# 降级到指定版本(如 0.3.0)
container system stop
/usr/local/bin/uninstall-container.sh -k
/usr/local/bin/update-container.sh -v 0.3.0
container system start

4.3 快速上手:运行你的第一个容器

# 确保服务已启动
container system start

# 运行一个 OCI 镜像(类似 docker run)
container run --rm docker.io/library/ubuntu:latest uname -a
# 输出:Linux <uuid> 6.1.68 #1 SMP ... aarch64 GNU/Linux

# 以交互模式运行
container run -it --rm docker.io/library/ubuntu:latest /bin/bash
# 现在你在容器里了,可以 apt install、跑服务等

4.4 构建自定义镜像

# 创建 Dockerfile(假设在当前目录)
cat > Dockerfile << 'EOF'
FROM docker.io/library/node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOF

# 构建镜像(--file 可省略,默认找当前目录 Dockerfile)
container build --tag my-app:latest .

# 查看本地镜像
container images

# 运行自定义镜像
container run -p 3000:3000 my-app:latest

4.5 推送镜像到 Registry

# 登录 Registry(支持 Keychain 存储凭证)
container login docker.io

# 推送
container push registry.example.com/my-app:latest

# 从 Registry 拉取
container pull registry.example.com/my-app:latest

4.6 多架构镜像:一次构建,多平台运行

这是 container 的杀手级功能——原生多架构支持:

# 构建同时支持 ARM64 和 x86-64 的镜像
container build \
    --arch arm64 \
    --arch amd64 \
    --tag registry.example.com/my-app:latest \
    --file Dockerfile .

# 运行 ARM64 版本(原生)
container run --arch arm64 --rm my-app:latest uname -m
# 输出:aarch64

# 运行 x86-64 版本(Rosetta 2 转译)
container run --arch amd64 --rm my-app:latest uname -m
# 输出:x86_64

在 Apple Silicon 上跑 x86-64 容器时,Rosetta 2 自动介入,性能损耗可接受。这对于需要测试多平台兼容性的开发者来说非常实用。

4.7 资源限制:灵活配置 VM 规格

# 启动高内存容器
container run --rm --cpus 8 --memory 32g docker.io/library/postgres:16

# 为构建器配置大资源
container builder start --cpus 8 --memory 32g

# 如果构建器已在运行,需要先重启
container builder stop
container builder delete
container builder start --cpus 8 --memory 32g

五、隐私与安全深度分析

5.1 为什么 per-container VM 在隐私上更优

在 Docker Desktop 模式下,你有一个共享 VM,里面跑着 Docker daemon。这个 VM 的文件系统是所有容器的"中间层"。当你需要让某个容器访问 /Users/dev/project 时,实际上是:

/Users/dev/project → Docker Desktop Linux VM /home/user/project
                                       ↓
                                  容器 /home/user/project

这意味着整个 /Users/dev 目录(或你挂载的所有目录)的数据都在共享 VM 的磁盘上,即使你只是临时挂载。

container 的设计天然规避了这个问题:数据从 macOS 宿主机直接挂载到对应容器的 VM,不经过任何共享层。数据只在需要时被挂载,不需要时 VM 里根本没有这份数据。

5.2 与 Docker Desktop 授权风险的对比

Docker Desktop 最新的许可协议要求:

  • 个人开发者和教育用途免费
  • 企业使用(超过 250 名员工或年收入超过 1000 万美元)需要付费订阅

对于在企业工作的 macOS 开发者,这可能意味着合规问题。containerApache 2.0 许可证,完全免费,没有任何授权限制。

5.3 Apple Silicon 的硬件虚拟化优势

Apple Silicon(M 系列芯片)的 Hypervisor 框架支持硬件辅助虚拟化,VM 不需要模拟 CPU 指令。这意味着:

  • ARM64 容器:零模拟开销,性能接近原生
  • x86-64 容器:Rosetta 2 转译,业界已知有 10-30% 性能损耗,但可接受

对比 Intel Mac 上的 Docker Desktop,Apple Silicon 上的 container 在 ARM64 容器场景下有明确优势。


六、性能实测:启动速度与内存占用

6.1 启动速度

根据官方文档和社区反馈,container 的容器启动时间在 1-2 秒量级,这与 Linux 上使用 runc 的容器启动速度(通常 100-500ms)相比稍慢,但对于 VM 级别的隔离来说已经非常快了。

对比参考:

  • Docker Desktop 容器(共享 VM):500ms - 2s
  • container per-container VM:1-2s
  • 完整虚拟机(如 UTM、Parallels):30s+

6.2 内存占用

每个 container VM 的内存占用取决于运行的应用,但最小化启动(只跑一个 shell)的 VM 内存约 128-256MB,远低于一个完整 Linux 桌面 VM(通常 2-4GB)。

# macOS Activity Monitor 中可以看到 containerized 进程
# 每个容器对应一个或多个 vm实例 进程

6.3 网络性能

container 使用 Virtio-Net + vmnet,理论网络吞吐接近宿主机网卡速度。容器间通信通过虚拟网络交换,延迟比 Docker Bridge 网络略高,但差异在微秒级,生产场景中不可感知。


七、与现有方案的横向对比

维度Apple containerDocker DesktopLima / ColimaOrbStack
架构per-container VM共享 VM + Daemon共享 VM共享 VM(优化版)
编程语言SwiftGoGoGo
官方支持✅ Apple 官方❌ 商业公司❌ 社区❌ 商业公司
许可证Apache 2.0Docker SubscriptionMIT商业
macOS 最低版本macOS 26macOS 10.15+macOS 11+macOS 11+
Apple Silicon 优化✅ 原生✅(Rosetta)
OCI 兼容✅ 完全
GPU 访问✅(Metal 直通)⚠️ 需要配置
多架构构建✅ 原生⚠️ 需要 BuildKit
当前成熟度早期(v0.4.x)生产级生产级生产级
Star 数41,937 ⭐Docker 官方20,000+ ⭐N/A

结论container 在架构理念、授权模式和 Apple Silicon 原生支持上有明显优势,但目前最大问题是依赖 macOS 26——这意味着大多数用户还需要等待。


八、使用场景与局限性

8.1 最佳使用场景

AI/ML 开发:特别是需要 GPU 访问的场景。Apple Silicon 的统一内存架构配合 Metal GPU 直通,在本地跑轻量级 AI 推理非常有价值。

# AI 推理容器(假设有 Metal 支持的镜像)
container run --rm --gpus all my-ai-app:latest python inference.py

多架构镜像构建:开发者需要同时构建 ARM64 和 x86-64 镜像,container 的多架构支持非常顺畅。

隐私敏感开发:不希望数据经过第三方 VM 的开发者。

替代 Docker Desktop:企业用户规避 Docker 订阅费用,同时获得更干净的容器隔离。

8.2 当前局限性

1. macOS 26 门槛:这是目前最大的限制。macOS 26 是 beta 系统,大多数开发者还在用 macOS 25 或更早版本,无法实际使用。

2. 生态系统尚不成熟:Docker Desktop 有完整的 Docker Compose、Docker Swarm、Kubernetes 支持。container 目前只是一个 OCI 运行时,没有 Docker Compose 集成(但这是可以期待的 roadmap)。

3. 没有 Docker Daemon API:无法直接用 docker build/docker run 命令,需要通过 container CLI。虽然功能覆盖了主要使用场景,但习惯 Docker 命令的用户需要适应。

4. 镜像构建速度:Builder VM 启动 + 构建流程比 Docker BuildKit 慢,首次构建冷启动有明显延迟。


九、技术原理进阶:Containerization 包的核心设计

9.1 镜像存储:OCIBundle 与 Content Store

container 的镜像存储使用标准 OCI Image Layout:

~/.local/share/container/
├── blobs/
│   └── sha256/     # 镜像层存储(解压后的文件系统)
├── oci-layout       # 元数据标记
└── index.json       # 镜像清单(Manifest)

拉取镜像时,container-core-images XPC Helper 负责从 registry 下载 manifest 和各层,然后解压到本地 content store。启动容器时,Containerization 包读取 content store,将文件系统作为 Virtio-9p 或 Virtio-FS 挂载到 VM。

9.2 VMInit:容器的"init 进程"

Linux 容器的 init 进程(PID 1)通常需要特殊处理(如处理僵尸进程)。container 使用定制的 vminit 镜像作为每个容器的 init 系统:

# ~/.config/container/config.toml
[vminit]
image = "vminit:latest"  # 可自定义 init 镜像

这个 vminit 负责:

  • 接收容器配置(环境变量、挂载点、命令)
  • 设置网络
  • 启动用户指定的进程(PID 1)
  • 处理信号转发(SIGTERM → 应用进程)

9.3 gRPC 与 Builder VM

镜像构建使用独立的 Builder VM,通过 gRPC 通信:

宿主机(gRPC Client)
        │
        │ gRPC (grpc-swift + swift-protobuf)
        │ TLS 加密
        ▼
Builder VM(Linux + BuildKit)
        │
        │ Dockerfile 解析
        ▼
执行 RUN 指令 → 构建层 → 生成 OCI Image

Builder VM 是按需启动的,构建完成后可以通过 container builder delete 清理。


十、未来展望:从工具到生态

10.1 可能的 Roadmap 方向

基于苹果以往开源项目的规律和 container 的设计,可以合理推测:

  1. Docker Compose 支持:这是目前最大的功能缺口,很可能在 1.0 之前加入
  2. Kubernetes 集成:通过 containerd shim 或者 CRI 实现
  3. macOS 25 向后兼容:随着 macOS 26 正式发布,官方可能通过条件编译支持旧系统
  4. VSCode Remote Containers:JetBrains 和 Microsoft 可能快速跟进支持 container 作为后端

10.2 对容器化生态的影响

苹果此举的战略意义可能远超工具本身:

  • 打破 Docker Desktop 垄断:给 macOS 开发者一个真正免费、开放、官方支持的容器方案
  • Swift 在系统编程领域的扩展:Containerization 包证明了 Swift 在高性能系统级编程中的可行性
  • 推动 OCI 标准普及:苹果完全拥抱 OCI 标准而非自搞一套,对整个容器生态是正向推动

总结

apple/container 是 2026 年容器化领域最重要的开源项目之一。它用 Swift + Virtualization.framework 重新定义了 macOS 上的容器化体验:per-container VM 的架构理念比共享 VM 更安全、更私密;OCI 全兼容意味着你可以无缝接入整个容器生态;Apple Silicon 原生优化和完全免费的 Apache 2.0 授权让 Docker Desktop 有了真正的竞争对手。

当然,目前 macOS 26 的门槛是最大的现实障碍。但按照苹果开源项目的迭代速度,一旦 macOS 26 正式版发布(预计 2026 年 Q4),container 有望快速成为 Apple Silicon 开发者首选的容器工具。

核心要点回顾:

  • ✅ 一个容器 = 一个轻量级 VM,隔离性更强
  • ✅ 完全 OCI 兼容,可与 Docker Hub / GitHub Packages / 自建 Harbor 无缝对接
  • ✅ Swift + Virtualization.framework 实现,性能接近原生
  • ✅ 多架构镜像一次构建(ARM64 + x86-64)
  • ✅ Apache 2.0,完全免费
  • ⚠️ 目前需要 macOS 26(beta)
  • ⚠️ 生态早期,Docker Compose 等功能待完善

如果你在 Apple Silicon Mac 上开发,并且不急于切换,现在可以先 clone 项目关注 watch,等 macOS 26 正式版发布后第一时间尝鲜。关注 apple/containerizationapple/container-builder-shim 这两个配套项目,它们的发展同样值得关注。


参考链接:

  • 项目主页:https://github.com/apple/container
  • Containerization 包:https://github.com/apple/containerization
  • Builder Shim:https://github.com/apple/container-builder-shim
  • API 文档:https://apple.github.io/container/documentation/
  • GitHub Releases(安装包):https://github.com/apple/container/releases

本文为程序员茄子(chenxutan.com)原创,转载需注明出处。

推荐文章

支付轮询打赏系统介绍
2024-11-18 16:40:31 +0800 CST
API 管理系统售卖系统
2024-11-19 08:54:18 +0800 CST
Web 端 Office 文件预览工具库
2024-11-18 22:19:16 +0800 CST
Go 如何做好缓存
2024-11-18 13:33:37 +0800 CST
PHP 代码功能与使用说明
2024-11-18 23:08:44 +0800 CST
阿里云发送短信php
2025-06-16 20:36:07 +0800 CST
Go 开发中的热加载指南
2024-11-18 23:01:27 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
使用 Go Embed
2024-11-19 02:54:20 +0800 CST
程序员茄子在线接单