Docker para iniciantes
Já ocorreu-lhe de passar horas configurando seu ambiente de desenvolvimento, baixando a versão mais recente e estável da linguagem que você utiliza e no momento de rodar o projeto no qual você vai trabalhar, simplesmente falha? E, então, após debugar para descobrir o motivo da falha, você percebe que o projeto necessita de uma versão antiga dessa linguagem? A partir daí, são necessárias mais horas para configurar todo o ambiente de desenvolvimento voltado para uma versão mais antiga da tecnologia que você está utilizando.
O Docker é uma ferramenta muito utilizada nas empresas por conta do seu modo de virtualização.
A virtualização surgiu para facilitar o desenvolvimento de aplicações em times e acabar com o "na minha máquina funciona". Afinal, não incomum nos deparávamos com a situação de uma aplicação funcionar na máquina de uma pessoa do time e na de outro não, justamente por conta do ambiente de desenvolvimento ser diferente na máquina de cada desenvolvedor.
No mais, a virtualização também possibilitou a criação de um ambiente totalmente configurado de acordo com as necessidades de cada aplicação, com isso, todos os desenvolvedores do time tinham acesso ao mesmo ambiente de desenvolvimento, com as mesmas especificações de hardware e dependências que a aplicação necessita.
Sendo assim, vamos dar os primeiros passos para entender o que é o Docker e como ele inovou a virtualização comparado a uma Máquina Virtual.
Diferença entre Docker e Virtual Machine
É comum na faculdade ou em alguns cursos, aprendermos sobre Máquina Virtual, principalmente para estudar Linux. Quando nos deparamos com Docker, a princípio surge uma dúvida: “Mas não é a mesma coisa que uma máquina virtual?”. Essa pergunta é muito comum, portanto, antes de começar a usar o Docker, vamos tentar entender um pouco a diferença entre ambos.
Na imagem acima, temos uma representação das camadas do Docker e de uma Máquina Virtual. Um dos pontos mais importantes que diferenciam ambos, é o fato de que no Docker não é necessário instalar um sistema operacional para rodar a nossa aplicação, pois ele serve para virtualização de Sistema Operacional. O Docker Engine permite que a nossa aplicação seja executada de modo universal, independente do sistema operacional.
A máquina virtual já funciona um pouco diferente, a utilização dela é voltada para quando queremos virtualizar o hardware, ou seja, para criar um ambiente com recursos de hardware personalizados sendo necessário instalar um sistema operacional na máquina.
Sabendo as diferenças, é perceptível que um não exclui o outro, é possível utilizar os dois de acordo com cada necessidade. Caso seja necessário criar uma máquina virtual e utilizar o Docker na máquina virtual, nada te impede de fazer isso.
O que é Docker?
Agora que sabemos alguns pontos que diferenciam o Docker de uma VM (Virtual Machine), chegou a hora de conhecer o Docker em si.
O Docker é usado para virtualizar as aplicações a nível de sistema operacional, como mencionado anteriormente, utilizando containers que carregam imagens docker contendo tudo que a aplicação precisa para rodar em qualquer máquina.
Mas, você deve estar se perguntando: “ Por que devo utilizar isso? Containers não são aquelas caixas gigantes de metal? A imagem é em png ou jpg?”
Imagem
Nesse caso, a imagem não é em png nem em jpg. No docker, as imagens são compostas por sistemas de arquivos de camadas que ficam uma sobre as outras e possuem todas as dependências necessárias para executar a aplicação, como por exemplo, os arquivos de biblioteca, de configuração e as dependências. Ela é a nossa base para construção de uma aplicação, ela pode ser desde a base do Ubuntu como também um CentOS com Nginx, PHP e/ou MongoDB.
Container
Containers também são aquelas caixas gigantes de metal que geralmente os navios carregam e o container do Docker faz analogia a elas. Veja só, um navio pode carregar diversos containers e cada um pode conter coisas diferentes, caso algum desses containers caia no mar ou sofre algum dano durante o percurso, os outros não serão afetados.
No Docker, o container é um processo, é ele que será executado e carregará a aplicação, é como se fosse uma caixa onde podemos adicionar todas as imagens, bibliotecas, arquivos de configuração, ou seja, tudo que a aplicação precisa para ser executada.
Além disso, o container permite uma grande flexibilidade pois cada container é totalmente isolado a nível de disco, memória, processamento e rede que fica disponível em um servidor. Ou seja, se um container der problema, apenas uma aplicação será afetada, as demais continuarão funcionando perfeitamente. Assim como acontece com os containers que os navios carregam.
Comandos básicos:
Sabendo o motivo da utilização do Docker, é necessário conhecermos alguns comandos que são essenciais para utilizar o Docker no dia a dia.
Exemplo prático
Para acompanhar a exemplificação e praticar os comandos listados na imagem acima, o pré-requisito necessário é ter uma conta no Docker Hub, instalar o docker ou utilizar o docker através do site https://labs.play-with-docker.com/.
No Docker Hub é onde encontramos imagens oficiais para utilizar de base para criação de alguma aplicação, ao longo do exemplo, serão utilizadas as imagens oficiais do nginx e do postgres.
1º passo: criar um container com a imagem nginx como base, ao executar esse primeiro comando, o nginx já estará rodando e para ver basta acessar o localhost na porta 80.
Comando: docker run --name criando-um-container -p 80:80 -d nginx.
Comando: docker ps.
2º passo: pausando e iniciando o container que foi criado
Pausa o container com: docker stop criando-um-container.
Inicia o container com: docker start criando-um-container.
3º passo: executar um comando dentro do container
Comando: docker exec -it criando-um-container sh
Com o docker exec é possível realizar comandos dentro do container criado. Nesse caso, ao abrir o terminal sh do container, foi listada todas as pastas que tem dentro do container com o comando ls e criada uma pasta nova com o comando mkdir e por fim, o comando exit para sair do terminal interno do container.
4º passo: removendo o container criado
Remove o container com os comandos: docker rm criando-um-container / docker rm -f criando-um-container.
5º passo: baixando imagem do Docker Hub
Comando: docker pull postgres.
Lista a imagem com docker images.
6º passo: removendo a imagem baixada
Remove a imagem com docker rmi postgres.
Quando baixamos uma imagem, estamos basicamente fazendo o download de um arquivo, por isso, ao contrário de um container, não tem como parar, iniciar ou executar uma imagem sem que ela esteja dentro de um container.
Conclusão
Com a utilização de containers, imagens e do Docker Engine, o Docker inovou o modo de virtualizar as aplicações, sendo vantajoso sua utilização pois permite flexibilidade, os times não precisam instalar diversas dependências na máquina para rodar a aplicação, basta ter o docker instalado, garante que a aplicação rode em qualquer máquina. E um dos pontos esclarecidos, é o fato do container ser um processo e imagem ser arquivos em camadas.
Referências