Para que serve o Docker? (E um exemplo com o Neo4j)

Wellington Monteiro
8 min readMar 13, 2022

--

Por que este tutorial da internet mostrou o passo-a-passo tudo certo e aqui no meu computador não funcionou? Juro que segui tudo!

No meu computador funcionava! Não sei o que está acontecendo para parar de funcionar por aí.

Já revisitaremos estas frases as quais você, (possível) profissional e estudante de TI, já se deparou. Para começo de conversa, nada mais justo do que recomendar outros artigos que explicam com muita qualidade sobre o Docker [1, 2, 3].

Em breve, este pão fará sentido (espero). Photo by Nadya Spetnitskaya on Unsplash

Dito isso, vale a pena você saber, de maneira resumida:

  1. A virtualização procura simular vários hardwares e sistemas dentro de um único hardware e sistema “real”.
    1.1 Um exemplo de virtualização é a simulação de um celular dentro do seu notebook enquanto desenvolve um app novo: você não tem um celular na sua mão para testar o seu aplicativo, mas consegue ter a mesma experiência com uma janela no seu computador que simule o funcionamento de um celular;
    1.2 Outro exemplo é um emulador de Mega Drive ou PlayStation sendo executado de dentro do seu computador. Você não possui o videogame de fato na sua sala, mas consegue simular o seu funcionamento a partir do seu computador.
  2. Containers e VMs (virtual machines) são tipos de virtualização
    2.1 As VMs virtualizam uma máquina completa, desde o seu sistema operacional até as aplicações que rodam dentro dela.
    2.2 Os containers virtualizam somente as aplicações acima do nível do sistema operacional (vou falar mais sobre isso em breve).
  3. O Docker é uma plataforma que oferece containers (não é a única solução do mercado que faz isso, mas é a mais popular)
  4. O Docker possui imagens. Imagens são templates usados para rapidamente criar quantos containers precisarmos.
  5. As imagens são construídas a partir de arquivos contendo todas as instruções necessárias chamadas de Dockerfiles.
    5.1 Imagine que o Dockerfile é o manual de instruções para se fazer um pão caseiro; a imagem é a massa de pão e o container são os pães prontos. Você precisa do Dockerfile para dar origem à sua imagem. Com a imagem pronta, você pode criar quantos containers quiser.
  6. O Docker é bem usado em DevOps e MLOps por conta de algumas vantagens como, por exemplo: uso de memória; flexibilidade; escalabilidade (ou seja: dependendo dos custos e do volume de acesso poderemos rapidamente aumentar ou diminuir o uso de containers); e portabilidade. A portabilidade é especialmente interessante porque evita frases como:

Por que este tutorial da internet mostrou o passo-a-passo tudo certo e aqui no meu computador não funcionou? Juro que segui tudo!

No meu computador funcionava! Não sei o que está acontecendo para parar de funcionar por aí.

Problemas assim são causados porque algumas configurações podem estar ligeiramente diferentes entre um computador e outro. Assim, seria muito comum termos instruções que funcionam em um lugar, mas não funcionam no outro só por causa de alguma atualização ou versão obscura de algum software instalado no computador.

Dito isso, olhe a imagem abaixo. À direita nós temos um exemplo clássico de 3 VMs. Você pode ter uma única infraestrutura (que pode ser o seu computador/notebook/servidor) e, usando os seus recursos, você teria as suas VMs rodando. O problema disso, como você pode imaginar, é que instalar uma nova VM do zero demora um pouco (se você já formatou um computador alguma vez saberá do que estou falando). Também ocupam muita memória e espaço de forma desnecessária (você realmente precisaria de tudo o que um Linux/Windows tem a oferecer para rodar um algoritmo em Python que você desenvolveu? Sério mesmo? Precisaria daquele papel de parede, do bloco de notas, do driver da webcam e de alguns jogos que poderiam vir por padrão só para rodar o seu algoritmo?).

À esquerda temos um exemplo de 6 aplicações utilizando o Docker. Estas aplicações usam um mesmo sistema operacional compartilhado (Windows/Linux) e, com isso, possuem um uso mais inteligente dos seus recursos — ou seja, roda mais coisas travando menos. Interessante, não é?

A diferença entre containers (esquerda) e VMs (direita) [4]

E claro: é interessante também você saber de alguns exemplos práticos de uso de Docker:

  1. Na disponibilização de modelos de IA criados para múltiplos locais e usuários: conseguimos colocar um modelo já treinado dentro de um container junto de todos os seus pré-requisitos.
  2. Na migração de software legado para uma arquitetura de microsserviços: é uma forma de se desenvolver software em pequenas partes que podem ser desenvolvidas rapidamente e com uma independência maior em relação ao que se fazia anos atrás em aplicações monolíticas.
  3. Para trabalhar em equipe: se as aplicações estão em containers, elas podem ser facilmente distribuídas e testadas paralelamente entre diferentes pessoas.
  4. Para aulas: em tese, os riscos de erros são menores se usarmos um container do que instalarmos tudo no nosso computador. Ah, e também é mais simples: terminou o curso e nunca mais pensa em utilizar aquela aplicação? É só eliminar o container: ao contrário de uma desinstalação na qual acaba deixando resquícios, o container é removido por completo. Deu um problema no meio da disciplina e precisaria reinstalar tudo? Não se preocupe: é só reinstalar.

