Docker + Visual Studio Code = Ambiente de Desenvolvimento Descomplicado

Olá, pessoal. Tudo bem com vocês? Espero que sim.

Quem aqui nunca sofreu na hora de montar o seu ambiente de desenvolvimento? Quantas e quantas bibliotecas e frameworks para configurar? Quantos problemas de incompatibilidade? Quantas vezes temos que montar ambientes de desenvolvimento diferentes? Com versões diferentes? Com dependências diferentes?

Bem, você pode dizer que utiliza máquinas virtuais para fazer tudo isso ou qualquer outra solução similar, e que funciona muito bem no seu dia a dia. Mesmo sabendo que você já sabe e que até já utiliza alguma solução bacana, eu gostaria de compartilhar com você mais uma forma bacana de resolver esses tipos de problemas.

E se eu te contar que você pode utilizar um container Docker como ambiente de desenvolvimento completo? Isso mesmo. Tipo… você vai abrir o seu ambiente de desenvolvimento (Visual Studio Code), vai escrever os seus códigos e, na hora de executar, todo o seu código utilizará um container de sua escolha para compilar/executar/publicar/consumir/etc. sem que você precise instalar aquele conjunto de dependências em sua máquina local! Num é legal?

Quando eu “descobri” esse truque foi bem interessante. Eu pensei:

poxa, seria legal se eu pudesse utilizar um container Docker como base para o desenvolvimento de sistemas, treinamento de modelos etc. Sem que fosse necessária a instalação de um monte de dependências na minha máquina local, num era?

Aí, me lembrei que um amigo havia comentado algo comigo algo parecido, há alguns meses, e que eu não tinha me tocado que era exatamente isso! Resolvi testar e estou encantado!

O Docker é uma das coisas mais legais dos últimos anos. E se você ainda não teve a oportunidade de trabalhar com ele, aconselho fortemente a começar agora. Se você já tem experiência, espero que curta essa dica aqui.

Trata-se do Visual Studio Code Remote Development Extension Pack (1). No nosso caso agora, do Containers extension. Esse pacote permitirá que você utilize um container Docker como base para o seu código. Isso significa dizer que, uma vez que você disponha de uma imagem Docker com todas as dependências necessárias para a execução do seu projeto, você poderá utilizá-la para desenvolver o seu código/modelos/etc sem a necessidade específica de instalar um monte de dependências em sua máquina local.

Qual é a vantagem disso? Eu vou enumerar algumas que eu achei interessantes para mim. Vamos lá:

  1. Posso criar uma ou utilizar uma imagem pronta Docker como base do meu código sem precisar passar por todo o processo doloroso de preparação de um ambiente de desenvolvimento;
  2. Posso compartilhar a mesma imagem com a minha equipe de desenvolvimento e não ter mais aquele problema de “na minha máquina funciona” no âmbito da minha equipe de desenvolvimento;
  3. Posso utilizar a mesma imagem para publicar o meu projeto;

Depois que você testar, eu tenho certeza que você também irá encontrar outros pontos legais. Compartilha aqui comigo, blz?

Passo 1: Instalando e Configurando o Docker e o Docker-Compose

Você precisa ter o Docker instalado e configurado adequadamente em sua máquina. Para tanto, eu aconselho que você siga os seguintes tutoriais:

  1. Instalação do Docker no Ubuntu (estou utilizando o Ubuntu): https://docs.docker.com/install/linux/docker-ce/ubuntu/;
  2. Instalação do Docker-Compose: https://docs.docker.com/compose/install/
  3. Instalação do Nvidia Container Runtime: https://nvidia.github.io/nvidia-container-runtime/

Nota: Eu também aconselho a instalação do Nvidia Container Runtime se a sua intenção é trabalhar com Deep Learning e/ou GPU. Eu vou postar um monte de coisa sobre Visão Computacional etc., e, caso você queira acompanhar, você vai precisar de uma GPU. Mas se você só quer utilizar esse novo conhecimento para desenvolver sistemas etc. pule essa etapa.

Passo 2: Instalando o Visual Studio Code

Caso você não tenha o Visual Studio Code instalado em sua máquina, você pode ver todo o procedimento aqui (https://code.visualstudio.com/). Supondo que você já tenha o Visual Studio Code instalado em sua máquina, então o abra.

Visual Studio Code.

Passo 3: Instalando o Visual Studio Code Remote — Containers

Vamos, agora, instalar o Visual Studio Code Remote — Containers. Com o Visual Studio Code aberto, pressione as teclas Ctrl + P para que a barra de procura de pacotes apareça.

Tem uma barrinha abaixo do título central Visual Studio Code. Percebeu?

Agora, digite o comando ext install ms-vscode-remote.remote-containers e pressione Enter para que o pacote seja instalado. Uma vez que o pacote for instalado, você poderá acessá-lo no canto esquerdo inferior do Visual Studio Code (botão verde).

← — — — — — — — — — — — Open a Remote Window— — — — — — — — — — — — — — — —

Passo 4: Criando o meu primeiro exemplo

Se você chegou até aqui, parabéns! Agora vamos testar o que fizemos. :)

Abra uma pasta no seu Visual Studio Code (se você já não o tiver feito…). Você precisa decidir se vai criar uma imagem Docker do zero ou se vai pegar uma imagem já publicada.

No nosso exemplo agora, eu vou utilizar uma imagem já pronta. Ela se chama nvcr.io/nvidia/pytorch:20.07-py3. Como já falei no meu primeiro post, eu vou utilizar o PyTorch em meus exemplos. Essa imagem é disponibilizada pela NVIDIA e você, caso queira, pode utilizar a mesma.

Vou criar um Dockerfile bem simples para este exemplo. Ele só terá a referência para a imagem e um comando habilitando o bash. Também criarei um arquivo README e um arquivo main.py para fazer o exemplo de utilização do Container.

Meu Dockerfile. Simples… simples…

Selecione a opção Open Folder in Container clicando no botão de Open a Remote Window. Selecione a pasta com os seus arquivos.

Selecione a opção from Dockerfile.

Agora, caso você não tenha a imagem em seu repositório de imagens Docker da imagem definida em seu Dockerfile, o Visual Studio Code realizará o seu download e, logo em seguida, configurará o seu ambiente para a utilização do Container como base de código. Quando o procedimento terminar, perceba que o terminal do seu Visual Studio Code está definido como o bash do seu Container. Também é possível ver que existe um Container em execução. Dá uma olhada no local do Open Folder in Container (lembra dele, né?)

Perceba, também, que uma pasta chamada .devcontainer foi criada em seu diretório e que, também, existe um arquivo chamado devcontainer.json foi criado. Toda a configuração necessária para a execução do seu ambiente está disponível nele. Agora é só aproveitar.

Arquivo devcontainer.json

Importei o PyTorch no arquivo main.py e chamei o comando para a verificação da versão instalada — fiz isso só para testar se tudo ocorreu bem.

Tudo lindo. :)

Pronto. Era isso. Espero que essa dica tenha sido útil para você.

Referencias

Senior Computer Vision Data Scientist at Conception Ro-Main (Quebec — CA). DSc in Computer Science. MTAC Brazil. https://github.com/adrianosantospb

Senior Computer Vision Data Scientist at Conception Ro-Main (Quebec — CA). DSc in Computer Science. MTAC Brazil. https://github.com/adrianosantospb