Sobre o projeto

Containerization é um pacote Swift da Apple que permite que aplicativos executem contêineres Linux no macOS. Ele é construído sobre o Virtualization.framework da Apple em Apple silicon e expõe um conjunto de APIs para todo o ciclo de vida do contêiner. Os recursos principais incluem gerenciar imagens OCI e interagir com registros remotos, criar e popular sistemas de arquivos ext4, interagir com a família de sockets Netlink, construir um kernel Linux otimizado para tempos de inicialização rápidos, gerar máquinas virtuais leves e gerenciar o ambiente de runtime, gerar e interagir com processos em contêineres, e usar Rosetta 2 para executar contêineres linux/amd64 em Apple silicon. Em termos de design, cada contêiner Linux é executado dentro de sua própria máquina virtual leve. Os clientes podem atribuir endereços IP dedicados por contêiner, eliminando a necessidade de encaminhamento individual de portas. Os contêineres alcançam tempos de inicialização inferiores a um segundo graças a uma configuração otimizada do kernel Linux e a um sistema de arquivos raiz mínimo com um sistema init leve. O subprojeto vminitd é um pequeno sistema init gerado como o processo inicial dentro da VM; ele expõe uma API gRPC sobre vsock para que o ambiente de runtime possa ser configurado e processos em contêineres possam ser iniciados, além de encaminhar E/S, sinais e eventos de volta ao processo chamador. O projeto abstrai o VMM por trás dos protocolos VirtualMachineManager / VirtualMachineInstance e inclui dois backends. O backend macOS usa o Virtualization.framework diretamente (VZVirtualMachineManager), sem exigir binários extras. O backend Linux usa cloud-hypervisor mais KVM (CHVirtualMachineManager), executando um subprocesso cloud-hypervisor por VM controlado por sua API REST-on-UDS, com virtio-blk para armazenamento em blocos, virtio-fs (um virtiofsd por compartilhamento) para diretórios compartilhados, TAP para rede e vsock híbrido do cloud-hypervisor para alcançar o mesmo contrato do vminitd que o caminho macOS. O backend Linux requer cloud-hypervisor e virtiofsd no host, acesso KVM e configuração prévia de TAP/bridge/NAT para rede. Os requisitos para compilar o pacote são um Mac com Apple silicon, macOS 26 e Xcode 26; versões mais antigas do macOS não são suportadas. O init do convidado Linux (vminitd/vmexec) é compilado como um binário estático dentro de um contêiner Linux, em vez de ser compilado de forma cruzada no Mac, portanto nenhuma toolchain Swift ou Static Linux SDK é necessária no host — o CLI apple/container é usado em vez disso. O executável cctl serve como um playground para explorar a API, com comandos para manipular imagens OCI, fazer login em registros, criar blocos de sistema de arquivos raiz e executar contêineres Linux simples. Um kernel Linux é necessário para gerar VMs leves no macOS. O repositório inclui uma configuração otimizada de kernel no diretório kernel/, com um ambiente de compilação em contêiner para compilá-lo. A configuração é mínima para suportar tempos de início rápidos e um ambiente leve, e o Containerization fornece APIs de primeira classe para usar diferentes configurações e versões de kernel por contêiner. Kernels fornecidos pelo usuário são suportados, com funcionalidade testada a partir da versão 6.14.9 do kernel. Kernels pré-compilados devem ter drivers VIRTIO compilados no kernel (não apenas como módulos); o projeto Kata Containers fornece um kernel adequado. Fluxo de compilação e teste: instale o Xcode recomendado, defina o diretório de desenvolvedor ativo, instale o CLI apple/container e execute `make all` para compilar e `make test integration` para executar os testes. Um kernel é necessário para os testes de integração; `make fetch-default-kernel` obtém um kernel padrão. As interfaces Protobuf podem ser regeneradas com `make protos`, um hook de pré-commit pode ser instalado com `make pre-commit`, e a documentação da API pode ser gerada localmente com `make docs` e `make serve-docs`. O projeto está na versão 0.1.0, o primeiro lançamento oficial. A estabilidade do código-fonte é garantida apenas dentro de versões menores (por exemplo, entre 0.1.1 e 0.1.2); consumidores que desejam evitar atualizações potencialmente incompatíveis com o código-fonte podem fixar dependências com .upToNextMinorVersion(from: "0.1.0"). Contribuições são bem-vindas por meio do arquivo CONTRIBUTING.md.