Introdução ao Docker para pessoas de dados

Problemas típicos de dependências com Python que podem ser evitados com Docker.

Não há como negar, a estrutura necessária por trás do código para rodar análises e trabalhar com modelos de aprendizado de máquina depende de muitos artefatos de software. As dependências podem ir desde a distribuição de sistema operacional ( OS) (ex.: CentOS, Ubuntu, Windows, …), passando pela linguagem de programação (ex.: Java, Python, R, …) até bibliotecas com as quais o projeto foi construído (ex: Tensorflow, Spark, Pandas, …) dentre outros (Bases de dados, API’s, arquivos em disco, …).

Reproduzir toda a estrtura necessária para executar um projeto em um outro ambiente além de onde ele foi desenvolvido implica em um controle cheio de cuidados e detalhes minuciosos, que, em caso de não serem seguidos, podem gerar uma série de problemas como; versões incompatíveis de bibliotecas, codificação diferente de caracteres, ausência de módulo da distribuição do OS, entre vários outros não listados aqui. Isso faz com que um simples compartilhamento de projeto, ou implantação em produção torne-se uma grande dor de cabeça que pode consumir muitas horas desnecessariamente.

Máquinas virtuais

Uma solução para esse problema é a utilização de máquinas virtuais (VM), softwares que emulam o funcionamento de um computador físico (host) e permitem executar sistemas operacionais de forma totalmente isolada e sem dependência direta do hardware do host pelo intermédio de um componente (hypervisor). A VM pode ser configurada com o OS que o usuário desejar, bem como todos os demais programas. Após a configuração, esse “computador virtual” pode ser salvo em um arquivo chamado de imagem. A imagem então pode ser replicada e portada para ser executada em outras máquinas virtuais. Desta forma é possível portar todo um ambiente, pré-configurado como apenas um componente.

Mas nem tudo é um mar de rosas, manter uma VM com um sistema operacional é computacionalmente custoso, e também, um exagero quando criada com o propósito de executar um projeto em produção. Isso porque o sistema operacional tem muitas outras funções como por exemplo os controles de áudio e vídeo, e a VM acaba precisando criar recursos virtuais para tudo isso, além disso, rodar mais de uma VM no mesmo host implica em rodar vários sistemas operacionais virtuais.

A evolução do uso de VMs no desenvolvimento de software veio com a conteinerização. Nesse contexto Containers são como máquinas virtuais, porém com todas montadas sobre o mesmo motor (engine) que acessa diretamente o núcleo do sistema operacional (kernel), que é o responsável por interagir com o hardware. Assim o container virtualiza apenas as camadas acima do sistema operacional, isso permite o uso mais eficiente dos recursos computacionais.A figura a seguir ilustra a diferença na estrutura de VMs e containers:

Arquitetura de VM e Arquitetura de Container.

Docker

Docker é um projeto de código aberto baseado em contêineres. Ele usa recursos do kernel do Linux como namespaces e grupos de controle para criar contêineres. É muito fácil instalar o Docker, ele está disponível em versões nativas para Linux, Windows e Mac nesse endereço: https://docs.docker.com/get-docker. Após a instalação ele estará pronto para ser usado por linha de comando e já será possível criar imagens para a execução de containers.

As imagens Docker são geradas a partir de instruções contidas em um arquivo (Dockerfile), que define como a aplicação será empacotada, as dependências dela e quais processos executar quando o container for iniciado. Isso é muito bom para quem produz código, pois é possível manter o Dockerfile no diretório raiz do projeto e versiona-lo juntamente com o código desenvolvido.A figura abaixo mostra um exemplo de um Dockerfile com uma estrutura típica de uma aplicação Python.

Exemplo de um Dockerfile para conteinerizar uma aplicação Python.

Com o Docker é possível construir imagens reutilizando imagens compartilhadas por terceiros. No exemplo acima, é usada uma imagem pública que já possui Python 3. Para compartilhar uma imagem, basta enviá-la para uma algum repositório (registry) com um comando docker push. Na data deste artigo, o Docker Hub é o maior repositório, mais conhecido e também o padrão do Docker.

As imagens do Docker são um pouco diferentes das imagens de VMs, enquanto as imagens de VMs podem persistir seu estado, as imagens Docker se parecem mais com um template, ou seja, um o modelo mestre imutável que é usado para criar containers que são todos exatamente iguais. Para construir uma imagem, basta executar o comando docker build. Com a imagem construída, é possível rodar o container com o comando docker run. E esse é o básico do entendimento necessário para trilhar os primeiros passos com o Docker.

Conclusão

Existem vários benefícios em disponibilizar aplicações em containers, essas aplicações podem ser bancos de dados, pipelines, modelos de aprendizado de máquina ou qualquer outro projeto. Como cada aplicativo funciona dentro de seu próprio contêiner ele não atrapalha nenhum outro aplicativo. Empacotar todo o software e suas dependências no contêiner, garante que tudo seja implantado em todas as plataformas da maneira uniforme, também garante que a execução será da mesma forma, gerando as mesmas saídas esperadas. Isso torna a implantação fácil, rápida e com apenas uma dependência: o Docker.

Originally published at https://medium.com on November 23, 2020.

Impulsionar pessoas para inovar o mundo

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store