Abrindo mares: Docker init, crie Dockerfiles e Compose com um comando
Tags: docker, developers, news, devops
Published: 2023-05-12 21:11:14

Lembro como se fosse hoje quando comecei a ouvir sobre _containers_, _docker_, _imagens_… Parecia que minha cabeça explodiria de tantas perguntas - "Mas como que vou colocar uma aplicação inteira dentro de uma imagem?… Como faço para acessar o banco de dados se ele não está instalado no meu computador?" - Acho que muitos já passaram por isso ou ainda passam e é completamente normal quando estamos aprendendo algo novo, estamos em constante evolução. 

Para começarmos a nossa evolução, aqui vai um breve resumo do que são essas 3 palavras que você sempre vai ouvir quando o assunto é docker: 

**imagens**: contém o código-fonte executável do aplicativo, bem como todas as ferramentas, bibliotecas e dependências que o código da aplicação precisa para ser executado. Quando você executa a imagem do Docker, ela se torna um container.

**containers:** são unidades executáveis de software, nas quais o código da aplicação é empacotado junto com todas suas bibliotecas e dependências, para que o código possa ser executado em qualquer lugar, seja no desktop local ou na nuvem. Resumindo, isso ajuda a minimizar a chance de você ouvir aquela frase: "na minha máquina funciona" 😅.

**Docker:** é uma ferramenta open-source que possibilita executarmos, criarmos e controlarmos containers.

Assim como nós, as ferramentas também estão sempre em evolução. Com o passar do tempo o Docker foi entendendo que é preciso facilitar a interação do **desenvolvedor** com a ferramenta e que não é necessário ser um expert em DevOps ou Infra para conseguir lidar com as aplicações dentro de containers. 

O início do trabalho com aplicações dentro de containers pode ser confuso. Saber qual imagem utilizar, o que fazer para acessar a porta da aplicação, como baixar dependências do projeto durante o build da imagem nem sempre é tão óbvio. E foi pensando nisso foi criado o comando: `docker init`.

Essa nova ferramenta, creio que podemos chama-lá assim, é uma forma de você iniciar um projeto com os arquivos necessários para rodar dentro de um container:

```bash
$ docker init

Welcome to the Docker Init CLI!

This utility will walk you through creating the following files with sensible defaults for your project:
  - .dockerignore
  - Dockerfile
  - compose.yaml
```

Após executar o comando `docker init` ele mostra quais arquivos serão criados para nós. Vou aproveitar e explicar o que é cada um deles:

**.dockerignore:** aquele famoso arquivo que diz para nossos versionadores o que eles devem ignorar na hora de subir as mudanças que estamos fazendo em nosso código.

**Dockerfile:** onde a mágica acontece... aqui estará toda a descrição de imagens, atualmente são duas. Uma utilizada para o build, no caso uma mais completa e geralmente com todos os SDKs da linguagem e outra para criar a versão final, no caso quase sempre uma alpine que é a menor distro linux que temos disponível.

**compose.yaml:** ele é o arquivo que possibilita você definir e rodar vários containers de uma só vez. Por exemplo, se você tem um banco de dados e um cache você pode configurá-los dentro do compose e quando executar o comando, todos os containers são iniciados de uma vez usando as configurações que existem neste arquivo.

Em seguida temos que escolher qual a linguagem do projeto que queremos implementar: 

```
Let's get started!

? What application platform does your project use?  [Use arrows to move, type to filter]
> Go - suitable for a Go server application
  Python - suitable for a Python server application
  Node - suitable for a Node server application
  Other - general purpose starting point for containerizing your application
  Don't see something you need? Let us know!
  Quit

```

Como ainda é uma ferramenta que está em desenvolvimento _- até a data deste post -_ ela ainda não tem suporte para todas as linguagens e frameworks. Porém já contamos com Go, Python e Node parar criar nossas imagens e o time de desenvolvimento está trabalhando para lançar o quanto antes o suporte para Java, Rust, e .NET. De quebra podemos preencher um formulário para dizer qual linguagem gostaríamos de ter suporte no `docker init`. Aqui está o [link do google form](https://docs.google.com/forms/d/e/1FAIpQLSd3QBffQRLOihKD2G4rjsq0gQSG4oLT74Is062BQsnhxlPvEA/viewform).

Em resumo, o `docker init` é uma ferramenta para facilitar o processo para o desenvolvedor que deseja criar os arquivos Docker e _containizar_ sua aplicação, reduzindo um pouco o risco de erros e inconsistência  para quem não está tão acostumado ainda com o mundo Docker.

Deixo aqui também a [documentação oficial](https://docs.docker.com/engine/reference/commandline/init/) do `docker init`. Caso vocês queiram ler um pouco mais sobre esta nova ferramenta.