Buscar

Docker para Iniciantes: Tutorial Completo

Tutorial de Docker para iniciantes. O que é, como instalar, criar seu primeiro container, usar o Docker Compose e construir sua própria imagem, passo a passo.

Gabriel Pedroso12 min de leitura
Docker para iniciantes

Docker empacota a sua aplicação junto com tudo que ela precisa para rodar — código, dependências e configuração — dentro de um container isolado que funciona igual no seu notebook, no servidor do colega e em produção. É o fim do clássico "na minha máquina funcionava". Este tutorial mostra, passo a passo, o que é Docker, como instalar, criar seu primeiro container e construir sua própria imagem.

Se você já programou mas nunca usou Docker, o caminho do iniciante é este:

1InstalarDocker Desktop (Win/Mac) ou o script no Linux
2docker runsobe seu primeiro container de uma imagem pronta
3Dockerfilea receita da sua própria aplicação
4docker builda receita vira uma imagem sua, versionada
5Composesobe app + banco juntos com um comando
O caminho do iniciante no Docker: instalar, rodar um container pronto, escrever seu próprio Dockerfile, construir a imagem e, por fim, orquestrar vários serviços com o Compose.

O que é Docker e por que ele existe

Imagine que você desenvolveu uma aplicação Node.js. Funciona perfeitamente no seu notebook. Você sobe para o servidor de produção e… quebra. Por quê? O seu notebook tem o Node 20, o servidor tem o Node 18. As versões das bibliotecas são diferentes. A versão do OpenSSL é outra.

Esse é exatamente o problema que o Docker resolve: se funciona dentro do container no seu ambiente, funciona igual em produção, porque o container carrega junto o ambiente inteiro da aplicação.

Como era antes: máquinas virtuais

Para reduzir a diferença entre desenvolvimento e produção, a solução tradicional era a máquina virtual (VM). Uma VM emula um computador inteiro — hardware virtual e sistema operacional completo — dentro do servidor. Isolamento excelente, mas pesado: cada VM ocupa gigabytes de disco e leva dezenas de segundos (ou minutos) para subir.

Como é com Docker: containers

O container não emula hardware nenhum. Ele é um processo isolado que compartilha o kernel do host e carrega apenas o que a aplicação precisa por cima dele. Por isso é medido em megabytes, não gigabytes, e sobe em segundos.

Analogia: a VM é uma casa completa construída dentro do seu servidor — fundação, encanamento, tudo. O container é um quarto mobiliado dentro de uma casa que já existe. Cabem muito mais quartos do que casas no mesmo terreno.

CritérioContainer DockerMáquina Virtual (VM)
IsolamentoProcesso isolado que compartilha o kernel do hostSistema operacional completo, separado
TamanhoMegabytes (imagens leves)Gigabytes (SO inteiro)
InicializaçãoSegundosDezenas de segundos a minutos
OverheadMínimoSignificativo (hypervisor + SO)
Isolamento de segurançaModerado (kernel compartilhado)Alto (SO totalmente separado)

Na prática, as duas tecnologias se complementam: é muito comum rodar containers dentro de VMs na nuvem — a VM entrega o isolamento do hardware, o container entrega a padronização do ambiente.

Conceitos fundamentais do Docker

1. Imagem (image)

A imagem é o template — a receita imutável de como o container deve ser montado. Ela contém:

  • um sistema base enxuto (por exemplo, uma distribuição Linux slim);
  • o runtime e as dependências (Node, Python, etc.);
  • o seu código;
  • a configuração de como executar.

Analogia: a imagem é a receita do bolo. O container é o bolo assado a partir dela.

2. Container

O container é uma instância em execução de uma imagem. Você constrói a imagem uma vez e sobe quantos containers quiser a partir dela — cada um isolado, com seu próprio processo, sistema de arquivos e rede.

3. Dockerfile

O Dockerfile é o arquivo de texto com as instruções para construir uma imagem. Exemplo:

FROM node:20
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]

Linha a linha, este Dockerfile:

  1. FROM node:20 — parte da imagem oficial do Node 20;
  2. WORKDIR /app — define /app como diretório de trabalho;
  3. COPY . . — copia os arquivos do projeto para dentro da imagem;
  4. RUN npm install — instala as dependências durante o build;
  5. EXPOSE 3000 — documenta que o container escuta na porta 3000;
  6. CMD ["npm", "start"] — o comando que roda quando o container sobe.

