Como usar o comando docker manifest push para enviar uma lista de manifestos

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker manifest push para gerenciar imagens multi-arquitetura. Começaremos criando uma lista de manifestos (manifest list), que permite que um único nome de imagem se refira a imagens construídas para diferentes arquiteturas e sistemas operacionais.

Após a criação da lista de manifestos, você praticará o envio (push) para um registro padrão e também explorará como enviar para um registro inseguro. Finalmente, você aprenderá como enviar e, em seguida, purgar a lista de manifestos local, garantindo o gerenciamento eficiente de suas imagens Docker.

Criar uma lista de manifestos

Nesta etapa, aprenderemos como criar uma lista de manifestos usando o comando docker manifest create. Uma lista de manifestos é uma lista de manifestos de imagem, permitindo que você use um único nome para se referir a imagens para diferentes arquiteturas e sistemas operacionais. Isso é particularmente útil para construir imagens multi-arquitetura.

Primeiro, vamos puxar (pull) duas imagens diferentes que usaremos para criar nossa lista de manifestos. Usaremos a imagem alpine para as arquiteturas amd64 e arm64.

docker pull alpine:latest
docker pull arm64v8/alpine:latest

Você deve ver uma saída indicando que as imagens estão sendo puxadas.

latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
latest: Pulling from arm64v8/alpine
...
Status: Downloaded newer image for arm64v8/alpine:latest

Agora, criaremos uma lista de manifestos chamada my-alpine:latest que inclui as duas imagens que acabamos de puxar. A sintaxe é docker manifest create MANIFEST_LIST IMAGE [IMAGE...].

docker manifest create my-alpine:latest alpine:latest arm64v8/alpine:latest

Se o comando for bem-sucedido, você não verá nenhuma saída. Este comando cria uma lista de manifestos local. Para ver as informações da lista de manifestos, você pode usar o comando docker manifest inspect.

docker manifest inspect my-alpine:latest

Você deve ver uma saída semelhante a esta, mostrando os detalhes da lista de manifestos, incluindo os manifestos para as arquiteturas amd64 e arm64.

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 528,
      "digest": "sha256:...",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 528,
      "digest": "sha256:...",
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    }
  ]
}

Isso confirma que a lista de manifestos my-alpine:latest foi criada com sucesso e inclui as imagens especificadas.

Enviar a lista de manifestos para um registro

Nesta etapa, enviaremos a lista de manifestos que criamos na etapa anterior para um registro Docker. Por padrão, docker push envia imagens individuais. Para enviar uma lista de manifestos, você precisa usar o comando docker manifest push.

Antes de enviar, precisamos de um registro para enviar. Para este laboratório, usaremos o Docker Hub. Se você não tiver uma conta no Docker Hub, pode criar uma gratuitamente. Você precisará fazer login no Docker Hub a partir do seu terminal.

docker login

Você será solicitado a inserir seu nome de usuário e senha do Docker Hub. Insira suas credenciais para fazer login.

Login with your Docker ID to push and pull images, scan them for vulnerabilities, sign and attest to them, and more.
Username: your_docker_username
Password: your_docker_password
Login Succeeded

Agora que você está logado, pode enviar a lista de manifestos. O formato para enviar para o Docker Hub é your_docker_username/manifest_list_name:tag. Vamos supor que seu nome de usuário do Docker Hub seja your_docker_username. Substitua your_docker_username pelo seu nome de usuário real do Docker Hub.

docker manifest push your_docker_username/my-alpine:latest

Você deve ver uma saída indicando que a lista de manifestos e as imagens associadas estão sendo enviadas para o registro.

Pushed manifest list your_docker_username/my-alpine:latest

Após a conclusão do envio, você pode verificar se a lista de manifestos existe em seu repositório do Docker Hub, visitando o site do Docker Hub ou puxando a imagem em uma arquitetura diferente.

Enviar a lista de manifestos para um registro inseguro

Nesta etapa, exploraremos como enviar uma lista de manifestos para um registro inseguro. Um registro inseguro é um registro que não usa certificados TLS/SSL, o que não é recomendado para ambientes de produção, mas pode ser útil para testes ou redes internas.

Por padrão, o Docker exige conexões seguras com registros. Para enviar para um registro inseguro, você precisa configurar o daemon Docker para permitir conexões inseguras para o endereço específico do registro.

Para este laboratório, simularemos um registro inseguro usando um registro local em execução sem TLS. Primeiro, vamos executar um contêiner de registro local. Mapearemos a porta 5000 no host para a porta 5000 no contêiner.

