Docker para iniciantes: o que é um container e como usar no dia a dia
Docker é uma ferramenta que empacota uma aplicação junto com tudo o que ela precisa para rodar (runtime, bibliotecas, configurações) em uma unidade chamada container. O container roda igual no seu notebook, no computador do colega e no servidor, o que acaba com o clássico "na minha máquina funciona".
Para quem está começando, o ganho mais imediato é outro: subir um PostgreSQL, um Redis ou a própria API com um comando, sem instalar nada disso no sistema. Neste guia você vai entender imagem, container, Dockerfile e volumes, montar um exemplo com uma API e um banco de dados usando docker compose e conhecer os erros mais comuns.
Imagem e container: a diferença
- Imagem é o modelo, só leitura. Contém o sistema de arquivos e as instruções para iniciar a aplicação. Exemplos:
postgres:17,eclipse-temurin:21-jre,nginx. - Container é uma instância em execução de uma imagem. Da mesma imagem você pode criar vários containers, cada um isolado dos outros.
- Registry é onde as imagens ficam guardadas. O mais conhecido é o Docker Hub.
Uma comparação útil: a imagem é como a classe e o container é o objeto. Containers não são máquinas virtuais. Eles compartilham o kernel do sistema hospedeiro e por isso iniciam em segundos e consomem bem menos memória.
Instalação
No Windows e no macOS, instale o Docker Desktop. No Windows, ele usa o WSL 2 (Subsistema do Windows para Linux), e a virtualização precisa estar ativada na BIOS/UEFI; se o instalador reclamar disso, o ajuste é feito nas configurações do processador da placa-mãe. No Linux, instale o Docker Engine pelo repositório oficial da distribuição seguindo a documentação do Docker. Confira com:
docker --version
docker run hello-world
Containers consomem memória. Em um notebook com 8 GB, rodar banco, API, IDE e navegador ao mesmo tempo pode ficar apertado; o artigo quanta memória RAM eu preciso ajuda a dimensionar.
Primeiros comandos
Subir um PostgreSQL para estudo, sem instalar o banco no sistema:
docker run -d --name meu-postgres \
-e POSTGRES_PASSWORD=segredo \
-p 5432:5432 \
postgres:17
O -d roda em segundo plano, -e define uma variável de ambiente e -p 5432:5432 liga a porta do seu computador à porta do container (sempre no formato host:container). No PowerShell, troque as barras invertidas de quebra de linha por crases ou escreva tudo em uma linha.
| Comando | Para que serve |
|---|---|
docker ps | Lista containers em execução (-a mostra também os parados) |
docker logs -f meu-postgres | Mostra os logs e acompanha em tempo real |
docker exec -it meu-postgres psql -U postgres | Executa um comando dentro do container |
docker stop meu-postgres | Para o container |
docker rm meu-postgres | Remove o container parado |
docker images | Lista as imagens baixadas |
Com o banco no ar, você já pode praticar os comandos do artigo SQL básico.
Dockerfile: criando a imagem da sua aplicação
O Dockerfile é a receita da sua imagem. Para uma API Java já compilada em um arquivo .jar (como a do artigo sua primeira API com Spring Boot):
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/minha-api.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
FROM: imagem base, aqui só o runtime do Java 21.WORKDIR: pasta de trabalho dentro do container.COPY: copia o .jar gerado pelomvn packagepara dentro da imagem.EXPOSE: documenta a porta usada. Ele não publica a porta sozinho; quem faz isso é o-pou o compose.ENTRYPOINT: o comando que inicia a aplicação.
Para construir e rodar: docker build -t minha-api . e depois docker run -p 8080:8080 minha-api. Crie também um arquivo .dockerignore com pastas como .git e node_modules, para não enviar lixo ao build.
Volumes: onde os dados sobrevivem
Tudo o que é gravado dentro de um container some quando ele é removido. Para um banco de dados, isso seria um desastre. A solução são os volumes, áreas de armazenamento gerenciadas pelo Docker que ficam fora do ciclo de vida do container. Você remove e recria o container do banco, e os dados continuam lá.
Existe também o bind mount, que liga uma pasta do seu computador a uma pasta do container. É útil em desenvolvimento para editar arquivos e ver o resultado na hora.
docker compose: API e banco juntos
Quando o projeto tem mais de um serviço, digitar vários docker run fica inviável. O docker compose descreve tudo em um arquivo compose.yaml:
services:
db:
image: postgres:17
environment:
POSTGRES_DB: loja
POSTGRES_USER: loja
POSTGRES_PASSWORD: segredo
volumes:
- dados-pg:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U loja -d loja"]
interval: 5s
timeout: 5s
retries: 10
api:
build: .
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/loja
SPRING_DATASOURCE_USERNAME: loja
SPRING_DATASOURCE_PASSWORD: segredo
depends_on:
db:
condition: service_healthy
volumes:
dados-pg:
Pontos importantes desse arquivo:
- Dentro da rede do compose, a API acessa o banco pelo nome do serviço,
db, e não porlocalhost. - O
healthcheckcomcondition: service_healthyfaz a API esperar o banco estar pronto para aceitar conexões, e não apenas iniciado. - O volume nomeado
dados-pgguarda os dados do PostgreSQL entre reinícios.
Os comandos do dia a dia são docker compose up -d --build para subir (reconstruindo a imagem da API), docker compose logs -f api para ver os logs e docker compose down para parar e remover os containers. Cuidado com docker compose down -v: o -v apaga também os volumes, ou seja, os dados do banco.
Erros comuns de quem está começando
- Usar localhost entre containers. Dentro de um container, localhost é o próprio container. Use o nome do serviço.
- Porta já em uso. Se você tem um PostgreSQL instalado no sistema, a porta 5432 já está ocupada. Mude o lado do host, por exemplo
"5433:5432". - Esquecer o volume do banco e perder os dados ao recriar o container.
- Usar a tag latest em tudo. Uma atualização da imagem pode quebrar o projeto sem aviso. Fixe versões, como
postgres:17. - Colocar senhas no Dockerfile ou no repositório. Em projetos reais, use variáveis de ambiente ou um arquivo
.envlistado no.gitignore, como explicado em Git e GitHub para iniciantes. - Disco cheio. Imagens e containers antigos se acumulam. O comando
docker system pruneremove o que não está em uso; leia a confirmação antes de aceitar.
Docker também é uma boa porta de entrada para entender servidores. Se for rodar containers em uma VPS, os cuidados de manutenção preventiva de servidores Linux continuam valendo.
Sites e sistemas sob medida
Ambientes reproduzíveis com Docker fazem parte de como a PruPru desenvolve e entrega sistemas para clientes. Se a sua empresa precisa de uma aplicação web bem construída, conheça os serviços.
Ver serviços →Perguntas frequentes
Docker é a mesma coisa que máquina virtual?
Não. Uma máquina virtual roda um sistema operacional completo com kernel próprio. O container compartilha o kernel do hospedeiro e isola apenas processos, arquivos e rede, por isso é mais leve e inicia mais rápido.
Docker Desktop é gratuito?
É gratuito para uso pessoal, educacional, projetos open source e pequenas empresas dentro dos limites de funcionários e faturamento definidos pela Docker. Empresas maiores precisam de assinatura. O Docker Engine no Linux é open source.
Preciso usar Docker para aprender programação?
Não é obrigatório no começo, mas aprender o básico cedo facilita muito a vida, porque você sobe bancos e serviços sem instalar nada e aprende uma ferramenta pedida em boa parte das vagas de backend.
Qual a diferença entre docker-compose e docker compose?
O docker-compose com hífen é a versão antiga, um programa separado. O docker compose com espaço é a versão atual, integrada à linha de comando do Docker. Use a versão com espaço.