4. Docker Hub

O Docker Hub é o registry (repositório) público de imagens — o equivalente ao GitHub para imagens de container. Ali você encontra milhões de imagens oficiais e prontas: Node, Python, MySQL, nginx, WordPress rodando em Docker e centenas de outras.

Instalando o Docker

Windows e Mac: Docker Desktop

  1. Acesse docker.com/products/docker-desktop;
  2. clique em "Download for Windows" ou "Download for Mac";
  3. execute o instalador e siga o assistente;
  4. reinicie o computador se for solicitado;
  5. pronto — o Docker está instalado.

Linux: linha de comando

O jeito mais rápido é o script oficial de conveniência:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

A última linha adiciona seu usuário ao grupo docker para você não precisar de sudo a cada comando. Saia e entre de novo na sessão para valer.

Verificar a instalação

Abra o terminal e digite:

docker --version

Deve retornar algo como Docker version 27.1.1.

Seu primeiro container

Vamos rodar o container mais simples que existe:

docker run hello-world

Saída esperada:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Parabéns: você rodou seu primeiro container. Nos bastidores, o Docker:

  1. procurou a imagem hello-world localmente e não encontrou;
  2. baixou a imagem do Docker Hub;
  3. criou um container a partir dela;
  4. executou o container (que imprimiu a mensagem);
  5. encerrou, porque o processo terminou.

Containers na prática: Node, Python e MySQL

1. Node.js interativo

docker run -it node:20 bash

As flags:

  • -i (interactive) mantém a entrada aberta para você digitar;
  • -t aloca um pseudo-terminal (TTY) dentro do container.

Você caiu num shell dentro do container Node. Rode o REPL e teste:

node
console.log("Olá do Docker!")

Saia do REPL com Ctrl+D e do container com exit.

2. Servidor web com Python

docker run -p 8000:8000 python:3.11 python -m http.server

A flag -p 8000:8000 mapeia a porta 8000 do container para a porta 8000 da sua máquina. Agora abra http://localhost:8000 no navegador — é um servidor Python servindo de dentro do container.

3. Banco de dados MySQL

docker run -d \
  -e MYSQL_ROOT_PASSWORD=senha123 \
  -p 3306:3306 \
  mysql:8.0

As flags:

  • -d (detached) roda o container em segundo plano;
  • -e MYSQL_ROOT_PASSWORD=... define uma variável de ambiente (a senha do root);
  • -p 3306:3306 publica a porta do MySQL.

Conecte com o cliente mysql instalado na sua máquina:

mysql -h 127.0.0.1 -u root -psenha123

Aviso: senha123 é só para teste local. Use uma senha forte e nunca a deixe fixa no repositório.

Criando sua própria imagem

Agora vamos empacotar uma aplicação Node de verdade.

Passo 1: crie o Dockerfile

No seu projeto, crie um arquivo chamado Dockerfile (sem extensão):

FROM node:20-alpine

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

Copiar primeiro só o package.json e o package-lock.json (antes do resto do código) faz o Docker reaproveitar a camada de dependências no cache — os builds seguintes ficam bem mais rápidos quando você muda só o código.

Passo 2: construa a imagem

docker build -t meu-app:1.0 .
  • -t meu-app:1.0 dá o nome (tag) meu-app na versão 1.0;
  • o . indica que o Dockerfile está no diretório atual.

Passo 3: rode o container

docker run -p 3000:3000 meu-app:1.0

Sua aplicação está rodando em um container.

Passo 4: publique no Docker Hub (opcional)

docker login
docker tag meu-app:1.0 seu-usuario/meu-app:1.0
docker push seu-usuario/meu-app:1.0

Depois disso, qualquer pessoa (ou servidor) faz docker pull seu-usuario/meu-app:1.0 e roda a mesma imagem.

Docker Compose: vários containers de uma vez

Uma aplicação real costuma ter mais de uma peça: servidor web + banco de dados + cache. O Docker Compose descreve todos esses serviços em um único arquivo e sobe tudo junto com um comando.

Uma nota importante de versão: o comando atual é docker compose (com espaço), parte do plugin Compose v2 embutido no Docker. Ele substituiu o antigo binário docker-compose (com hífen), da v1. Se um tutorial mais velho usar docker-compose, é a mesma ideia — só o comando mudou.

