Docker#

Este é essencialmente um ‘TLDR’ da documentação oficial[1]. A ideia é fazer com que o leitor tenha uma ideia básica do funcionamento e dos conceitos chave de Docker.

O que é Docker?#

‘Docker é uma plataforma aberta para desenvolver, transportar e executar aplicações. Docker permite separar aplicações de sua infraestrutura, o que viabiliza entregar software mais rápido. Com Docker é possível gerenciar a infraestrutura do mesmo jeito que se gerenciam as aplicações. Ao tirar vantagem das metodologias de transporte, teste e implantação de código do Docker é possível reduzir significativamente o atraso ente escrever código e executar ele em produção.’

Resumindo a sopa de palavras:

Docker permite criar ‘caixinhas’ que contém tudo o que é necessário para executar a aplicação, o que deixa esse software independente do sistema em que ele deve executar.

Como Docker funciona?#

Docker Engine#

Docker vs. Máquina Virtual#

Resumindo conceitos importantes#

Contêiner#

  • Containers são pacotes de software leves, autônomos e executáveis que incluem tudo o que é necessário para executar um software, incluindo o código, ferramentas do sistema, bibliotecas do sistema e configurações.

  • Eles isolam o software de seu ambiente, garantindo que ele seja executado consistentemente, independentemente de onde seja implantado.

  • Os contêineres utilizam o kernel do sistema operacional hospedeiro e compartilham recursos com outros contêineres, tornando-os eficientes e portáteis.

  • É criado com base em uma imagem;

Imagem#

  • Imagens são templates, somente leitura, que contém as instruções para criar um contêiner Docker.

  • Elas encapsulam o código do aplicativo junto com suas dependências, bibliotecas e ambiente de execução.

  • Uma imagem é criada utilizando um arquivo chamado Dockerfile, um arquivo de texto que especifica as etapas necessárias para construir um contêiner.

  • As imagens do Docker podem ser criadas a partir do zero ou podem ser baseadas em imagens existentes disponíveis no Docker Hub ou em outros registries

Registry#

  • Registries são repositórios onde as imagens Docker são armazenadas e distribuídas.

  • O registry mais popular é o DockerHub[2]. Ele é público e o padrão para imagens Docker, onde os usuários podem encontrar e compartilhar imagens de contêineres.

  • Organizações também podem configurar registries privados para armazenar imagens próprias dentro de sua infraestrutura de rede. O C3SL tem seu próprio Docker Registry.

  • Registries permitem versionamento, colaboração e distribuição de imagens Docker em diferentes ambientes.

  • Abusando do termo: registries como o DockerHub são para o imagens Docker o que serviços como GitHub são para repositórios Git. Veja o versionamento de imagens como commits em um repositório. (Lembre que estamos abusando do termo)

Volume#

  • Volumes são uma maneira de persistir dados gerados e usados por contêineres Docker. Sem volumes qualquer dado escrito no sistema de arquivos de um contêiner será perdido assim que o contêiner pare.

  • Eles fornecem um mecanismo para armazenar e gerenciar dados separadamente do ciclo de vida do container.

  • Os volumes podem ser compartilhados entre containers e também podem ser montados do sistema hospedeiro, permitindo que os dados persistam mesmo se o container for interrompido ou excluído.

Important

Em um determinado momento um contêiner contendo um pequeno serviço do C3SL foi configurado errado, o volume estava incorreto. Eventualmente esse contêiner foi parado e a imagem foi atualizada, o que acarretou na perda de tudo o que foi salvo nesse serviço.

Rede#

  • As redes Docker permitem a comunicação entre contêineres em execução no mesmo host ou em vários hosts.

  • Por padrão, o Docker cria uma rede de ponte para cada host, permitindo que os contêineres se comuniquem entre si e com o mundo externo, que já basta para a maioria dos casos de uso. Há no total 7[3] tipos de redes Docker (6 drivers distintos).

  • Usuários podem criar redes personalizadas para isolar contêineres, controlar o tráfego e implementar políticas de rede.

  • As redes Docker fornecem recursos como resolução DNS, descoberta de serviço e segmentação de rede, melhorando a flexibilidade e escalabilidade de aplicativos containerizados.

Por que utilizar Docker?#

Never install locally#

Note

Isso é particularmente relevante quando lida com dois ou mais gerenciadores de pacotes. Um bom exemplo disso são pip do Python e apt do Debian. É frequente as instalações de um conflitarem com as do outro, e resolver esse problema não é trivial.

Claro, no caso do pip há ambientes virtuais para evitar isso, mas Docker também é um ambiente virtual, e é mais fácil de fazer a aplicação funcionar caso ela não seja inteiramente em Python, por exemplo. Além das vantagens de ter uma imagem da aplicação para deploy facilitado.

Executar código legado#

Assumindo que tudo foi configurado corretamente. Uma vez que uma aplicação tem uma imagem

Um projeto dockarizado ficou parado por dois anos e voltou do nada?

Sem problemas! É só fazer o deploy da última imagem de produção! Agora para continuar o desenvolvimento basta que a documentação do projeto esteja em ordem (esse é um problema que sempre caberá ao projeto em si).

Testes de integração#

Por que não utilizar Docker?#

Dependências complexas#

Aplicações de altíssimo desempenho#

Aplicações pequenas, simples e isoladas#

Um perfeito exemplo disso é um website. Caso