docker run -d -p 5000:5000 --name registry registry:2

Você deve ver uma saída semelhante a esta, indicando que o contêiner está em execução:

Unable to find image 'registry:2' locally
2: Pulling from library/registry
...
Status: Downloaded newer image for registry:2
a1b2c3d4e5f6...

Agora, precisamos configurar o daemon Docker para confiar neste registro inseguro em localhost:5000. Isso requer a modificação do arquivo de configuração do daemon Docker. A localização deste arquivo pode variar, mas na maioria dos sistemas Linux, é /etc/docker/daemon.json.

Usaremos sudo nano para editar este arquivo.

sudo nano /etc/docker/daemon.json

Se o arquivo não existir, você pode criá-lo. Adicione ou modifique a chave insecure-registries para incluir localhost:5000. O conteúdo do arquivo deve ser semelhante a este:

{
  "insecure-registries": ["localhost:5000"]
}

Salve o arquivo e saia do editor (Ctrl+X, Y, Enter no nano).

Após modificar a configuração, você precisa reiniciar o daemon Docker para que as alterações entrem em vigor.

sudo systemctl restart docker

Agora, você pode marcar a lista de manifestos com o endereço do registro inseguro e enviá-la. Usaremos a lista de manifestos my-alpine:latest criada na primeira etapa.

docker manifest create localhost:5000/my-alpine:latest alpine:latest arm64v8/alpine:latest
docker manifest push localhost:5000/my-alpine:latest

Você deve ver uma saída indicando que o envio foi bem-sucedido, mesmo que o registro seja inseguro.

Pushed manifest list localhost:5000/my-alpine:latest

Isso demonstra como enviar uma lista de manifestos para um registro inseguro após configurar o daemon Docker.

Enviar e remover a lista de manifestos local

Nesta etapa, aprenderemos como enviar uma lista de manifestos e remover automaticamente a cópia local após um envio bem-sucedido. Isso pode ser útil para limpar seu ambiente local após enviar imagens de várias arquiteturas.

O comando docker manifest push possui uma flag --purge que remove a lista de manifestos local após ela ter sido enviada com sucesso para o registro.

Primeiro, vamos garantir que temos a lista de manifestos my-alpine:latest localmente. Criamos isso na primeira etapa. Você pode inspecioná-la para confirmar sua existência.

docker manifest inspect my-alpine:latest

Você deve ver os detalhes da lista de manifestos como antes.

Agora, enviaremos esta lista de manifestos para o Docker Hub novamente, mas desta vez usaremos a flag --purge. Lembre-se de substituir your_docker_username pelo seu nome de usuário real do Docker Hub.

docker manifest push --purge your_docker_username/my-alpine:latest

Você deve ver uma saída indicando que o envio está em andamento e, em seguida, uma mensagem confirmando que a lista de manifestos foi purgada.

Pushed manifest list your_docker_username/my-alpine:latest
Purged manifest list your_docker_username/my-alpine:latest

Após a conclusão do comando, a lista de manifestos local my-alpine:latest não deverá mais existir. Você pode verificar isso tentando inspecioná-la novamente.

docker manifest inspect my-alpine:latest

Desta vez, você deve ver uma mensagem de erro indicando que a lista de manifestos não foi encontrada.

no such manifest: my-alpine:latest

Isso confirma que a flag --purge removeu com sucesso a lista de manifestos local após enviá-la para o registro.

Finalmente, vamos limpar o contêiner de registro inseguro local que iniciamos na etapa anterior.

docker stop registry
docker rm registry

Você deve ver uma saída confirmando que o contêiner foi parado e removido.

registry
registry

Resumo

Neste laboratório, aprendemos como usar o comando docker manifest para gerenciar imagens de múltiplas arquiteturas. Começamos puxando duas versões de arquitetura diferentes da imagem alpine. Em seguida, usamos docker manifest create para combinar essas imagens em uma única lista de manifestos, permitindo que nos referíssemos a elas com um único nome. Verificamos a criação da lista de manifestos usando docker manifest inspect.

Posteriormente, exploramos como enviar esta lista de manifestos para um registro Docker usando docker manifest push. Também abordamos o caso específico de envio para um registro inseguro, adicionando a flag --insecure. Finalmente, aprendemos como enviar a lista de manifestos e, simultaneamente, remover a cópia local usando a flag --purge com o comando docker manifest push.