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