Programa
A experiência prática é essencial para você dominar o Docker. O Docker é uma ferramenta essencial no desenvolvimento de software moderno e na ciência de dados, permitindo que você crie, implante e gerencie aplicativos em contêineres.
Neste artigo, apresento exemplos de projetos do Docker para iniciantes, intermediários e avançados, com foco em compilações em vários estágios, otimização de imagens do Docker e aplicação do Docker na ciência de dados. Esses projetos foram criados para aprofundar seu conhecimento sobre o Docker e aprimorar suas habilidades práticas.
Introdução aos projetos do Docker
Antes de começar a trabalhar nos projetos, verifique se você tem o Docker instalado em seu computador. Dependendo do seu sistema operacional (Windows, macOS, Linux), você pode fazer o download do Docker no site oficial do Docker.
Você também precisará de um conhecimento básico de:
- Dockerfiles (para definir o que está dentro dos seus contêineres)
- Docker Compose (para aplicativos com vários contêineres)
- Comandos básicos da CLI, como
docker build
,docker run
,docker-compose up
, etc.
Se você precisar aprimorar suas habilidades nos conceitos acima, confira os cursos Introdução ao Docker ou Conceitos de Containerização e Virtualização.
Vamos começar!
Projetos do Docker para iniciantes
Ao começar a usar o Docker, é importante escolher projetos que correspondam ao seu nível de habilidade e que desafiem você a aprender novos conceitos. Aqui estão algumas ideias de projetos para você começar:
Projeto 1: Configuração de um servidor da Web simples
Neste projeto, você criará um contêiner do Docker que executa um servidor Web básico usando o Nginx. O Nginx é um dos servidores da Web de código aberto mais populares para proxy reverso, balanceamento de carga e muito mais. Ao final deste projeto, você terá aprendido a criar e executar contêineres com o Docker e a expor portas para que o aplicativo possa ser acessado a partir da sua máquina local.
Nível de dificuldade: Iniciante
Tecnologias utilizadas: Docker, Nginx
Instruções passo a passo
- Instale o Docker: Certifique-se de que o Docker esteja instalado em seu sistema.
- Crie o diretório do projeto: Crie uma nova pasta e um arquivo
index.html
dentro dela que será servido pelo Nginx. - Escreva o Dockerfile: Um Dockerfile é um script que define o ambiente do contêiner. Ele informa ao Docker qual imagem base você deve usar, quais arquivos incluir e quais portas expor:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
- Crie a imagem do Docker: Navegue até a pasta do seu projeto e crie a imagem usando:
docker build -t my-nginx-app .
- Execute o contêiner: Inicie o contêiner e mapeie a porta 80 do contêiner para a porta 8080 em seu computador:
docker run -d -p 8080:80 my-nginx-app
- Acesse o servidor da Web: Abra o navegador e navegue até http://localhost:8080 para ver a página que você criou.
Projeto 2: Dockerização de um script Python
Este projeto envolve a conteinerização de um script Python simples que processa dados de um arquivo CSV usando a biblioteca pandas. O objetivo é aprender a gerenciar dependências e executar scripts Python dentro de contêineres do Docker, tornando o script portátil e executável em qualquer ambiente.
Nível de dificuldade: Iniciante
Tecnologias utilizadas: Docker, Python, pandas
Instruções passo a passo
- Escreva o script Python: Crie um script chamado
process_data.py
que leia e processe um arquivo CSV. Aqui está um exemplo de script:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
- Crie um arquivo
requirements.txt
: Esse arquivo lista as bibliotecas Python de que o script precisa. Nesse caso, precisamos apenas depandas
:
pandas
- Escreva o Dockerfile: Esse arquivo definirá o ambiente para o script Python:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
- Crie a imagem do Docker:
docker build -t python-script .
- Execute o contêiner:
docker run -v $(pwd)/data:/app/data python-script
Projeto 3: Criação de um aplicativo simples com vários contêineres
Este projeto ajudará você a se familiarizar com o Docker Compose criando um aplicativo com vários contêineres. Você criará um aplicativo Web simples usando o Flask como front-end e o MySQL como banco de dados de back-end. O Docker Compose permite que você gerencie vários contêineres que trabalham juntos.
Nível de dificuldade: Iniciante
Tecnologias utilizadas: Docker, Docker Compose, Flask, MySQL
Instruções passo a passo
- Escreva o aplicativo Flask: Crie um aplicativo Flask simples que se conecte a um banco de dados MySQL e exiba uma mensagem. Aqui está um exemplo:
from flask import Flask
import mysql.connector
app = Flask(__name__)
def get_db_connection():
connection = mysql.connector.connect(
host="db",
user="root",
password="example",
database="test_db"
)
return connection
@app.route('/')
def hello_world():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("SELECT 'Hello, Docker!'")
result = cursor.fetchone()
connection.close()
return str(result[0])
if __name__ == "__main__":
app.run(host='0.0.0.0')
- Crie o arquivo
docker-compose.yml
: O Docker Compose define e executa aplicativos Docker com vários contêineres. Nesse arquivo, você definirá o aplicativo Flask e os serviços do banco de dados MySQL:
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
FLASK_ENV: development
volumes:
- .:/app
volumes:
db_data:
- Escreva o Dockerfile para o Flask: Isso criará a imagem do Docker para o aplicativo Flask:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- Crie e execute os contêineres: Use o Docker Compose para exibir o aplicativo inteiro:
docker-compose up --build
- Acesse o aplicativo Flask: Acesse http://localhost:5000 em seu navegador.
Torne-se um engenheiro de dados
Projetos do Docker de nível intermediário
Os projetos a seguir são para aqueles que têm um sólido conhecimento dos conceitos básicos do Docker. Nelas, você aprenderá conceitos mais complexos, como compilações em vários estágios e técnicas de otimização.
Projeto 4: Criação em vários estágios para um aplicativo Node.js
As compilações em vários estágios ajudam a reduzir o tamanho das imagens do Docker, separando os ambientes de compilação e de tempo de execução. Neste projeto, você colocará em contêiner um aplicativo Node.js usando compilações em vários estágios.
Nível de dificuldade: Intermediário
Tecnologias utilizadas: Docker, Node.js, Nginx
Instruções passo a passo
- Crie um aplicativo Node.js simples: Escreva um servidor Node.js básico que retorne uma mensagem simples. Aqui está um exemplo:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Node.js'));
app.listen(3000, () => console.log('Server running on port 3000'));
- Escreva o Dockerfile com compilação em vários estágios: O primeiro estágio cria o aplicativo, e o segundo estágio executa o aplicativo com uma imagem de base mais clara.
# Stage 1: Build
FROM node:14 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Add the following line if there's a build step for the app
# RUN npm run build
# Stage 2: Run
FROM node:14-slim
WORKDIR /app
COPY --from=build-stage /app .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
- Crie a imagem:
docker build -t node-multi-stage .
- Execute o contêiner:
docker run -p 3000:3000 node-multi-stage
Projeto 5: Dockerização de um modelo de aprendizado de máquina com o TensorFlow
Este projeto envolverá a conteinerização de um modelo de aprendizado de máquina usando o TensorFlow. O objetivo é criar um ambiente portátil no qual você possa executar modelos do TensorFlow em vários sistemas sem se preocupar com a configuração subjacente.
Nível de dificuldade: Intermediário
Tecnologias utilizadas: Docker, TensorFlow, Python
Instruções passo a passo
- Instale o TensorFlow em um script Python: Crie um script Python
model.py
que carregue e execute um modelo TensorFlow pré-treinado:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
- Escreva o Dockerfile: Defina o ambiente para o TensorFlow dentro do Docker:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
- Crie a imagem:
docker build -t tensorflow-model .
- Execute o contêiner:
docker run tensorflow-model
Projeto 6: Criando um ambiente de ciência de dados com o Jupyter e o Docker
Este projeto se concentra na criação de um ambiente de ciência de dados reproduzível usando o Docker e os notebooks Jupyter. O ambiente incluirá bibliotecas Python populares, como pandas, NumPy e scikit-learn.
Nível de dificuldade: Intermediário
Tecnologias utilizadas: Docker, Jupyter, Python, scikit-learn
Instruções passo a passo
- Crie o arquivo
docker-compose.yml
: Defina o serviço do Jupyter Notebook e as bibliotecas necessárias. Aqui está um exemplo:
version: '3'
services:
jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/joelwembo/work
- Inicie o Jupyter Notebook: Use o Docker Compose para iniciar o Jupyter Notebook.
docker-compose up
- Acesse o Jupyter Notebook: Abra seu navegador e acesse http://localhost:8888.
Projetos do Docker de nível avançado
Esses projetos de nível avançado se concentrarão em aplicativos do mundo real e conceitos avançados do Docker, como pipelines de aprendizagem profunda e pipelines de dados automatizados.
Projeto 7: Reduzindo o tamanho de uma imagem do Docker para um aplicativo Python
Neste projeto, você otimizará uma imagem do Docker para um aplicativo Python usando imagens básicas mínimas, como o Alpine Linux, e implementando compilações em vários estágios para manter o tamanho da imagem o menor possível.
Nível de dificuldade: Avançado
Tecnologias utilizadas: Docker, Python, Alpine Linux
Instruções passo a passo
- Escreva o script Python: Crie um script que analise dados usando o pandas. Aqui está um exemplo de script:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
- Otimize o Dockerfile: Use compilações em vários estágios e o Alpine Linux para criar uma imagem leve.
# Stage 1: Build stage
FROM python:3.9-alpine as build-stage
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY script.py .
# Stage 2: Run stage
FROM python:3.9-alpine
WORKDIR /app
COPY --from=build-stage /app/script.py .
CMD ["python", "script.py"]
- Crie a imagem:
docker build -t optimized-python-app .
Projeto 8: Dockerização de um pipeline de aprendizagem profunda com o PyTorch
Este projeto envolve a conteinerização de um pipeline de aprendizagem profunda usando o PyTorch. O foco é otimizar o Dockerfile para desempenho e tamanho, facilitando a execução de modelos de aprendizagem profunda em diferentes ambientes.
Nível de dificuldade: Avançado
Tecnologias utilizadas: Docker, PyTorch, Python
Instruções passo a passo
- Instale o PyTorch em um script Python: Crie um script que carregue um modelo PyTorch pré-treinado e realize a inferência. Aqui está um exemplo:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
- Escreva o Dockerfile: Defina o ambiente para o PyTorch:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY model.py .
CMD ["python", "model.py"]
- Crie a imagem:
docker build -t pytorch-model .
- Execute o contêiner:
docker run pytorch-model
Projeto 9: Automatizando pipelines de dados com o Apache Airflow e o Docker
Neste projeto, você configurará e colocará em contêiner um ambiente do Apache Airflow para automatizar pipelines de dados. O Apache Airflow é uma ferramenta popular para orquestrar fluxos de trabalho complexos amplamente usados na engenharia de dados.
Nível de dificuldade: Avançado
Tecnologias utilizadas: Docker, Apache Airflow, Python, PostgreSQL
Instruções passo a passo
- Crie o arquivo
docker-compose.yml
: Defina os serviços do Airflow e o banco de dados PostgreSQL:
version: '3'
services:
postgres:
image: postgres:latest
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
webserver:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- ./dags:/opt/airflow/dags
command: ["webserver"]
scheduler:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
- webserver
volumes:
- ./dags:/opt/airflow/dags
command: ["scheduler"]
volumes:
postgres_data:
- Inicie o ambiente Airflow: Use o Docker Compose para criar o ambiente do Airflow:
docker-compose up
- Acesse a interface do usuário do Airflow: Abra seu navegador e acesse http://localhost:8080.
Projeto 10: Implementação de uma API de ciência de dados com FastAPI e Docker
Crie e implemente uma API de ciência de dados usando FastAPI. Você colocará a API em contêineres usando o Docker e se concentrará em otimizá-la para ambientes de produção.
Nível de dificuldade: Avançado
Tecnologias utilizadas: Docker, FastAPI, Python, scikit-learn
Instruções passo a passo
- Escreva o aplicativo FastAPI: Crie uma API simples que use um modelo de aprendizado de máquina para previsões. Aqui está um exemplo:
from fastapi import FastAPI
import pickle
app = FastAPI()
with open("model.pkl", "rb") as f:
model = pickle.load(f)
@app.post("/predict/")
def predict(data: list):
return {"prediction": model.predict(data)}
- Escreva o Dockerfile: Crie um Dockerfile que defina o ambiente para o FastAPI:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
- Crie a imagem:
docker build -t fastapi-app .
- Execute o contêiner:
docker run -p 8000:8000 fastapi-app
Dicas para trabalhar em projetos do Docker
Enquanto você trabalha nesses projetos, tenha em mente as dicas a seguir:
- Comece com pouco: Comece com projetos ligeiramente desafiadores e depois passe para tarefas mais complexas. É fundamental desenvolver a confiança em tarefas mais simples.
- Documente seu progresso: Mantenha um registro detalhado de seus projetos para acompanhar seu aprendizado e usá-lo como referência para empreendimentos futuros.
- Participe das comunidades do Docker: Participe de fóruns on-line e encontros locais para compartilhar suas experiências, fazer perguntas e aprender com outras pessoas.
- Experimente e personalize: Não tenha medo de ajustar os projetos, tentar abordagens diferentes e explorar novos recursos do Docker.
- Continue aprendendo: Continue a expandir seus conhecimentos sobre o Docker explorando tópicos e ferramentas avançados, como Kubernetes, Docker Swarm ou arquitetura de microsserviços.
Conclusão
Dominar o Docker envolve mais do que apenas aprender comandos e configurações. Trata-se de entender como o Docker se encaixa no desenvolvimento de aplicativos modernos, nos fluxos de trabalho de ciência de dados e no gerenciamento de infraestrutura.
Os projetos que compartilhei neste guia forneceram algumas ideias para você desenvolver as habilidades básicas e a experiência prática necessárias para se destacar em cenários do mundo real.
Nesse momento, sugiro que você solidifique seu conhecimento seguindo esses cursos:
Torne-se um engenheiro de dados
Perguntas frequentes
Quais são as práticas recomendadas para escrever Dockerfiles eficientes?
As práticas recomendadas para escrever Dockerfiles eficientes incluem minimizar o número de camadas combinando comandos, usar compilações em vários estágios para reduzir o tamanho da imagem, selecionar imagens de base leves, armazenar dependências em cache e evitar incluir arquivos desnecessários na imagem final.
O que é uma compilação em vários estágios no Docker?
Uma compilação em vários estágios é um método para otimizar as imagens do Docker, separando os ambientes de compilação e de tempo de execução. Isso resulta em imagens menores e mais seguras.
Como você pode reduzir o tamanho de uma imagem do Docker?
Use imagens de base mínimas, gerencie dependências de forma eficiente e empregue compilações em vários estágios para reduzir o tamanho da imagem e melhorar o desempenho.
Como faço para solucionar erros comuns ao criar imagens do Docker?
Os erros comuns ao criar imagens do Docker incluem problemas de permissão, sintaxe incorreta do Dockerfile e falha na instalação de dependências. Para solucionar problemas, verifique os logs de compilação do Docker, certifique-se de que você está usando a imagem de base correta e confirme se os caminhos ou as permissões de arquivo estão definidos corretamente. Ferramentas como docker build --no-cache
podem ajudar a identificar problemas de cache.
Posso usar o Docker com o Kubernetes para esses projetos?
Sim, quando você se sentir confortável com o Docker, o Kubernetes pode ser a próxima etapa. O Kubernetes ajuda a gerenciar aplicativos em contêineres em escala. Você pode implantar seus projetos do Docker em um cluster do Kubernetes para gerenciar várias instâncias, lidar com o dimensionamento e automatizar implantações.
Quais são as práticas recomendadas para gerenciar volumes e dados persistentes do Docker?
Ao trabalhar com volumes do Docker, é importante usar volumes nomeados para garantir a persistência dos dados entre as reinicializações do contêiner. Faça backups regulares dos volumes e monitore se há gargalos de desempenho devido à E/S do disco. Evite armazenar dados confidenciais diretamente em contêineres; em vez disso, use soluções de armazenamento seguro ou bancos de dados externos.
Qual é a finalidade da diretiva ENTRYPOINT em um Dockerfile?
A diretiva ENTRYPOINT
em um Dockerfile especifica o comando que sempre será executado quando um contêiner for iniciado. Ele permite que o contêiner seja tratado como um executável, no qual os argumentos podem ser passados durante o tempo de execução, aumentando a flexibilidade.
Qual é a diferença entre CMD e ENTRYPOINT em um Dockerfile?
Tanto CMD
quanto ENTRYPOINT
especificam comandos a serem executados quando um contêiner é iniciado. No entanto, CMD
fornece argumentos padrão que podem ser substituídos, enquanto ENTRYPOINT
define o comando que sempre é executado. ENTRYPOINT
é útil para criar contêineres que funcionam como executáveis, enquanto CMD
é mais flexível para especificar comandos padrão.