Executando Jupyter Notebook com Docker

Nesta postagem, mostrarei um tutorial passo-a-passo para a execução de um Jupyter Notebook com o uso do Docker. O tutorial abordará desde a instalação do Docker até a execução de um notebook com Python. O objetivo é demonstrar como o Docker pode ser uma solução útil para a execução de aplicativos de ciência de dados em diferentes ambientes e sistemas operacionais.

Introdução

Python e ciência de dados

Python é uma das linguagens de programação mais populares no mundo da ciência de dados. É amplamente utilizado por cientistas de dados, engenheiros e pesquisadores por causa de sua facilidade de uso e grande variedade de bibliotecas disponíveis. A biblioteca pandas, por exemplo, é uma das mais importantes para manipulação de dados e análise exploratória, enquanto a biblioteca scikit-learn é usada para machine learning e modelagem estatística.

Jupyter Notebook

A programação em REPL (Read-Eval-Print Loop) é uma técnica de programação interativa que é amplamente utilizada na ciência de dados. Ela permite que os usuários escrevam e executem códigos de maneira incremental, possibilitando a avaliação rápida e fácil dos resultados. Ferramentas como Jupyter Notebook permitem que a programação em REPL seja utilizada com recursos adicionais, como visualização de gráficos e exportação de arquivos em diferentes formatos.

Ambientes virtuais

O manejo de dependências de um aplicativo Python pode ser complicado e pode causar conflitos entre diferentes bibliotecas. Para solucionar esse problema, é comum o uso de ambientes virtuais (muitas vezes através da bilbioteca **venv**), que permitem a instalação e gerenciamento de pacotes Python em um ambiente isolado do sistema operacional. Isso evita conflitos entre versões de pacotes e permite a reprodutibilidade de resultados em diferentes máquinas.

Docker

O [Docker](https://www.docker.com/) é uma plataforma de contêineres que permite a execução de aplicativos em diferentes ambientes. É amplamente utilizado na ciência de dados para o gerenciamento de dependências e para a execução de aplicativos em diferentes máquinas e sistemas operacionais. O uso do Docker para a execução de um Jupyter Notebook pode simplificar o processo de configuração e garantir a compatibilidade entre diferentes bibliotecas e dependências.

Linguagens Julia e R

Embora Python seja a linguagem mais utilizada na ciência de dados, outras linguagens como Julia e R também são amplamente utilizadas. Felizmente, o Jupyter Notebook é compatível com essas linguagens e permite a execução de códigos e visualizações em um único ambiente interativo. Isso permite que os usuários possam escolher a linguagem mais adequada para o problema em questão sem a necessidade de mudar de ambiente ou plataforma.

Container

Imagem

Uma maneira fácil de executar um Jupyter Notebook com o Docker é utilizando a imagem docker jupyter/datascience-notebook , que já vem pré-configurada com o Jupyter Notebook e as principais bibliotecas de ciência de dados. Esta imagem pode ser baixada diretamente do Docker Hub e executada em um container, que expõe o servidor Jupyter para ser acessado por um navegador.

Arquivos locais

Uma vantagem do uso do Docker é a possibilidade de montar um diretório local no container, permitindo o acesso a arquivos locais e a persistência de dados gerados pelo notebook. Isso pode ser feito através da opção “-v” no momento da execução do container, especificando o diretório local a ser montado e o diretório no container onde ele deve ser montado.

Dependências

Para automatizar o manejo de dependências, é possível criar uma nova imagem Docker a partir da imagem ‘jupyter/datascience-notebook’ utilizando um Dockerfile. Neste arquivo, é possível copiar um arquivo de requisitos contendo as dependências necessárias e instalar essas dependências utilizando o pip. Após o build desta imagem personalizada, é possível executá-la em um container que já terá todas as dependências necessárias instaladas. Isso torna o processo de configuração e instalação de bibliotecas muito mais fácil e automatizado.

Exemplo

Para ilustrar o uso do Docker para execução de um Jupyter Notebook, neste tutorial vamos criar um projeto de exemplo que utiliza a biblioteca pandas para análise de dados.

Estrutura do diretório

A estrutura do diretório do projeto será a seguinte:

projeto_exemplo/
├── Dockerfile
├── notebooks/
│   └── exemplo.ipynb
└── requirements.txt

O arquivo exemplo.ipynb contém o código do Jupyter Notebook. O arquivo requirements.txt lista as dependências necessárias para executar o notebook.

Dockerfile

O Dockerfile para a criação da imagem personalizada a partir da imagem ‘jupyter/datascience-notebook’ será o seguinte:

FROM jupyter/datascience-notebook

COPY requirements.txt /tmp/
RUN pip install --upgrade pip && \
    pip isntall --requirement /tmp/requirements.txt

WORKDIR /home/jovyan/work/

Neste Dockerfile, estamos copiando o arquivo de requisitos para o diretório /tmp/ e instalando as dependências com o pip. Em seguida, selecionamos o diretório padrão do Jupyter Notebook /home/jovyan/work/.

Criação da imagem

Para criar a imagem personalizada a partir do Dockerfile, é necessário utilizar o comando docker build. O comando deve ser executado no diretório onde se encontra o Dockerfile e o contexto do build, que contém os arquivos necessários para construir a imagem.

O comando para criar a imagem personalizada a partir do Dockerfile no nosso exemplo seria o seguinte:

docker build --tag jupyter-exemplo .

Execução do container

Após a construção da imagem, podemos executá-la em um container utilizando o seguinte comando docker run:

docker run -it --rm -p 8888:8888 -v $(pwd)/notebooks:/home/jovyan/work/ jupyter-exemplo

Nota

Na configuração padrão, o container é executado com o usuário jovyan, o que impossibilita a execução de comandos com privilégios de superusuário (já que a senha do usuário é necessária). Para executar este tipo de comandos, é necessário criar um usuário e desabilitar a necessidade de prover a senha ao executar comandos com sudo.

docker run -it --rm  \
-p 8888:8888 \
--user root \
-e NB_USER="myuser" \
-e CHOWN_HOME=yes \
-e GRANT_SUDO=yes \
-w "/home/${NB_USER}" \
-v $(pwd)/notebooks:/home/myuser \
jupyter-exemplo

Este comando executa o container a partir da imagem personalizada, mapeia a porta do servidor Jupyter no host para a porta 8888 do container e monta o diretório de notebooks local no diretório padrão do Jupyter Notebook dentro do container.

Com isso, podemos acessar o notebook pelo navegador utilizando a URL fornecida pelo Docker no terminal, e começar a trabalhar com os dados utilizando a biblioteca pandas.

Conclusão

Neste tutorial, vimos como utilizar o Docker para facilitar o manejo de dependências e execução de um Jupyter Notebook em um projeto de ciência de dados. Com o uso de uma imagem personalizada a partir da imagem jupyter/datascience-notebook, podemos automatizar o processo de instalação de bibliotecas e configuração do ambiente de trabalho.

Além disso, mostramos um como criar uma imagem personalizada com dependências instaladas, além de como utilizar o Docker para executar um container e editar arquivos locais diretamente no Jupyter Notebook.

Espero que este tutorial prático tenha sido útil e possa ajudar na produtividade de quem está trabalhando com ciência de dados em Python. Tanto Jupyter Notebook quanto Docker são ferramentas poderosas para a criação de soluções de análise de dados mais eficientes e precisas.