Exemplo com o Neo4j

O Neo4j é um sistema gerenciador de banco de dados (SGBD) orientado a grafos. Bancos de dados orientados a grafos utilizam uma estrutura com arestas, vértices e propriedades para visualizar e armazenar os dados. Não lembra o que é um grafo? É este tipo de visualização:

Exemplo de um grafo do Neo4j [7]

Mas e aí, e para instalar isso? Uma alternativa seria baixar e instalar o Neo4j diretamente no nosso computador. A segunda seria via Docker. Como este artigo trata de Docker, nada mais justo do que irmos para a segunda opção, não é?

O primeiro passo é instalar o Docker Desktop [8]. Ele está disponível para Windows, Mac ou Linux.

Depois de instalado, você verá uma tela parecida com esta no Windows/Mac. Se estiver no Linux, é bem provável que terá que executar os comandos via terminal. Independentemente do sistema, isto não é problema: grande parte das operações ocorrem em terminal/prompt de comando, mesmo.

Imagem do Neo4j

O próximo passo é procurar pela imagem do Neo4j no Docker Hub (ou qualquer outra imagem que você queira procurar). No caso, a imagem do Neo4j está aqui [9]. A página é parecida com esta:

Preste atenção em alguns detalhes: o alto número de downloads (100M+, à esquerda); o comando para instalar a imagem no seu computador (à direita, com o fundo preto) e, na aba Tags, as versões. Sempre olho o número de downloads e as tags para garantir que estou pegando uma versão oficial (e, portanto, legítima).

O segundo passo é abrir o terminal/prompt de comando e digitar:

docker pull neo4j

Isto basicamente está baixando a imagem do Docker no nosso computador e deixando ele pronto para uso. Naquela analogia do pão, já estamos com a massa pronta (mas ainda não o pão em si).

Ocasionalmente podemos ter algum erro de conexão com uma frase como “net/http: TLS handshake timeout”: isto, na maioria das vezes, é um problema relacionado ao seu proxy e/ou à sua velocidade da conexão.

Se deu tudo certo, o próximo passo é rodar a imagem. Lá naquele link inicial [9], na aba Description e descendo um pouco mais a página temos isso:

Esse How to use this image é bem importante: basicamente, nos mostra como podemos rodar a imagem no nosso próprio computador. Aquele $HOME é uma pasta do nosso computador a qual gostaríamos de compartilhar os dados com o container. Logo, você pode substituir com o que quiser. Eu, por exemplo, vou criar uma pasta dentro do C:/ chamada de testeneo4j:

Veja o caminho lá em cima: “C:\testeneo4j”. Você pode usar qualquer outro caminho.

Logo, adaptando o código acima para o meu caso, temos (você pode copiar e colar o comando completo abaixo):

docker run --publish=7474:7474 --publish=7687:7687 --volume=C:/testeneo4j/data:/data neo4j

Preste atenção em específico nas 5 últimas linhas: a última linha diz Started: ou seja, o Neo4j já iniciou e está pronto para uso. Já a quinta linha de baixo para cima mostra onde você pode encontrar o Neo4j: é só digitar http://localhost:7474 no seu navegador e aí poderá acessar o Neo4j.

Veja lá em cima o endereço (http://localhost:7474/) e o Neo4j carregado com sucesso.

E é isso! No caso específico do Neo4j, esta é a tela inicial de configuração (já que nunca iniciamos o Neo4j neste computador). Vou informar neo4j (que é o usuário e senha padrão) nos campos de Username e Password, só para teste:

Depois disso, ele pedirá por uma nova senha. Fique à vontade para informar uma nova senha desde que você se lembre dela depois (sei que isto pode soar óbvio, mas preciso reforçar).

E, pronto! Estamos conectados ao Neo4j:

Agora, e para encerrar o trabalho? É simples: basta voltar lá ao terminal/prompt de comando e fechar aquela janela. Aparecerá a mensagem Stopping e, em instantes, o container estará finalizado.

E para voltar ao container depois? É só digitar novamente, quando quiser, aquele comando que fizemos antes:

docker run --publish=7474:7474 --publish=7687:7687 --volume=C:/testeneo4j/data:/data neo4j

E ele já estará disponível de volta no http://localhost:7474. Legal, não é? Ah, um ponto de atenção: cada imagem possui suas instruções próprias. Logo, é sempre importante ler com atenção àquela aba de Description no Docker Hub, sabe? Até logo!

Referências

[1] Docker — O que é Docker e como começar

[2] Um guia básico de Docker para desenvolvedores

[3] Docker visão geral (Parte 1)

[4] Are Containers Replacing Virtual Machines? — Docker Blog

[5] Deploying Machine Learning Models, Part 4: creating a Docker image

[6] Native Graph Database | Neo4j Graph Database Platform

[7] Example Project — Developer Guides (neo4j.com)

[8] Docker Desktop for Mac and Windows | Docker

[9] Neo4j — Official Image | Docker Hub

--

--

Wellington Monteiro

Professor @ PUCPR, Lead Machine Learning Engineer @ Nubank. Doutor em IA/Otimização Multi-objetivo e IA em Corporações.