Docker é uma plataforma de virtualização leve que empacota aplicações e suas dependências em unidades isoladas chamadas contêineres — garantindo portabilidade, consistência e eficiência entre ambientes de desenvolvimento, teste e produção.
- Operações com Imagens
1.1 Listagem de Imagens
Para visualizar as imagens disponíveis localmente:
docker image ls
Equivalente a docker images. Para obter apenas os IDs das imagens:
docker image ls -q
E para incluir imagens intermediárias (não utilizadas diretamente):
docker image ls -a
1.2 Busca por Imagens no Registro Público
Localize imagens oficiais ou de terceiros com filtros específicos:
docker search --filter is-official=true --filter stars=50 nginx
O parâmetro --no-trunc exibe descrições completas, enquanto --filter permite filtrar por oficialidade, número de estrelas ou outras propriedades.
1.3 Download de Imagens
Baixe uma imagem específica (exemplo com versão explícita):
docker pull redis:7.2-alpine
A tag latest é assumida se não for especificada. O comando docker image pull é sinônimo funcional.
1.4 Remoção de Imagens
Exclua imagens pelo nome ou ID:
docker rmi redis:7.2-alpine
Para remover todas as imagens não referenciadas por contêineres ativos ou parados:
docker image prune -a
- Gerenciamento de Contêineres
2.1 Criação e Execução
Inicie um contêiner interativo com terminal:
docker run --name dev-env -it ubuntu:22.04 /bin/bash
Para execução em segundo plano com mapeamento de portas:
docker run -d --name web-server -p 8080:80 nginx
Flags úteis:
-d: modo desanexado (background)--rm: remove automaticamente ao encerrar--network host: usa rede do hospedeiro
2.2 Visualização de Contêineres
Liste apenas contêineres em execução:
docker ps
Para incluir contêineres parados:
docker ps -a
Obtenha apenas os IDs dos últimos três contêineres criados:
docker ps -n=3 -q
2.3 Encerramento e Reinício
Interrompa suavemente um contêiner em execução:
docker stop web-server
Reinicie-o posteriormente:
docker start web-server
Para reinício imediato:
docker restart web-server
2.4 Exclusão de Contêineres
Remova contêineres parados:
docker rm dev-env
Force a remoção mesmo se estiver ativo:
docker rm -f web-server
Limpe todos os contêineres parados de uma vez:
docker container prune
- Comandos Avançados
3.1 Acesso Interativo a Contêineres em Execução
Abra um novo shell dentro de um contêiner ativo sem interromper seu processo principle:
docker exec -it web-server /bin/sh
Compare com docker attach, que se conecta à sessão principal — útil para depuração, mas menos flexível.
3.2 Monitoramento e Diagnóstico
Visualize logs em tempo real com carimbo de data/hora:
docker logs -t -f --tail 50 web-server
Verifique processos em execução dentro do contêiner:
docker top web-server
Inspeccione metadados detalhados (rede, volumes, estado):
docker inspect web-server
3.3 Transferência de Arquivos
Copie arquivos entre o host e o contêiner:
# Do contêiner para o host
docker cp web-server:/var/log/nginx/access.log ./nginx-access.log
# Do host para o contêiner
docker cp ./config.conf web-server:/etc/nginx/conf.d/default.conf
- Persistência de Dados com Volumes
4.1 Montagem de Diretórios
Use -v para vincular diretórios locais a caminhos dentro do contêiner:
docker run -d -v $(pwd)/data:/app/data -p 3000:3000 my-app
Essa abordagem garante que dados sobrevivam à exclusão do contêiner.
4.2 Volumes Nomeados
Crie volumes gerenciados pelo Docker para maior portabilidade:
docker volume create app-data
Monte-o em contêineres:
docker run -v app-data:/app/storage my-app
Consulte detalhes com docker volume inspect app-data.
4.3 Compartilhamento entre Contêineres
Contêineres podem compartilhar volumes usando --volumes-from:
docker run -d --name db -v /var/lib/mysql mysql:8.0
docker run -d --volumes-from db --name backup alpine tar -cf /backup/db.tar /var/lib/mysql
- Construção Personalizada com Dockerfile
5.1 Estrutura Básica
Um Dockerfile define camadas sequenciais de construção:
FROM golang:1.22-alpine
LABEL maintainer="dev-team@example.com"
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /app .
EXPOSE 8080
CMD ["/app"]
5.2 Construção e Etiquetagem
Gere uma imagem personalizada:
docker build -t api-service:v1.2 .
Publique-a em um repositório remoto:
docker tag api-service:v1.2 registry.example.com/api-service:v1.2
docker push registry.example.com/api-service:v1.2
5.3 CMD vs ENTRYPOINT
CMD define o comando padrão, substituível na linha de comando do docker run. Já ENTRYPOINT fixa o executável principal, permitindo argumentos adicionais:
ENTRYPOINT ["./entrypoint.sh"]
CMD ["--verbose"]
Executando docker run my-image --debug resulta em ./entrypoint.sh --debug.
- Casos Reais de Uso
6.1 Servidor Web com Nginx Personalizado
Substitua a página inicial padrão via volume:
docker run -d \
-p 8080:80 \
-v $(pwd)/custom-html:/usr/share/nginx/html:ro \
--name custom-nginx \
nginx:alpine
6.2 Banco de Dados com Persistência
Configure MySQL com configuração externa e dados duráveis:
docker run -d \
--name mysql-prod \
-e MYSQL_ROOT_PASSWORD=secure123 \
-v ./mysql-conf:/etc/mysql/conf.d \
-v ./mysql-data:/var/lib/mysql \
-p 3307:3306 \
mysql:8.0
6.3 Ambiente de Desenvolvimento C++
Construa um contêiner com ferramentas essenciais:
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y build-essential cmake libboost-all-dev gdb && \
rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
VOLUME ["/workspace"]
CMD ["/bin/bash"]
Execute com montagem de projeto local:
docker run -it -v $(pwd):/workspace cpp-dev-env