Aumentando a Segurança de suas imagens com Azure Container Registry
Tags: docker, distributedsystems, node, tutorial
Published: 2020-04-30 21:37:09

_Photo por Tim Mossholder no Unsplash_

Nos últimos anos vimos um crescimento muito grande nas aplicações distribuídas, principalmente aquelas que estão utilizando o ecossistema do [Kubernetes](https://docs.microsoft.com/azure/aks/?WT.mc_id=blog-devto-ludossan). Esta arquitetura é muito resiliente porém traz alguns problemas que devem ser solucionados com outras ferramentas específicas.

Por exemplo, quando estamos utilizando um cluster, temos que hospedar as nossas imagens do Docker em algum lugar, geralmente utilizamos o Docker Hub para esta tarefa, porém a versão gratuíta do mesmo só possui liberdade para criarmos imagens públicas, e mesmo no plano pago, o número de imagens privadas é limitado! Portanto, muitas empresas passam pelo problema de terem que buscar um local privado para armazenar as suas imagens.

Por conta deste problema, vou começar uma pequena série de artigos onde explico as bases da arquitetura de containers do ponto de vista prático, utilizando algumas ferramentas para conseguir resolver tais situações, no final devemos ter um conjunto de instruções que mostram como você poderá criar seu próprio ecossistema distribuído e colocar a sua aplicação no ar!

Para essa sequencia de artigos, você vai precisar:

- Conhecimento básico em [Docker](https://docs.docker.com/)
  - E o [Docker CLI](https://docs.docker.com/get-docker/) instalado na máquina
- Uma [Azure Subscription](http://azure.microsoft.com/?WT.mc_id=blog-devto-ludossan), se você está criando a conta pela primeira vez, então você poderá usufruir dos créditos iniciais e não precisará pagar nada!
- Um conhecimento básico no [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?view=azure-cli-latest&WT.mc_id=blog-devto-ludossan)

Para começar, vamos falar um pouco sobre imagens privadas de forma simples e rápida.

# Imagens privadas com [Azure Container Registry](https://docs.microsoft.com/azure/container-registry/?WT.mc_id=blog-devto-ludossan)

Uma das ferramentas para criar e controlar imagens privadas é o [Azure Container Registry](https://docs.microsoft.com/azure/container-registry/?WT.mc_id=blog-devto-ludossan). Ele permite que você crie seu próprio registro de containers de forma que é possível armazenar e controlar todas as suas imagens Docker de forma completa. E ele permite tanto imagens públicas quanto privadas!

# Container registries

Container registries são repositórios onde podemos armazenar e baixar imagens de containers, os mais famosos são os registros para imagens Docker, porém existem outros para outros tipos de imagens.

Estes registros permitem que possamos baixar nossas imagens remotamente sem utilizar espaço na máquina e também garantem a segurança para backups. A maioria dos registros públicos de imagens são gratuitos, como o Docker Hub, porém, para que possamos subir imagens privadas, a maioria se torna pago.

## Criando um Container Registry na Azure

É possível criar um [container registry](https://docs.microsoft.com/azure/container-registry/?WT.mc_id=blog-devto-ludossan) através do [Portal da Azure](https://portal.azure.com/?WT.mc_id=blog-devto-ludossan) e também pelo [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?view=azure-cli-latest&WT.mc_id=blog-devto-ludossan). Para este tutorial, vamos iniciar pelo portal, pois vamos fazer apenas alguns comandos rápidos.

Como primeiro passo, acesse seu [Portal da Azure](https://portal.azure.com/?WT.mc_id=blog-devto-ludossan) e pesquise por `Container Registries`.

![](https://drive.google.com/uc?id=1WQ3U8LB07PNp0YhL91qcH1Jkt7mj-bgb)

Ao clicar, selecione a opção "Create Container Registry":

![](https://drive.google.com/uc?id=15kC1X5gmgXMLBe6KAR6kuaIKT7cQEcXv)

Então preenchemos as informações necessárias:

![](https://drive.google.com/uc?id=15EJfkKfHnzr15ZSY4iWVLESq0j0xLS6F)

- __Resource Group__: Vamos criar um novo grupo para colocar tudo que for referente a este artigo.
- __Registry Name__: Esta parte é muito importante porque será o registro de DNS que você vai utilizar para que você possa baixar as imagens
- __Location__: Selecione qualquer localização que seja interessante, selecionei Brazil South por conta da proximidade geográfica
- __Admin User__: Quando estamos com esta opção ativada, podemos utilizar o nosso _registry name_ como usuário e as chaves providenciadas como senha para logar no nosso registro através do Docker, se desativarmos esta opção teremos que criar os usuários manualmente. Para este artigo, vamos utilizar o usuário administrador por questões de facilidade (veja mais na [documentação](https://docs.microsoft.com/azure/container-registry/container-registry-authentication?WT.mc_id=blog-devto-ludossan))
- __SKU__: Neste ponto escolheremos o _Basic_ pois estamos fazendo um exemplo, porém para situações reais, o ideal é que você escolha o tipo de SKU que satisfaça suas necessidades. As diferenças entre cada um deles é a velocidade de transferência, segurança, firewalls, replicação e também armazenamento disponível, veja uma [lista](https://docs.microsoft.com/azure/container-registry/container-registry-skus?WT.mc_id=blog-devto-ludossan)

Vamos então criar o nosso registro. O processo todo não deve demorar e você deve logo ter a confirmação de criação:

![](https://drive.google.com/uc?id=1Zus97TQ7m2HcicqsUZrMYDp4wTU7Clcj)

## Integrando o Docker com a Azure

Agora, para podermos, de fato, usufruir do serviço, vamos ter que conectar o nosso client do Docker no registro que acabamos de criar. Para isso, vamos até a seção `Access Keys`, lá vamos ter o nosso usuário e senha:

![](https://drive.google.com/uc?id=1-6QdzWSLJqWdBandI0XHAGgtEbZ2WVYQ)

Agora que temos todas as informações que precisamos, vamos executar o comando de login:

```bash
$ docker login <registryname>.azurecr.io
```

O CLI então vai perguntar seu usuário, que é o username que está descrito na imagem anterior, e uma senha, que pode ser qualquer uma das duas senhas dadas no portal. No caso deste CR ficamos assim:

![](https://drive.google.com/uc?id=1H6afg0N4qbZfWP0bOy6cLdqaHF6NqruH)

Agora o que precisamos fazer é criar uma imagem e enviar para nosso repositório!

## Enviando uma imagem para o Azure CR

Vamos construir uma imagem simples usando [Node.js](https://docs.microsoft.com/azure/javascript/?WT.mc_id=blog-devto-ludossan). Vamos basicamente criar uma nova pasta e, dentro dela, vamos criar um arquivo `index.js`:

```javascript
const http = require('http')

http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  res.write('Hello World!')
  res.end()
}).listen(8080)
```

E depois vamos criar um `Dockerfile`:

```dockerfile
FROM node:current-alpine
WORKDIR /src

COPY index.js /src
CMD ["node", "index.js"]
```

Vamos então rodar o comando `docker build . -t <registryname>.azurecr.io/simple-node-api:latest` para poder construir a imagem. Agora podemos executar nossa imagem localmente usando o comando `docker run --name simple-api --rm -d -p 8080:8080 simple-node-api`.

> É super importante colocarmos o `<registryname>.azurecr.io` antes do nome da imagem pois será assim que vamos diferenciar as imagens que enviamos para cada CR.

Pronto! Temos a nossa API pronta, vamos fazer o upload da mesma para dentro do nosso container registry. E isso é tão simples quanto fazer o upload de uma imagem para qualquer outro lugar! Basta executar um `docker push <nome da imagem>`:

![](https://drive.google.com/uc?id=1iR2boz9KheiRjw7qGwhg2IcsWpW00wL7)

E agora podemos ver que nossa imagem está segura no nosso CR ao clicarmos na aba `repositories`:

![](https://drive.google.com/uc?id=1JJUblixNLlOAimqOSZt9bPSTclx3b1V7)

## Executando localmente uma imagem do CR

Para executarmos localmente a imagem, basta executar o mesmo comando que executamos localmente, porém com o nome oficial da imagem:

```bash
$ docker run --name simple-api --rm -d -p 8080:8080 distributedapps.azurecr.io/simple-node-api
```

# Conclusão

Neste artigo apenas criamos uma imagem e aprendemos como podemos utilizar o [Azure CR](https://docs.microsoft.com/azure/container-registry/?WT.mc_id=blog-devto-ludossan) de forma prática e simples. Além de possuir os serviços de containers privados, o [Azure CR](https://docs.microsoft.com/azure/container-registry/?WT.mc_id=blog-devto-ludossan) também possui outras funcionalidades, como replicação, criptografia, webhooks e muitas outras que vamos abordar em outros tópicos mais a frente enquanto exploramos o ecossistema cloud!

Não deixe de acompanhar mais do meu conteúdo no [meu blog](https://blog.lsantos.dev/?utm_source=devto&utm_medium=article&utm_campaign=acr) e se [inscreva na newsletter](https://blog.lsantos.dev/signup?utm_source=devto&utm_medium=article&utm_campaign=acr) para receber notícias semanais!

Espero que tenham gostado e, se quiserem me mandar uma mensagem ou qualquer feedback, podem ficar a vontade em minhas redes!

| [Website](https://lsantos.dev) | [GitHub](https://github.com/khaosdoctor) | [Facebook](https://fb.com/lsantos.dev) | [LinkedIn](https://linkedin.com/in/lhs-santos) | [Twitter](https://twitter.com/_staticvoid)
|---|---|---|---|---