Introdução e Utilização do Docker
Este artigo traz um estudo introdutório sobre a tecnologia de empacotamento de aplicações em forma de contêineres, rodando-os de maneira isolada do sistema, utilizando a ferramenta Docker. O texto e os exemplos aqui citados (DHCP e DNS server), tratarão como base o sistema operacional GNU/Linux instalados no host, especificamente, distribuições baseadas em Debian. Nas teorias, utilizamos o Debian Buster e nos exemplos de DHCP e DNS Server, utilizamos o Kali Linux, versão 2019.3.
Sobre o Docker
Docker é uma ferramenta open source que permite a criação e a manipulação de contêineres, os quais contém aplicações e as suas dependências, fornecendo uma camada de abstração de virtualização a nível de sistema operacional, tornando as operações em uma infraestrutura mais flexíveis e eficientes, aumentando a portabilidade das aplicações e suas bibliotecas em conjunto, reduzindo o tempo de distribuição (deploy) de uma infraestrutura ou de uma aplicação, pois não há necessidade de ajustes de ambiente de execução para o correto funcionamento do serviço, não importando o sistema que está rodando, já que o contêiner contém as bibliotecas e os binários empacotados para rodar as aplicações e o sistema próprio, aproveitando apenas a infraestrutura do kernel do sistema operacional do host.
Configure-o uma vez e replique-o quantas vezes quiser. Uma vez que sua aplicação seja transformada em uma imagem Docker, que nada mais é que um pacote executável que contém tudo que é necessário para rodar aplicações e sistemas, e é a partir dela que o contêiner pode ser iniciado.
Portanto, podemos iniciar um contêiner em qualquer ambiente, bastando ter o serviço do Docker rodando no host e a disponibilidade de uma imagem base para o contêiner.
Em seu lançamento, como código aberto, o Docker utilizava em seu back-end o LXC (Linux Contêineres), que funciona isolando processos do sistema operacional do host, utilizando o mesmo Kernel, fazendo com que a sua sobrecarga seja menor que, por exemplo, uma máquina virtual, que necessita de um hipervisor para seu controle, além de consumir muito mais recursos de hardware e necessitar de um kernel próprio.
A partir da versão 0.9, o LXC foi substituído pela sua própria biblioteca, desenvolvida na linguagem Go, trabalhando agora de maneira independente do LXC, podendo acessar as APIs de contêineres do kernel diretamente, como explicado no artigo do Blog Docker Hykes, 2014. O uso de contêineres são, portanto mais leves, se comparados à máquinas virtuais completas, já que não precisam de um ambiente virtual completo, visto que o kernel do host proporciona o gerenciamento de memória e outros recursos de hardware.
Para maiores informações sobre contêineres, confira este artigo da RedHat.
O Docker facilita a comunicação entre desenvolvedores e administradores de sistemas (sysadmins), possibilitando o planejamento da infraestrutura mais simplificado, construindo arquivos com as definições necessárias e os parâmetros de como a aplicação será disposta nesse ambiente, em qual porta fornecerá seu serviço, e outras necessidades.
A ferramenta também disponibiliza uma nuvem pública para compartilhamento de ambientes prontos (imagens), sejam eles produtos oficiais, ou da comunidade, que podem ser utilizados para viabilizar customizações para ambientes específicos. Visto que qualquer pessoa pode subir uma imagem customizada, é importante ter atenção na documentação e nos itens que acompanham as imagens, por questões de segurança.
Para maiores informações sobre o funcionamento do Docker, temos um artigo bem completo que pode ser encontrado no Medium Kasireddy, 2016.
Para este artigo, utilizaremos o sistema operacional Debian. Para outras versões GNU/Linux, Windows, ou MacOS, ou instalação via repositório, o passo a passo de instalação pode ser encontrado no endereço:
Em um Debian Stretch ou superior, no terminal, com acesso root, execute o comando abaixo:
# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh
Acompanhe os scripts do terminal para analisar os processos e mensagens da instalação. Caso queira utilizar o Docker como um usuário comum (non-root), adicione o usuário ao grupo "docker":
sudo usermod -aG docker usuário
Após finalizar, execute o comando abaixo para testar a instalação:
docker version
Se tudo estiver correto, será exibida a versão que está sendo executada no host.
Configure-o uma vez e replique-o quantas vezes quiser. Uma vez que sua aplicação seja transformada em uma imagem Docker, que nada mais é que um pacote executável que contém tudo que é necessário para rodar aplicações e sistemas, e é a partir dela que o contêiner pode ser iniciado.
Portanto, podemos iniciar um contêiner em qualquer ambiente, bastando ter o serviço do Docker rodando no host e a disponibilidade de uma imagem base para o contêiner.

Em seu lançamento, como código aberto, o Docker utilizava em seu back-end o LXC (Linux Contêineres), que funciona isolando processos do sistema operacional do host, utilizando o mesmo Kernel, fazendo com que a sua sobrecarga seja menor que, por exemplo, uma máquina virtual, que necessita de um hipervisor para seu controle, além de consumir muito mais recursos de hardware e necessitar de um kernel próprio.
A partir da versão 0.9, o LXC foi substituído pela sua própria biblioteca, desenvolvida na linguagem Go, trabalhando agora de maneira independente do LXC, podendo acessar as APIs de contêineres do kernel diretamente, como explicado no artigo do Blog Docker Hykes, 2014. O uso de contêineres são, portanto mais leves, se comparados à máquinas virtuais completas, já que não precisam de um ambiente virtual completo, visto que o kernel do host proporciona o gerenciamento de memória e outros recursos de hardware.
Para maiores informações sobre contêineres, confira este artigo da RedHat.
O Docker facilita a comunicação entre desenvolvedores e administradores de sistemas (sysadmins), possibilitando o planejamento da infraestrutura mais simplificado, construindo arquivos com as definições necessárias e os parâmetros de como a aplicação será disposta nesse ambiente, em qual porta fornecerá seu serviço, e outras necessidades.
A ferramenta também disponibiliza uma nuvem pública para compartilhamento de ambientes prontos (imagens), sejam eles produtos oficiais, ou da comunidade, que podem ser utilizados para viabilizar customizações para ambientes específicos. Visto que qualquer pessoa pode subir uma imagem customizada, é importante ter atenção na documentação e nos itens que acompanham as imagens, por questões de segurança.
Para maiores informações sobre o funcionamento do Docker, temos um artigo bem completo que pode ser encontrado no Medium Kasireddy, 2016.
Instalação do Docker
Como o repositório do Docker atualmente utiliza o protocolo HTTPS, e não vem como padrão no Debian, tendo que instalar algumas dependências, utilizaremos a instalação via script, que é mais simplificada.Para este artigo, utilizaremos o sistema operacional Debian. Para outras versões GNU/Linux, Windows, ou MacOS, ou instalação via repositório, o passo a passo de instalação pode ser encontrado no endereço:
Em um Debian Stretch ou superior, no terminal, com acesso root, execute o comando abaixo:
# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh
Acompanhe os scripts do terminal para analisar os processos e mensagens da instalação. Caso queira utilizar o Docker como um usuário comum (non-root), adicione o usuário ao grupo "docker":
sudo usermod -aG docker usuário
Após finalizar, execute o comando abaixo para testar a instalação:
docker version
Se tudo estiver correto, será exibida a versão que está sendo executada no host.