Como funciona um registro de contêineres: fazendo push/pull de imagens diretamente
(labs.iximiuz.com)- O registro de contêineres parece simples à primeira vista, mas para depurar problemas como tags incorretas, incompatibilidade de plataforma, camadas ausentes ou falhas na exclusão real, é essencial entender como ele funciona por dentro
- O núcleo do registro é um armazenamento de blobs endereçado por conteúdo (content-addressable), no qual todas as camadas, arquivos de configuração e artefatos são armazenados usando o digest como endereço
- O push de imagens segue a ordem de enviar os blobs e depois agrupá-los em um manifest, enquanto o pull faz o inverso: primeiro recebe o manifest e depois baixa os blobs em sequência
- A exclusão de imagens não é concluída apenas com untag; para removê-las de fato, é preciso primeiro verificar as camadas compartilhadas por outros manifests e então excluir os blobs diretamente
- Imagens multiplataforma são implementadas mantendo os endpoints da API existentes exatamente como estão, introduzindo apenas uma camada extra de indireção chamada image index (manifest list)
Visão geral da API de Registry
- A maioria dos registros de contêineres modernos implementa a OCI Distribution Specification, que define um protocolo de API para padronizar a distribuição de conteúdo
- A API de Registry é, na prática, concisa e fácil de entender, e pode ser manipulada diretamente apenas com
curl
Upload e download de blobs
- Um registro é essencialmente um armazenamento de blobs endereçado por conteúdo, no qual o arquivo é hasheado localmente e enviado usando o digest como endereço
- A forma mais simples de upload é o Monolithic PUT, uma estrutura em 2 etapas em que se inicializa a sessão com
POSTe depois se envia o blob comPUT- Para arquivos grandes, o upload em partes com
POST + PATCH + PUTé mais eficiente, mas para blobs pequenos o Monolithic PUT é suficiente
- Para arquivos grandes, o upload em partes com
- Quando o upload é concluído com sucesso, a resposta
HTTP/2 201 Createdretorna junto com o cabeçalhoLocation, que aponta para a localização do novo blob - Para baixar, basta conhecer o digest e fazer
GET /v2/<repo>/blobs/<digest>
Push de imagem
- Procedimento de push de imagem: (1) upload dos blobs de cada camada rootfs → (2) upload do blob de configuração da imagem → (3) push do arquivo manifest, que reúne todos os digests em um único documento JSON
- O manifest é enviado pelo endpoint
PUT /v2/<repo>/manifests/<tag>, e é nesse momento que a tag é criada - Clientes reais (por exemplo,
docker push) fazem o upload dos blobs em paralelo, mas para entender o princípio também é possível tratá-los em sequência - Exemplo de estrutura de diretório da imagem:
config.json,layer-1.tar.gz,layer-2.tar.gz,manifest.json
Consulta da lista de tags
- É possível consultar a lista completa de tags de um repositório específico pelo endpoint
GET /v2/<repo>/tags/list - Essa funcionalidade não é exposta no CLI do
docker, sendo acessível apenas comcurlou ferramentas comocraneeregctlcraneeregctlapenas encapsulam o mesmo endpoint no comandols
Pull de imagem
- O procedimento de pull é o inverso do push: (1) consultar o manifest com
GET /v2/<repo>/manifests/<tag>→ (2) baixar todos os blobs usando os digests indicados no manifest - Além de camadas rootfs e configuração de imagem, manifests modernos também são usados como armazenamento genérico para referenciar blobs de artefatos arbitrários, como charts Helm, SBOM, atestados de procedência (provenance attestation) e pesos de LLM
Exclusão de imagem
- Excluir uma imagem não é algo simples, e remover a tag (untag) por si só não apaga o manifest
- Procedimento de exclusão completa:
- (1) remover a tag com
DELETE /v2/<repo>/manifests/<tag> - (2) consultar o manifest pelo digest para identificar todos os blobs referenciados
- (3) excluir seletivamente apenas os blobs que não estejam sendo compartilhados por outros manifests
- (4) excluir o blob do manifest com
DELETE /v2/<repo>/blobs/<manifest-digest>
- (1) remover a tag com
- Como o registro é um armazenamento endereçado por conteúdo, várias imagens podem compartilhar a mesma camada rootfs, e a exclusão pode afetar todas as imagens que referenciam essa camada
- Como alternativa, também é possível remover todas as tags e então depender da configuração de garbage collection do registro, mas em registros públicos isso nem sempre está ativado
Imagens multiplataforma
- Imagens multiplataforma são implementadas sem alterar a estrutura da API de Registry — sem adicionar ou modificar endpoints, reutilizando a API existente como está
- Forma de composição:
- primeiro, cada variante de plataforma única (amd64, arm64 etc.) é enviada individualmente com seu próprio manifest, com base em digest
- depois, é feito o push de um manifest de nível superior chamado image index (manifest list) junto com a tag
- Ao chamar
GET /v2/<repo>/manifests/<tag>, o retorno pode ser um manifest de plataforma única ou um image index, e quem faz a chamada precisa distingui-los pelo content type do documento retornado - No fim, o suporte a multiplataforma apenas adiciona uma camada de indireção e uma etapa de upload/download de documento index à estrutura existente
Protegendo a API de Registry
- A OCI Distribution Spec não define de forma rígida o método de autenticação, mas a maioria dos registros reais usa autenticação HTTP Basic
- Para evitar que credenciais sejam transmitidas em texto puro, a operação deve ocorrer obrigatoriamente sobre HTTPS
Ainda não há comentários.