Docker vs Kubernetes: Principais diferenças, como eles funcionam juntos e o que você precisa
Docker e Kubernetes não são realmente rivais. Um empacota e executa contêineres, enquanto o outro os gerencia em muitas máquinas. Saiba onde cada um se encaixa, veja um aplicativo sendo executado com ambos e decida o que seu projeto precisa.
- O Docker cria imagens e executa contêineres, normalmente em uma máquina.
- O Kubernetes programa e gerencia contêineres em um cluster de máquinas.
- Eles geralmente são usados juntos: o Docker constrói a imagem e o Kubernetes a executa na produção.
- A comparação mais justa é Kubernetes vs Docker Swarm ou Compose, e muitos projetos pequenos não precisam do Kubernetes.
Pesquisar por Docker vs Kubernetes sugere que você deve escolher um, mas esse enquadramento causa muita confusão. É um pouco como comparar um contêiner com o porto que organiza milhares deles. Eles operam em níveis diferentes e muitas vezes são usados lado a lado.
Este guia explica o que cada um faz, mostra o mesmo pequeno aplicativo em ambos e termina com uma forma prática de decidir. Os comandos e arquivos aqui são exemplos padrão que não executamos neste artigo, portanto, compare-os com as versões que você instalou.
A resposta curta
Docker é uma plataforma para empacotar um aplicativo e suas dependências em uma imagem e, em seguida, executar essa imagem como um contêiner. Ele responde à pergunta “como faço para que este aplicativo funcione da mesma maneira em todos os lugares?”
Kubernetes, geralmente escrito K8s, é um orquestrador de contêineres. Ele decide onde os contêineres são executados em muitas máquinas, reinicia-os quando falham e os dimensiona de acordo com a demanda. Ele responde à pergunta “como mantenho centenas de contêineres funcionando de maneira confiável?”
Docker x Kubernetes lado a lado
| Aspecto | Docker | Kubernetes |
|---|---|---|
| Trabalho principal | Crie e execute contêineres | Orquestrar contêineres |
| Escopo | Geralmente um host | Um cluster de muitos nós |
| Constrói imagens? | Sim | Não |
| Unidade básica | Recipiente | Pod (um ou mais contêineres) |
| Configuração | Dockerfile, compose.yaml |
Manifestos YAML |
| Contêiner com falha | Política de reinicialização opcional nesse host | Substituído automaticamente, mesmo em outro nó |
| Dimensionamento | Manual, em um host com o Compose | Declarativo, com opções de escalonamento automático |
| Rede | Ponte de redes em um host | Serviços e DNS em todo o cluster |
| Curva de aprendizado | Suave | Íngreme |
| Melhor para | Desenvolvimento e pequenas implantações | Grandes sistemas de produção |
O que o Docker faz
Antes dos containers, “funciona na minha máquina” era um problema diário, pois cada servidor tinha versões diferentes de tudo. O Docker agrupa seu código, tempo de execução e bibliotecas em uma imagem. Uma cópia em execução dessa imagem é um contêiner e compartilha o kernel do host, portanto inicia mais rápido e usa menos memória do que uma máquina virtual completa.
O fluxo de trabalho tem três etapas:
- Construir: a
Dockerfiledescreve como criar a imagem. - Enviar: envia a imagem para um registro, como o Docker Hub.
- Executar: inicia contêineres a partir dessa imagem em qualquer máquina compatível.
Para praticar, comece com nosso tutorial do Docker para iniciantes e depois leia nossas práticas recomendadas do Dockerfile.
O que o Kubernetes faz
O Docker em um servidor funciona bem até que o servidor falhe, o tráfego o supere ou você tenha dezenas de serviços para coordenar. O Kubernetes cuida destes trabalhos operacionais:
- Programação: colocação de contêineres em máquinas com capacidade livre suficiente.
- Autocorreção: substituição de contêineres com falha e remoção do trabalho de nós com falha.
- Escalonamento: adição ou remoção de cópias, manualmente ou com base em métricas.
- Descoberta de serviço: dar a um grupo variável de contêineres um nome estável.
- Atualizações contínuas: lançamento de novas versões gradualmente, com uma simples reversão.
- Configuração: gerenciamento de configurações e segredos separadamente das imagens.
A ideia central é estado desejado. Você declara que deveriam existir três cópias, e os controladores continuam comparando isso com a realidade e corrigindo qualquer diferença. Nosso tutorial do Kubernetes para iniciantes aborda isso em um cluster local.
Como Docker e Kubernetes funcionam juntos
Um caminho típico do laptop de um desenvolvedor até a produção é assim:
- Um desenvolvedor escreve um
Dockerfilee testa o contêiner localmente. - Um pipeline de CI/CD cria a imagem e executa os testes.
- O pipeline envia uma imagem com versão para um registro.
- Um manifesto do Kubernetes é atualizado para usar essa versão da imagem.
- O Kubernetes extrai a imagem e a distribui pelo cluster.
Portanto, o trabalho do Docker está praticamente concluído antes do início do Kubernetes. A imagem é o ponto de transferência entre eles.
Um aplicativo, nos dois sentidos
Aqui está um pequeno serviço web. A imagem é construída da mesma forma, independentemente da ferramenta que a executa:
# Dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Executando com Docker
docker build -t shop-api:1.0 .
docker run -d --name shop -p 8080:8000 --restart unless-stopped shop-api:1.0
Dois comandos e ele está em execução. Isso é simples e adequado para muitos projetos pequenos. Mas há uma cópia em uma máquina e, se a máquina morrer, o serviço vai junto.
Executando com Kubernetes
# shop.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: shop
spec:
replicas: 3
selector:
matchLabels:
app: shop
template:
metadata:
labels:
app: shop
spec:
containers:
- name: api
image: registry.example.com/shop-api:1.0
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
ports:
- port: 80
targetPort: 8000
kubectl apply -f shop.yaml
kubectl get pods -l app=shop
Há muito mais para escrever e você precisa de um cluster para executá-lo. Em troca, você recebe três cópias, um endereço interno estável e substituição automática. Essa compensação é toda a decisão em miniatura: mais complexidade em troca de mais resiliência.
O que acontece quando um contêiner falha?
| Evento | Docker em um host | Kubernetes |
|---|---|---|
| Falhas no aplicativo | Reiniciado, se uma política de reinicialização estiver definida | Reiniciado automaticamente |
| O aplicativo trava, mas continua em execução | Permanece travado a menos que você adicione manipulação para isso | Uma investigação de atividade pode reiniciá-lo |
| Todo o servidor morre | O serviço fica inativo até que alguém aja | Os pods são recriados em nós íntegros |
| Tráfego triplica | Você escala manualmente, em um host | Um escalonador automático pode adicionar cópias |
| Um lançamento ruim | Você reimplanta a imagem antiga manualmente | desfazer implementação do kubectl |
A confusão dockershim
Você deve ter lido que “Kubernetes abandonou o Docker”. Isso é verdade em sentido estrito e assustou muitas pessoas desnecessariamente. O Kubernetes executa contêineres por meio de um padrão chamado Container Runtime Interface. O Docker Engine não o implementou diretamente, então o Kubernetes incluiu um adaptador chamado dockershim. Esse adaptador foi removido na versão 1.24.
Os clusters agora normalmente usam tempos de execução como containerd ou CRI-O. As imagens que você cria com o Docker ainda funcionam, porque seguem o padrão de imagem da Open Container Initiative (OCI). Assim, você pode continuar construindo com o Docker e seu cluster executará o resultado com um tempo de execução diferente.
Docker Compose x Swarm x Kubernetes
A comparação mais significativa é entre ferramentas que coordenam contêineres:
| Ferramenta | Escopo | Esforço de configuração | Bom para |
|---|---|---|---|
| Composição do Docker | Um anfitrião | Muito baixo | Desenvolvimento local, pequenos aplicativos |
| Enxame Docker | Pequeno aglomerado | Baixo | Configurações simples de vários servidores |
| Kubernetes | Grandes aglomerados | Alto | Sistemas complexos e de grande escala |
Docker Compose inicia vários contêineres relacionados a partir de um arquivo e é excelente para um aplicativo da web e um banco de dados em um laptop. O Swarm está integrado ao Docker e é muito mais fácil de aprender do que o Kubernetes, mas possui um ecossistema muito menor. O Kubernetes tem a maior comunidade e ferramentas, o que explica em grande parte o motivo pelo qual se tornou o padrão para grandes implantações.
Dica: compare os custos reais. Kubernetes significa atualizações contínuas, trabalho de segurança e monitoramento, além de aprendizado. Um serviço gerenciado, como Amazon EKS, Google GKE ou Azure AKS, reduz esse trabalho, mas não o elimina.
Qual você precisa?
O Docker sozinho geralmente é suficiente quando:
- Você está desenvolvendo localmente ou executando um pequeno aplicativo em um servidor.
- Você tem uma equipe pequena e nenhuma equipe de operações dedicada.
- Breves períodos de inatividade ocasionais são aceitáveis.
Kubernetes começa a fazer sentido quando:
- Você executa muitos serviços que diferentes equipes implantam por conta própria.
- Você precisa de alta disponibilidade em diversas máquinas ou zonas.
- O tráfego varia o suficiente para que o escalonamento automático economize dinheiro real.
- Você tem as habilidades ou o orçamento para operá-lo.
Também existe um meio-termo. Plataformas de contêineres gerenciados, como AWS Fargate, Google Cloud Run ou PaaS, executam sua imagem Docker sem um cluster para manter. Para muitas empresas em crescimento, esse é o próximo passo certo, em vez de saltar direto para o Kubernetes.
Se você quiser aprender ambos por motivos profissionais, a ordem é clara: primeiro Docker, depois Kubernetes. Você não pode depurar um pod confortavelmente sem primeiro entender imagens, portas e logs de contêiner.
Erros comuns
- Adotar o Kubernetes muito cedo. Copiar a arquitetura de uma empresa gigante pode enterrar uma pequena equipe no trabalho operacional.
- Usando a tag
latestna produção. Você não pode saber o que está em execução ou reverter de maneira confiável. Use tags de versão específicas. - Armazenamento de dados dentro de contêineres. Os contêineres são descartáveis, portanto, use volumes ou um banco de dados gerenciado.
- Ignorando verificações de integridade. Sem testes de prontidão e atividade, o Kubernetes não poderá tomar boas decisões sobre seu aplicativo.
- Esquecendo os limites de recursos. Um contêiner ganancioso pode privar todo o resto de um nó.
Considerações finais
O Docker empacota seu software e o Kubernetes o executa em escala. Em vez de perguntar o que é melhor, pergunte qual é o problema que você tem hoje. Se for “meu aplicativo é difícil de instalar”, use o Docker. Se for “meus 40 serviços precisam sobreviver a falhas de servidor”, veja o Kubernetes. Comece com a ferramenta mais simples que resolve seu problema real e avance quando perceber a necessidade.
Perguntas frequentes
O Kubernetes pode substituir o Docker?
Não inteiramente, pois eles fazem trabalhos diferentes. O Kubernetes não cria imagens, então as equipes ainda usam o Docker ou uma ferramenta semelhante para isso, e o Kubernetes executa os resultados.
Posso usar Kubernetes sem Docker?
Sim. Os clusters geralmente executam contêineres com containerd ou CRI-O. Imagens construídas com Docker ainda funcionam porque seguem o padrão OCI.
Devo aprender Docker ou Kubernetes primeiro?
Aprenda Docker primeiro. O Kubernetes pressupõe que você já entenda imagens, contêineres, portas e logs, portanto, esses princípios básicos facilitarão muito o aprendizado.
O Docker Swarm está morto?
Não, ainda está disponível e é adequado para clusters simples. No entanto, seu ecossistema e adoção são muito menores que os do Kubernetes, portanto, verifique se ele atende às suas necessidades de longo prazo.
As pequenas empresas precisam do Kubernetes?
Geralmente não no início. O Docker Compose ou uma plataforma de contêiner gerenciada geralmente atende bem a eles, até que a escala ou a estrutura da equipe façam com que o Kubernetes valha seu custo.
Continue aprendendo
Precisa de ajuda com testes, WordPress ou SEO?
Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.
Mais guias sobre testes, IA e desenvolvimento moderno
Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.
Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las
Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…
Leia o artigo →DevOpsVariáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos
Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…
Leia o artigo →Desenvolvimento de softwareExplicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429
Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…
Leia o artigo →Automação de testesZombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem
Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…
Leia o artigo →Teste de softwareCobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa
Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…
Leia o artigo →Bancos de dados e SQLDELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um
DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…
Leia o artigo →Bancos de dados e SQLExibições SQL explicadas: crie, use e evite as armadilhas, com exemplos
Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…
Leia o artigo →Desenvolvimento de softwareInterface TypeScript vs tipo: diferenças reais, testadas com o compilador
Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…
Leia o artigo →Desenvolvimento de softwarePython *args e **kwargs explicados: funções flexíveis com exemplos claros
Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…
Leia o artigo →Desenvolvimento de softwareFunções Python Lambda: sintaxe, usos reais e quando não usá-los
Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …
Leia o artigo →Inteligência artificialO que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar
O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …
Leia o artigo →DevOpsMonitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos
Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…
Leia o artigo →DevOpsDocker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa
Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…
Leia o artigo →Automação de testesTDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um
TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…
Leia o artigo →Teste de softwareTeste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais
Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…
Leia o artigo →Bancos de dados e SQLValores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas
Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…
Leia o artigo →Bancos de dados e SQLInstrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns
SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…
Leia o artigo →Desenvolvimento de softwareO que é JWT? JSON Web Tokens explicados com um exemplo prático
O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…
Leia o artigo →Desenvolvimento de softwareLoop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos
O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…
Leia o artigo →Desenvolvimento de softwareGeradores Python e rendimento explicado: economize memória com exemplos reais
Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…
Leia o artigo →Inteligência artificialO que são incorporações? Similaridade de vetores e cossenos explicada de forma simples
O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…
Leia o artigo →DevOpsImplantação azul-verde vs canário: diferenças, compensações e como escolher
Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…
Leia o artigo →Automação de testesTestes instáveis: o que os causa e como corrigi-los para sempre
Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…
Leia o artigo →Teste de softwareTeste de carga versus teste de estresse: diferenças, métricas e exemplos k6
Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…
Leia o artigo →Teste de softwareCaso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um
Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…
Leia o artigo →Bancos de dados e SQLOtimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos
Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…
Leia o artigo →Bancos de dados e SQLSQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado
SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…
Leia o artigo →Desenvolvimento de softwareTutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite
Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …
Leia o artigo →Desenvolvimento de softwareManipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos
Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…
Leia o artigo →Desenvolvimento de softwareClasses e objetos Python: tutorial OOP com exemplos reais
Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…
Leia o artigo →Inteligência artificialO que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros
O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…
Leia o artigo →DevOpsComandos Linux para iniciantes: o guia essencial do terminal com exemplos
Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …
Leia o artigo →Automação de testesSelenium vs Playwright: principais diferenças, código comparado e qual escolher
Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …
Leia o artigo →Teste de softwareParticionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos
Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…
Leia o artigo →Teste de softwareGravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais
Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…
Leia o artigo →Bancos de dados e SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos
Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…
Leia o artigo →Bancos de dados e SQLTransações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento
Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …
Leia o artigo →Desenvolvimento de softwareFolha de dicas dos comandos do Git: os comandos que você realmente usa, com exemplos
Uma folha de dicas de comandos Git agrupada por tarefa: configuração, preparação, ramificações, controles remotos, stash, histórico e desfazer erros…
Leia o artigo →Desenvolvimento de softwareExplicação das promessas de JavaScript: então, catch, Promise.all e erros comuns
Promessas JavaScript explicadas com o código que executamos: estados, cadeias then e catch, tratamento de erros, Promise.all, allSettled, race e any…
Leia o artigo →Desenvolvimento de softwareTutorial do dicionário Python: métodos, exemplos e padrões comuns
Um tutorial de dicionário Python com código que executamos: criar, ler e atualizar dictos, métodos-chave, mesclagem, compreensão, padrões de contage…
Leia o artigo →Inteligência artificialO que é RAG? Geração aumentada de recuperação explicada com um exemplo prático
O que é RAG? Geração aumentada de recuperação explicada passo a passo: indexação, chunking, embeddings, recuperação, um pequeno exemplo funcional de…
Leia o artigo →DevOpsTutorial Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos
Um tutorial do Terraform para iniciantes: comece sem conta na nuvem, aprenda como iniciar, planejar e aplicar, depois variáveis, saídas, estado, mód…
Leia o artigo →DevOpsDocker vs Kubernetes: principais diferenças, como eles funcionam juntos e o que você precisa
Docker vs Kubernetes explicado: o que cada um faz, o mesmo aplicativo rodando com ambos, Docker Compose e Swarm comparados, a mudança do dockershim …
Leia o artigo →Automação de testesTutorial Pytest para iniciantes: luminárias, parametrização e exemplos reais
Um tutorial pytest para iniciantes com testes que executamos no pytest 9.2: asserções, fixtures, parametrizar, conftest, marcadores, tmp_path, monke…
Leia o artigo →Teste de softwareCiclo de vida de teste de software (STLC): 6 fases, critérios de entrada e saída, exemplo
O ciclo de vida de teste de software explicou: seis fases do STLC com critérios de entrada e saída, resultados, um exemplo de recurso de login funci…
Leia o artigo →Desenvolvimento de softwareGit merge vs rebase: diferenças, exemplos e quando usar cada um
Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.
Leia o artigo →Desenvolvimento de softwareList comprehension em Python: sintaxe, exemplos e quando evitar
List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.
Leia o artigo →Bancos de dados e SQLSQL JOIN explicado com exemplos (Inner, Left, Right, Full)
Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…
Leia o artigo →