Por Thiago Marques
O pai ta on!!
Chegamos a falar um pouco sobre os repositórios de imagens no post sobre arquitetura, que é basicamente um registro central de containers. E como já abordamos anteriormente, a utilização de containers proporciona diversas vantagens, sobretudo em uma cultura DevOps, e um container registry, possui um papel interessante nesse processo: distribuir a imagem mais atualizada, seja de forma publica (para usuários em geral), seja de forma privada (para times de teste, homologação e produção).
Tipos de repositórios
Existem dois tipos de repositórios: os públicos e os privados.
Os repositórios públicos são ótimos para projetos abertos de sistema operacionais, como ubuntu, alpine, para programas como node, redis, nginx, e até para aplicações como grafana, zabbix e elasticsearch.
Note que em um repositório público qualquer pessoa nessa tal de internet pode fazer o pull da imagem, e utilizá-la da forma como lhe for útil.
Já os repositórios privados são exclusivos, e assim mais indicados para aplicações internas, como o desenvolvimento interno com informações sensíveis. Além disso, esse tipo de repositório oferece mais vantagens, como suporte a autenticação, controle de autorizações e acesso, rastreamento de registros por usuários etc.
Docker Hub
Talvez o Docker Hub seja o repositório mais utilizado. Além de ser o repositório padrão do Docker (isso quer dizer que quando executa o docker run, é nesse repositório que o pull ocorre (caso ele não exista localmente)).
O Docker Hub possui uma versão gratuita, e algumas pagas, onde basicamente a diferença é na utilização de repositórios privados e scan de vulnerabilidades (apenas nas versões pagas), e limites de pulls para versão gratuita (200 pulls a cada 6horas).
Elastic Container Registry
O ECR é o repositório da AWS, e tem características similares ao Docker Hub, contudo oferece algumas vantagens, disponibilidade de 99,9%, imagens imutáveis (garantia que não se pode sobrescrever uma imagem depois que ela está publicada), scan de vulnerabilidades, repositórios públicos e privados, limite de 1000 pulls por segundo e 10 push por segundo.
Harbor
Caso você queria um repositório privado e interno, você pode utilizar o Harbor, que também serve como repositório cloud native, Charts Helm, integração de segurança com outras ferramentas como a HashiCorp Vault, e até criar réplicas em provedores de cloud públicas.
Registrando uma imagem no Docker Hub
Para registrar uma imagem no Docker Hub é necessário ter uma conta na plataforma e criar um repositório:
Após a criação do container na plataforma, agora efetuaremos o login na CLI, e fazer o push para o repositório:
docker login
Note que para realizar o push, o nome do repositório tem que ser o mesmo da sua imagem. Em nosso exemplo thiagosagara/darede. Caso o nome fosse diferente um erro similar a esse aqui de baixo seria apresentado:
[root@ip-172-31-0-221 docker]# docker push thiagosagara/myapp
Using default tag: latest
The push refers to repository [docker.io/thiagosagara/myapp]
tag does not exist: thiagosagara/myapp:latest
Com o nome correto basta executar o docker push <[imagem]>. Por padrão ela vai subir com a tag latest.
docker push thiagosagara/darede
Por fim podemos validar a imagem no repositório, assim como comparar o digest e garantir que é a mesma imagem que realizamos o upload.
Registrando uma imagem no ECR
Agora pensando em cloud, o registro no repositório da AWS é bem similar ao do Docker Hub, ou seja, você cria o repositório, faz o login, e faz o upload com o mesmo nome. Abaixo veremos passo a passo:
Primeiro criaremos o repositório público, clicando em ‘create repositor’, e depois colocamos o nome do repositório.
Depois do repositório criado, precisamos fazer o login nele. Como o comando docker login por padrão se registra no docker hub precisamos informar em qual repositório vamos logar.
É um “senhor” comando, contudo não se preocupe, no próprio repositório clicando em “View push commands” a AWS vai mostrar o comando inteiro.
aws ecr get-login-password –region us-east-1 –profile Sandbox | docker login –username AWS –password-stdin 787431072858.dkr.ecr.us-east-1.amazonaws.com
Obs.: Note que no meu exemplo, além do comando sugerido pela AWS coloquei o –profile Sandbox. Isso é necessário quando você está utilizando roles para acesso ao ambiente.
Sem esse parâmetro o push ia ficar em loop com o log de Retrying in X seconds
Após o registro é necessário criar a tag exatamente igual ao repositório (como é no Docker Hub), e depois o docker push para o repositório
docker tag thiagosagara/darede 787431072858.dkr.ecr.us-east-1.amazonaws.com/darede:latest
docker push 787431072858.dkr.ecr.us-east-1.amazonaws.com/darede:latest
E finalmente temos nossa imagem publicada no repositório da AWS (ECR). Note que em questão de compressão, o algoritmo da Docker Hub acaba sendo ligeiramente mais eficiente (2,5% melhor).
Veja os outros artigos sobre container:
Entendendo Docker
Docker Compose
Arquitetura Docker
O que é DockerFile?
Build do DockeFile
That’s all folks! Be Happy!!!
Thiago Marques
Technical Account Manager
thiago.marques@darede.com.br
Technical Account Manager da Darede, formato em Rede de Computadores, e pós graduado em Segurança da Informação. Possui ampla experiência em Datacenters e Service Providers, além de ser um entusiasta em DevOps e mercado financeiro.