Docker para iniciantes

Camila Pereira de Oliveira
Inside PicPay
Published in
7 min readMay 13, 2022

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.

Essa imagem demonstra a diferença na estrutura do Docker e de uma Virtual Machine. A VM possui as camadas, de baixo para cima, Server, Host OS, Hypervisor, Guest Os, Bins/Libs e App A. No docker, as camadas são: Server, Host OS, Docker Engine, Bins/Libs e App A.
fonte: http://gordonsun-blog.s3.amazonaws.com/wp-content/uploads/2015/05/docker-containers-vs-vms.png

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.

Tabela com 12 comandos principais do Docker. A primeira coluna é referente aos comandos e a segunda coluna possui o a funcionalidade do comando. A tabela possui o cabeçalho na cor azul escuro com as letras brancas, e as demais 12 linhas possui fundo branco com a letra preta, exceto as palavras "nome-do-container", "nome-da-imagem" e "nginx"que estão em vermelho.
Tabela acessível em pdf no link: tabela em formato pdf.

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.

Imagem demonstra como é utilizar o comando: 'docker run — name criando-um-container -p 80:80 -d nginx' no site https://labs.play-with-docker.com/. Ao executar esse comando, um container é criado com o nome "criando-um-container".
Criando um container com a imagem nginx no site https://labs.play-with-docker.com/

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.

A imagem demonstra a utilização do mesmo comando anterior: 'docker run — name criando-um-container -p 80:80 -d nginx' pelo terminal do computador para criar um container na máquina local.
Criando um container

Comando: docker ps.

Utilizando o comando 'docker ps' através do terminal para listar o container criado anteriormente. Ao utilizar esse comando, aparece no terminal as informações: CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS e NAMES
Com o docker ps lista o container que foi criado
Imagem demonstra como aparece o container criado na interface do Docker instalado no computador. Na imagem aparece uma caixa parecida com um container de metal na cor verde, isso indica que o container está rodando. Ao lado da caixa, o nome que foi dado ao container na hora da criação. Em letras azuis, ao lado do nome do container aparece o nome da imagem "nginx". E abaixo do nome do container, aparece o status e a porta do container.
Caso esteja utilizando o docker baixado, na interface do docker é possível ver que o container está rodando.
Print do navegador ao acessar localhost:80 quando o container está rodando. Na imagem aparece a tela de boas vindas do Nginx.
Ao acessar localhost:80 aparece a página de boas vindas do nginx.

2º passo: pausando e iniciando o container que foi criado

Pausa o container com: docker stop criando-um-container.

Utilizando o comando 'docker stop criando-um-container' no terminal do computador, para pausar o container que estava sendo executado. Ao utilizar esse comando, é retornado no terminal apenas o nome do container que foi parado, nesse caso, "criando-um-container".

Inicia o container com: docker start criando-um-container.

Utilizando o comando ‘docker start criando-um-container’ no terminal do computador, para iniciar o container que estava parado. Ao utilizar esse comando, é retornado no terminal apenas o nome do container que foi iniciado, nesse caso, “criando-um-container”.

3º passo: executar um comando dentro do container

Comando: docker exec -it criando-um-container sh

Utilizando o comando ‘docker exec -it criando-um-container sh’ no terminal do computador, para abrir um terminal sh dentro do container.

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.

Essa imagem demonstra a utilização de dois comandos. Primeiro, utilizando o comando ‘docker rm criando-um-container’ no terminal do computador, para remover  o container, é retornado uma mensagem de erro, pois o container está sendo executado. Então, é utilizado o comando 'docker rm -f criando-um-container' para forçar a remoção e é retornado no terminal o nome do container que foi removido.
Ao tentar remover o container que está em execução, é retornado um erro. Caso adicione a flag -f no comando, o container será removido mesmo que esteja em execução.

5º passo: baixando imagem do Docker Hub

Na imagem temos um print do navegador no site do Docker Hub, ao pesquisar pela imagem do Postgres.
Como no Docker Hub há várias imagens públicas que outras pessoas criam e postam lá, as imagens oficiais possuem um selo de verificado verde para garantir que estamos baixando a imagem correta.

Comando: docker pull postgres.

Essa imagem demonstra a utilização do comando ‘docker pull postgres’ no terminal do computador, para baixar uma imagem do Docker Hub. É retornado no terminal uma sequência de arquivos que foram baixados ao fazer o download da imagem postgres.
Utilizando o comando docker pull para fazer o download da imagem.
Imagem demonstra como aparece a imagem baixada na interface do Docker instalado no computador. No print aparece as informações em formato de tabela com as informações: NAME, TAG, IMAGE ID, CREATED e SIZE.
Caso tenha o docker desktop instalado, é possível visualizar a imagem baixada na interface do docker.

Lista a imagem com docker images.

Utilizando o comando ‘docker images’ através do terminal para listar a imagem docker que foi baixada. Ao utilizar esse comando, aparece no terminal as informações: REPOSITORY, TAG, IMAGE ID, CREATED, SIZE
Outra forma de ver a imagem baixada, é com o comando docker images

6º passo: removendo a imagem baixada

Remove a imagem com docker rmi postgres.

Essa imagem demonstra a utilização do comando ‘docker rmi postgres’ no terminal do computador, para remover a imagem baixada. É retornado no terminal uma sequência de arquivos que foram deletados  ao fazer a remoção da imagem postgres.
Para remover uma imagem baixada, basta utilizar o comando docker rmi que a imagem será apagada.

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

--

--