• UFRJ Nautilus

Docker

Atualizado: 12 de mai.

O que é Docker?


O Docker é uma plataforma aberta que permite aos engenheiros desenvolver, publicar e executar as suas aplicações em um ambiente controlado e configurável. Simplificando, é uma ferramenta que permite aos desenvolvedores construir as suas aplicações com todas as dependências e configurações necessárias em um ambiente isolado.


Aqui na Nautilus, nós utilizamos o Docker como ambiente de desenvolvimento. Como o ROS, a parte principal da nossa aplicação, requer o Ubuntu 20.04, construímos uma imagem do Docker com esse sistema operacional, nossa distribuição do ROS e outras ferramentas que facilitam nossa vida enquanto programamos, como o tmux, por exemplo. Isso nos permite trabalhar em qualquer sistema operacional de desktop, sem ter que fazer um dual-boot, processo de instalação de dois sistemas operacionais no mesmo computador, com o Ubuntu como antes.


Por que usar o Docker?


Bem, se você conhece um pouco de tecnologia, pode estar se perguntando, por que não usar uma máquina virtual? E isso não é uma má ideia, as máquinas virtuais podem fornecer o nível de isolamento necessário, mas as VM’s e os contêineres têm algumas diferenças de arquitetura.


Uma VM é essencialmente uma emulação de um computador, eles rodam em cima de uma máquina física usando um Hypervisor, um Hypervisor é uma ferramenta que fornece o hardware emulado para uma VM. Além disso, em cima do hypervisor temos um sistema operacional completo, rodando com todo o hardware como rede, CPU, RAM e armazenamento emulados. Isso adiciona uma sobrecarga de processamento, tornando a execução de nossa aplicação muito mais lenta. Com o Docker, por outro lado, você só tem a camada de virtualização do sistema operacional, isso faz com que a diferença entre executar nossas aplicações nativamente e dentro do Docker seja imperceptível. Além disso, com o Docker, você não precisa de um sistema operacional inteiro no seu disco rígido, apenas das partes necessárias.


Como o Docker funciona


A parte principal do Docker é a tecnologia de containers e containers são, na verdade, um conjunto de outras tecnologias que trabalham juntas em uma forma muito específica. Aqui, vamos falar sobre as três principais.


Namespaces


A primeira sobre a qual falaremos são os Namespaces. Namespaces é um recurso do Kernel Linux que cria uma hierarquia para isolar um recurso global do sistema, como processos isolados, dispositivos de rede ou dispositivos montados, por exemplo. No contexto de contêineres, essa tecnologia isola todos os recursos que o container vai utilizar, de forma que, para o container, pareça que ele tem uma instância pessoal daquele recurso, assim, o container não pode acessar o mundo externo de seu namespace.


Cgroups


A segunda são os cgroups, este é outro recurso do Kernel Linux, mas agora relacionado à medição e isolamento de recursos de hardware, com os cgroups podemos determinar quanta CPU, memória e rede uma aplicação pode usar.


Suponha que tenhamos um container com um aplicativo rodando em nosso computador, com o cgroups podemos limitar o uso de memória desse container a qualquer valor arbitrário que quisermos, como 3GB por exemplo, e assim o aplicativo será limitado a essa regra predefinida.


Chroot


Por último, mas não menos importante, o chroot é uma chamada de sistema que pode alterar o diretório raiz aparente de um determinado processo. Por padrão, em um sistema operacional do tipo Unix, o diretório raiz (/) é o diretório principal, o sistema de arquivos raiz fica na mesma partição de disco onde o diretório raiz está localizado e é no topo desse sistema de arquivos raiz, que todos os outros sistemas de arquivos são montados. Todas as entradas do sistema de arquivos se ramificam dessa raiz, esta é a raiz real do sistema.


Mas cada processo tem sua própria ideia do que é o diretório raiz, e o Docker faz isso usando a chamada de sistema chroot. O que acontece é que o processo em execução dentro do contêiner do Docker usa uma estrutura de diretórios aparente e isolada do sistema operacional.


Resumindo


Resumindo, o núcleo de como um contêiner funciona pode ser descrito por essas três tecnologias, os namespaces que isolam os recursos do contêiner e limitam o que o contêiner pode acessar, os cgroups que fornecem os recursos de hardware ao contêiner em execução e o chroot que faz o mapeamento da estrutura de diretórios do contêiner.


O Dockerfile


Agora, você pode estar se perguntando como começar a dockerizar seus aplicativos. O primeiro passo é criar o que é chamado de Dockerfile. Esse arquivo é um arquivo de texto simples que inclui instruções que o Docker utiliza para construir a imagem que será usada como modelo para gerar o contêiner do seu aplicativo. Conforme definido pelo Dockerfile, a imagem que você cria contém tudo o que seu aplicativo precisa para ser executado: desde o nível mais básico, como normalmente um sistema operacional reduzido e um ambiente de tempo de execução, até ativos mais específicos, como arquivos do aplicativo, bibliotecas third-party, environment variables e outras dependências. Depois que a imagem é criada, ela é guardada na memória para ser usada sempre que desejar, incluindo executar seu aplicativo em um contêiner, criar novas imagens usando-a como modelo e muito mais.


Uma biblioteca Docker: Docker Hub


A maneira mais simples de explicar o que é o Docker Hub é a seguinte: O Docker Hub está para o Docker como o GitHub está para o Git. É um armazenamento para imagens do Docker que qualquer pessoa pode usar. Depois que a imagem é criada, é possível dar push nela para o Docker Hub e, inversamente, você ou qualquer outra pessoa pode fazer um pull desta imagem para qualquer outra máquina que tenha o Docker instalado. Lembre-se que nesta imagem está contida uma versão específica do seu aplicativo junto com tudo de essencial que ele precisa. Isso significa que, com o Docker, você não precisa mais manter release documents longos e complexos que precisam ser seguidos com precisão antes que alguém possa usar o aplicativo, você pode simplesmente empacotar seu aplicativo em uma imagem, enviá-lo para o Docker Hub e executá-lo em praticamente qualquer lugar.


Escrito por Matheus Rodrigues e João Cavalcanti


0 comentário

Posts recentes

Ver tudo