Exemplo: Node + MySQL

Crie um arquivo docker-compose.yml:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      DATABASE_URL: mysql://root:senha123@db:3306/myapp

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: senha123
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Repare que o web alcança o banco pelo nome do serviço (db) na rede interna do Compose — não é preciso publicar a porta do MySQL no host. E o volume db_data garante que os dados do banco sobrevivam à remoção do container.

O campo version: que você vê em tutoriais antigos (version: '3.8') hoje é opcional e está obsoleto — o Compose v2 o ignora, pode remover sem medo.

Suba tudo com:

docker compose up

Pronto: web + MySQL de pé, conectados, com um comando. Os mais usados no dia a dia:

  • docker compose up -d — sobe tudo em segundo plano;
  • docker compose down — para e remove os containers;
  • docker compose logs -f — acompanha os logs;
  • docker compose exec web bash — abre um shell dentro do serviço web.

Na prática, o maior ganho aparece no onboarding: alguém novo clona o repositório, roda docker compose up e tem o ambiente inteiro idêntico ao do time em minutos — sem passar uma tarde configurando dependência na mão.

Comandos Docker essenciais

ComandoO que faz
docker pull nginxBaixa a imagem do nginx do Docker Hub
docker run -p 80:80 nginxCria e inicia um container nginx mapeando a porta 80
docker psLista os containers em execução
docker ps -aLista todos os containers (incluindo os parados)
docker stop [id]Para um container
docker rm [id]Remove um container parado
docker imagesLista as imagens locais
docker build -t meu-app .Constrói uma imagem a partir do Dockerfile no diretório atual
docker exec -it [id] bashAbre um terminal interativo dentro de um container
docker logs [id]Exibe os logs de um container

Próximos passos

Depois do básico, o caminho natural é:

  • Praticar: rode alguns containers prontos (hello-world, node, python, mysql) e escreva um Dockerfile para um projeto seu.
  • Orquestrar localmente: monte uma stack multi-container com o Docker Compose e conecte app + banco.
  • Ir para escala: quando precisar de muitos containers em produção, com alta disponibilidade, estude o Kubernetes. Para gerenciar containers por uma interface gráfica, vale conhecer o Portainer.

Conclusão

Docker deixou de ser um "bom ter" e virou habilidade de base para quem desenvolve ou opera software. E a melhor notícia é que a entrada é fácil: em uma tarde você containeriza uma aplicação, roda localmente e publica a imagem. Se quiser o conceito antes da prática, comece por o que é Docker; para aprofundar, a documentação oficial do Docker é a referência mais completa.

Comece hoje: instale o Docker, rode docker run hello-world e escreva seu primeiro Dockerfile.

Perguntas frequentes sobre Docker

Qual a diferença entre Docker e máquina virtual?

A máquina virtual emula um hardware completo e roda um sistema operacional próprio, por isso pesa gigabytes e demora para iniciar. O container Docker compartilha o kernel do host, é medido em megabytes e sobe em segundos. Na prática eles se combinam: containers rodando dentro de VMs na nuvem.

Docker é gratuito?

O Docker Engine (a CLI e o runtime, open source) é gratuito para qualquer uso. O Docker Desktop é gratuito para uso pessoal, educação e pequenas empresas, e exige licença paga em empresas grandes. O Docker Hub tem plano gratuito com limite de downloads e planos pagos para uso intenso.

Docker funciona em Windows, Mac e Linux?

Sim. No Linux o Docker roda de forma nativa. No Windows e no Mac, o Docker Desktop executa uma máquina virtual Linux leve por baixo dos panos, então na prática você usa os mesmos comandos em qualquer sistema.

Como salvar dados no Docker?

Containers são efêmeros: ao serem removidos, não deixam rastros. Para persistir dados, use volumes. Um volume nomeado (docker run -v meus_dados:/app/data) é gerenciado pelo Docker e sobrevive à remoção do container. Bancos de dados em container sempre devem gravar em um volume.

Posso usar Docker em produção?

Sim. Para uma aplicação simples, o Docker sozinho já resolve. Para muitos containers com alta disponibilidade e escala, use um orquestrador como Kubernetes ou Docker Swarm por cima do Docker — ele continua sendo a base que empacota e executa cada container.