menu EXPLORAR
history NOVIDADES

O que é Docker

Docker e virtualização

Quando desenvolvemos uma aplicação é importante que ela possua os requisitos básicos para funcionar: sistema operacional, bibliotecas, variáveis ​​de ambiente, pacotes, entre outras necessidades.

Quando algum desses requisitos não for atendido, o aplicativo não poderá funcionar como deveria. Para evitar problemas de conflito, devemos garantir que onde quer que seja executada, a aplicação tenha sempre os requisitos necessários para funcionar.

Existem várias maneiras de conseguir um ambiente isolado. A mais utilizada até o momento tem sido a virtualização, que consiste em criar um ambiente isolado dentro de um dispositivo host. Poderíamos ver a virtualização como uma caixa dentro de um sistema operacional que tem acesso aos recursos da máquina, como CPU, disco ou RAM, e permite que aplicativos sejam executados dentro dela.

Existem 3 maneiras principais de realizar a virtualização:

Máquinas virtuais

As máquinas virtuais são uma simulação de um computador real. Ou seja, ao inicializar funciona como se fosse um novo dispositivo: possui sistema operacional próprio, possui recursos de memória e disco, seus usuários, etc.

Um exemplo é, quando num computador que possui o sistema operacional MacOS criamos uma máquina virtual para instalar o Windows e poder executar programas não disponíveis para Mac. Existem vários programas que permitem criar máquinas virtuais. Alguns são:

  • Caixa Virtual
  • Paralelos
  • Fusão VMware

Máquinas virtuais são o tipo de virtualização utilizada em servidores em nuvem para criar VPS (Virtual Private Server) e criar servidores com diferentes recursos e necessidades.

No entanto, este tipo de virtualização tem um problema. Requer muitos recursos para ser executado em cima de um sistema operacional. Este problema deu origem a outras soluções para isolamento e virtualização.

Ambientes virtuais

Ambientes virtuais são um tipo de virtualização amplamente utilizado para executar programas escritos em Python. Para cada ambiente virtual, são utilizadas uma versão específica de Python e bibliotecas. Desta forma podemos saber para cada projeto quais pacotes e bibliotecas são necessários para executá-lo.

Normalmente, todos os pacotes e bibliotecas Python necessários estão localizados no arquivo requisitos.txt criado por meio do comando: pip freeze > requisitos.txt.

Alguns exemplos de ferramentas que permitem criar ambientes virtuais são:

  • Conda
  • Virtualenv
  • Pipenv

Containers

Finalmente chegamos ao sistema de virtualização que nos interessa neste artigo: containers. Esses objetos são semelhantes às máquinas virtuais, com a diferença de que são muito mais leves e não requerem recursos intensivos. Isso ocorre porque eles não possuem sistema operacional próprio, mas usam o sistema operacional da máquina host.

O exemplo mais conhecido é o Docker, embora existam outras ferramentas para criação de containers como Vagrant ou Ansible. Docker utiliza um sistema para criar, excluir e gerenciar contêineres chamado containerd.

Conteinerização no Docker

A melhor maneira de entender como funciona o Docker é imaginar um contêiner onde dentro temos tudo o que é necessário para executar uma aplicação: arquivos, variáveis ​​de ambiente, bibliotecas, compiladores, interpretadores...

É importante mencionar que o sistema container funciona muito bem para sistemas UNIX, portanto se você usa Windows certamente precisará de uma máquina virtual para rodar uma distribuição Linux.

Resumindo, o Docker permite a geração de containers onde podemos isolar nossas aplicações para que possam rodar em qualquer dispositivo já que o container abriga todas as dependências e bibliotecas necessárias para a execução.

Imagens no Docker

Imagens são abstrações que permitem a criação de contêineres. Poderíamos ver as imagens como classes em uma linguagem de programação orientada a objetos (OOP). Usando esta comparação, os contêineres seriam instâncias (objetos) criadas a partir de imagens (classes).

Normalmente, as instruções para construir uma imagem são encontradas em um arquivo chamado Dockerfile. Nas instruções encontramos a distribuição Linux, as bibliotecas ou o software necessário para a execução. Também podemos especificar quais arquivos devem ser copiados para o contêiner que iremos gerar a partir da imagem Docker.

Como funciona o Docker

Normalmente, quando trabalhamos com containers e especificamente com a ferramenta Docker, utilizamos o que é conhecido como cliente Docker. Este componente entrará em contato através de uma API com o componente responsável por gerar, gerenciar e executar tanto as imagens quanto os containers.

Para lidar bem com imagens e containers, é importante saber executar alguns dos comandos mais básicos:

  • versão docker
  • puxar docker
  • docker push
  • execução do docker
  • janela de encaixe ps
  • executivo do docker
  • parada da janela de encaixe
  • docker matar

Docker Hub

DockerHub é o repositório oficial do Docker. Existem todos os tipos de imagens para poder executar containers: aplicações, bancos de dados, software... Além disso, você também pode criar seu repositório e fazer upload de suas próprias imagens usando o comando docker push, semelhante a como faríamos upload de nosso código para Github ou Gitlab.

Comunicação entre contêineres

Quando criamos, por exemplo, uma aplicação web podemos ter diferentes serviços construídos em diferentes containers Docker. Mesmo sendo sistemas isolados, eles precisam se conectar entre si para transferir dados. É aqui que entra a rede no Docker.

No Docker existem 3 tipos diferentes de redes:

  1. Rede nenhuma : Utilizado para definir que o referido container não possui nenhuma rede atribuída.
  2. ponte vermelha : A rede bridge é aquela configurada por padrão em todos os contêineres Docker. Isto permite a comunicação e o envio de dados entre eles através dos seus IPs (cada container recebe um IP desde o momento em que é criado).
  3. Rede anfitriã - Este tipo de rede não isola os contêineres da máquina convidada. Portanto, se o contêiner tiver um serviço ativo na porta número 80, a máquina convidada também fornecerá esse serviço através desta porta.

Persistência de dados

Os dados gerados em cada contêiner Docker são excluídos assim que são interrompidos. Para persistir os dados independentemente de pararmos ou iniciarmos o Docker, existe o que é conhecido como Volumes .

Volumes são pastas onde são armazenados os dados que precisam ser mantidos. Essas pastas estão localizadas na máquina convidada, mais especificamente no diretório: /var/lib/docker/volumes .

Composição do Docker

Docker Compose é um conjunto de ferramentas que nos permite lançar vários contêineres ao mesmo tempo. Quando criamos uma aplicação ela pode ter vários componentes: bancos de dados relacionais, bancos de dados não relacionais, serviços de gerenciamento de filas...

Todos esses componentes devem ser lançados em contêineres diferentes. Levantar um por um seria muito tedioso. É por isso que fazemos isso através de um arquivo de configuração chamado docker-compose.yml. Este arquivo especifica as imagens a serem utilizadas, as variáveis ​​de ambiente, as especificações da rede, os volumes onde os dados devem ser salvos, entre outras configurações.

Em posts futuros entraremos em mais detalhes sobre a parte técnica do Docker, especificando como devem ser os arquivos e comandos necessários para lançar os containers.

Além disso, veremos também como ferramentas como Kubernetes ou Docker Swarm nos permitem lançar diversos containers que interagem entre si de forma distribuída, ou seja, em diferentes nós, permitindo grande escalabilidade das aplicações.