Dominando o Docker Run: Opções Essenciais de Comando Explicadas

Aprenda os flags do Docker run que você mais usa: portas, volumes, variáveis de ambiente, nomes, modo detached, políticas de reinicialização e limpeza.

Dominando o Docker Run: Opções Essenciais de Comando Explicadas

docker run cria um novo contêiner a partir de uma imagem e o inicia. O comando parece simples à primeira vista, mas as opções decidem como seu contêiner se conecta à rede, armazena dados, recebe configuração e se comporta após uma reinicialização.

Use este guia quando você souber a imagem que deseja executar, mas precisar dos flags certos para uma configuração prática.

Sintaxe Básica

docker run [OPÇÕES] IMAGEM [COMANDO] [ARG...]

IMAGEM é o nome da imagem, como nginx ou postgres:16. COMANDO e ARG... são opcionais e substituem ou estendem o comando padrão da imagem.

Para um teste rápido em primeiro plano:

docker run hello-world

Para serviços reais, você geralmente adiciona opções.

Executar em Segundo Plano com -d

Por padrão, o Docker anexa seu terminal à saída do contêiner. O modo detached executa o contêiner em segundo plano:

docker run -d nginx

O Docker imprime o ID do novo contêiner e retorna seu prompt. Verifique com:

docker ps

Leia os logs de um contêiner detached com:

docker logs <id_ou_nome_do_contêiner>

Publicar Portas com -p

Os contêineres têm seu próprio namespace de rede. Se um serviço escuta dentro do contêiner, publique a porta para alcançá-lo a partir do seu host:

docker run -d -p 8080:80 nginx

Isso mapeia a porta do host 8080 para a porta do contêiner 80, então http://localhost:8080 alcança o Nginx.

Você pode publicar mais de uma porta:

docker run -d -p 8080:80 -p 8443:443 nginx

Para vincular apenas ao localhost no host, inclua o IP do host:

docker run -d -p 127.0.0.1:8080:80 nginx

Isso é útil para ferramentas locais que você não deseja expor em todas as interfaces do host.

Persistir Dados com Volumes

As camadas graváveis do contêiner não são um bom lugar para dados duráveis. Use um bind mount quando quiser um caminho específico do host montado no contêiner:

docker run -d -p 8080:80 -v "$PWD/html:/usr/share/nginx/html:ro" nginx

Isso serve arquivos do seu diretório html local. O sufixo :ro torna a montagem somente leitura dentro do contêiner.

Use um volume nomeado quando o Docker deve gerenciar o local de armazenamento:

docker run -d --name postgres -v pgdata:/var/lib/postgresql/data postgres:16

Se pgdata não existir, o Docker o cria. Inspecione volumes com:

docker volume ls

Para novos trabalhos, a sintaxe --mount do Docker é mais detalhada, mas mais clara:

docker run -d --mount type=volume,src=pgdata,dst=/var/lib/postgresql/data postgres:16

Passar Configuração com -e e --env-file

Variáveis de ambiente são uma maneira comum de configurar aplicativos em contêineres:

docker run -d -e APP_ENV=production my-custom-app:latest

Use -e mais de uma vez para múltiplas variáveis:

docker run -d -e DB_HOST=database.example.com -e DB_USER=app my-app:latest

Para muitas variáveis, use um arquivo env:

docker run -d --env-file ./app.env my-app:latest

Mantenha segredos fora de arquivos .env commitados. Variáveis de ambiente são fáceis de inspecionar a partir do host e de processos com acesso suficiente, então use o gerenciador de segredos da sua plataforma para valores sensíveis de produção.

Nomear Contêineres com --name

O Docker pode gerar um nome, mas um nome claro torna comandos posteriores mais fáceis:

docker run -d --name web -p 8080:80 nginx

Então você pode usar:

docker logs web
docker stop web
docker exec -it web sh

Os nomes dos contêineres devem ser únicos. Se web já existir, remova ou renomeie o contêiner antigo antes de reutilizar o nome.

Usar Modo Interativo com -it

Para shells e sessões de solução de problemas, combine o modo interativo e um pseudo-TTY:

docker run -it ubuntu bash

Quando você sai do shell, o contêiner para. Adicione --rm para sessões descartáveis:

docker run --rm -it alpine sh

Escolher uma Política de Reinicialização

As políticas de reinicialização informam ao Docker o que fazer quando um contêiner sai:

docker run -d --name web --restart unless-stopped -p 8080:80 nginx

Políticas comuns são:

  • no: não reiniciar automaticamente. Este é o padrão.
  • on-failure[:max-retries]: reiniciar apenas após um código de saída diferente de zero.
  • always: reiniciar sempre que o contêiner parar, inclusive após reinicializações do daemon Docker.
  • unless-stopped: reiniciar a menos que você tenha parado explicitamente o contêiner.

Para serviços locais de longa execução, unless-stopped geralmente é uma escolha melhor do que always porque uma parada manual permanece respeitada.

Remover Contêineres Descartáveis com --rm

Contêineres parados permanecem no disco até que você os remova. Para comandos únicos, --rm limpa o contêiner após sua saída:

docker run --rm ubuntu echo "Olá de um contêiner temporário"

Não use --rm para contêineres cujo estado parado você precisa inspecionar posteriormente.

Exemplo Prático

Este comando executa um aplicativo web com um nome estável, uma porta publicada, um diretório de logs montado por bind, uma variável de ambiente e uma política de reinicialização:

docker run -d \
  --name my-app \
  --restart on-failure \
  -p 3000:80 \
  -v "$PWD/logs:/app/logs" \
  -e NODE_ENV=production \
  my-node-app:1.0

Após iniciar, verifique o contêiner e confira os logs:

docker ps
docker logs my-app

Conclusão

Comece com o menor comando docker run que funciona, depois adicione opções para o comportamento que você precisa: -d para serviços em segundo plano, -p para acesso, -v ou --mount para dados, -e para configuração, --name para operações, --restart para resiliência e --rm para execuções temporárias.