Conteúdo

Tutorial de parâmetros do docker run: veja os resultados na prática

docker run é o comando mais usado do Docker e também o que tem mais parâmetros. O formato básico é:

docker run [opções] imagem[:tag] [comando] [argumentos do comando]

O conteúdo após o nome da imagem substitui o comando padrão da imagem (CMD):

$ docker run --rm alpine:3.23 cat /etc/alpine-release
3.23.6

--rm é um parâmetro do Docker; cat /etc/alpine-release é o comando executado dentro do contêiner e substitui o /bin/sh padrão do alpine.

Os parâmetros precisam vir antes do nome da imagem

Tudo o que vier depois do nome da imagem será tratado como um comando dentro do contêiner:

$ docker run alpine:3.23 --rm echo hi
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: exec: "--rm": executable file not found in $PATH

Run 'docker run --help' for more information

O Docker tenta executar no contêiner um programa chamado --rm e, claro, não o encontra (executable file not found). Ao ver esse tipo de erro, confira primeiro a posição dos parâmetros.

Modo de execução

ParâmetroDescrição
-d, --detachExecuta em segundo plano e retorna imediatamente após exibir o ID do contêiner
-i, --interactiveMantém a entrada padrão aberta
-t, --ttyAloca um terminal virtual
--rmRemove o contêiner automaticamente ao terminar
--nameDefine o nome do contêiner; caso contrário, um nome aleatório é gerado (por exemplo, dreamy_solomon)
docker run -it --rm ubuntu:26.04 bash      # entra interativamente e remove ao sair
docker run -d --name cache redis:8-alpine  # serviço em segundo plano

-it quase sempre é usado em conjunto para abrir um shell interativo. Com apenas -i, você pode enviar dados ao contêiner por um pipe:

$ echo "hello" | docker run -i --rm alpine:3.23 cat
hello

Portas: -p

O formato é -p porta-do-host:porta-do-contêiner. Veja a comparação prática destas três formas:

$ docker run -d --name p1 -p 8080:80 nginx:1.30
27b89a4fae92dfe05bf051e11700033c7b9bb71f8747acc986d2a535cc1baa00

$ docker run -d --name p2 -p 127.0.0.1:8081:80 nginx:1.30
3327f3c1df4fa1e03fa3a120e5d889859fc0cb53d0aaf269826c81b25f4411c2

$ docker run -d --name p3 -P nginx:1.30
57c9a309c4758786361738b7b9a4231f404cb9bbab28f38cad39b4b6e996d9e0

$ docker port p1
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080

$ docker port p2
80/tcp -> 127.0.0.1:8081

$ docker port p3
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
FormaResultado
-p 8080:80Vincula todas as interfaces de rede (0.0.0.0 e [::] do IPv6), permitindo conexões de outros computadores
-p 127.0.0.1:8081:80Vincula apenas o host local; só este computador pode se conectar
-PMapeia a porta EXPOSE da imagem para uma porta aleatória do host (neste caso, foi atribuída a 32768)

docker port nome-do-contêiner mostra o mapeamento efetivo. Para uma porta UDP, escreva -p 5353:53/udp.

Em um host na nuvem, -p 8080:80 permite conexões externas. Além disso, o Docker altera as regras do firewall, então as configurações do ufw talvez não consigam bloquear o acesso. Para serviços que não devem ficar expostos, como bancos de dados, vincule a porta a 127.0.0.1 ou simplesmente não use -p; use uma rede personalizada para conectar os contêineres entre si.

Dados: -v e --mount

-v caminho-no-host:caminho-no-contêiner monta uma pasta do host no contêiner (bind mount). Prepare uma pasta site com um arquivo index.html:

$ ls site
index.html

$ docker run -d --name site -p 8080:80 -v "$(pwd)/site:/usr/share/nginx/html:ro" nginx:1.30
e91f46b91ff8f0f64d59d6605bfddea0ee5bca809de86d81cbd5051815e65dd1

$ curl -s http://localhost:8080 | head -n 3
<!doctype html>
<html><head><meta charset="utf-8"><title>My site</title>
<style>body{font-family:system-ui,sans-serif;max-width:640px;margin:60px auto;padding:0 16px;color:#1f2937}h1{color:#1d63ed}</style></head>

Comando equivalente no Windows (selecione uma aba para alternar):

docker run -d --name site -p 8080:80 -v "$(pwd)/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d --name site -p 8080:80 -v "${PWD}/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d --name site -p 8080:80 -v "%cd%/site:/usr/share/nginx/html:ro" nginx:1.30
nginx exibe uma página montada por bind mount
nginx exibe o conteúdo de site/index.html no host

O :ro no final significa somente leitura. Se você tentar gravar nessa pasta dentro do contêiner, a operação será recusada:

$ docker exec site sh -c "echo test > /usr/share/nginx/html/x.txt"
sh: 1: cannot create /usr/share/nginx/html/x.txt: Read-only file system

Outra forma de montagem é usar um Volume gerenciado pelo Docker (-v nome:caminho-no-contêiner), adequado para guardar dados como os de um banco de dados:

docker run -d -v pgdata:/var/lib/postgresql postgres:18

--mount oferece uma forma mais longa, mas mais explícita. Para ver as diferenças e quando usar cada opção, consulte Volume e Bind Mount.

Variáveis de ambiente: -e e --env-file

$ docker run --rm -e GREETING=hello -e APP_ENV=dev alpine:3.23 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=18f035817c43
GREETING=hello
APP_ENV=dev
HOME=/root

-e NOME_DA_VARIÁVEL (sem informar um valor) usa o valor atual da variável de ambiente homônima no host:

$ APP_ENV=prod docker run --rm -e APP_ENV alpine:3.23 sh -c 'echo $APP_ENV'
prod

Se houver muitas variáveis, use --env-file arquivo. Consulte Variáveis de ambiente e arquivo .env para saber mais.

Rede

Contêineres na mesma rede personalizada podem se conectar uns aos outros pelo nome do contêiner:

$ docker network create mynet
2ecd542737519b0b8919061077814e007a72e2d07973f0840608b1b5454c678e

$ docker run -d --name myweb --network mynet nginx:1.30
9a6ca3dca3a003e28b9870f3eec436cf7023a6872e8ddd4cee971d29f845583b

$ docker run --rm --network mynet alpine:3.23 ping -c 2 myweb
PING myweb (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.094 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.064 ms

--- myweb ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.064/0.079/0.094 ms

$ docker run --rm alpine:3.23 ping -c 1 -W 2 myweb
ping: bad address 'myweb'
  • O primeiro contêiner executa o ping na rede mynet, e o DNS integrado do Docker resolve myweb para 172.19.0.2.
  • O segundo não usa --network e, na rede padrão, não encontra myweb (bad address).

Evite usar nomes de contêiner como web e app, que por acaso são palavras usadas como domínios de nível superior (TLD). Sem entrar na mesma rede, esses nomes podem ser resolvidos pelo DNS externo para endereços estranhos (como 127.0.53.53), o que dificulta ainda mais a depuração.

docker run --network host nginx:1.30     # Use the host network directly (Linux)
docker run --network none alpine:3.23    # No network at all

Veja Redes e comunicação entre contêineres.

Política de reinicialização

docker run -d --restart unless-stopped nginx:1.30

Os valores disponíveis são no, on-failure, always e unless-stopped. Veja o comportamento de cada um em Ciclo de vida do contêiner.

Limites de recursos

$ docker run -d --name limited --memory 64m --cpus 0.5 nginx:1.30
2e65ce89f346cb7d9d57f1e6ad529d63ad53d1d914b6d3178dc3344a1d3325f0

$ docker stats --no-stream limited
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O         PIDS
2e65ce89f346   limited   0.00%     3.922MiB / 64MiB    6.13%     736B / 126B   1.77MB / 8.19kB   2

MEM USAGE / LIMIT mostra 3.922MiB / 64MiB, indicando que o limite de memória está ativo. Quando ocioso, o nginx usa menos de 4 MB.

ParâmetroDescrição
--memory, -mLimite de memória, por exemplo 512m ou 2g; ao ultrapassá-lo, o processo é encerrado (OOM, código de saída 137)
--memory-swapLimite total de memória + swap
--cpusQuantidade de CPUs disponíveis, pode ser fracionária; 0.5 representa meia CPU
--pids-limitNúmero máximo de processos no contêiner

Para ver o que acontece quando o limite de memória é excedido, consulte o exemplo de OOM em Como ver logs e depurar.

Substituir os valores padrão da imagem

$ docker run --rm --entrypoint sh nginx:1.30 -c "nginx -v; whoami"
nginx version: nginx/1.30.5
root

$ docker run --rm -u 1000:1000 alpine:3.23 id
uid=1000 gid=1000 groups=1000

$ docker run --rm -w /tmp alpine:3.23 pwd
/tmp

$ docker run --rm -h myhost alpine:3.23 hostname
myhost
ParâmetroDescrição
--entrypointSubstitui ENTRYPOINT; costuma ser usado para inspecionar uma imagem que iniciaria um serviço diretamente
-u, --userExecuta como o usuário especificado (UID:GID)
-w, --workdirSubstitui o diretório de trabalho
-h, --hostnameNome do host do contêiner

Use -u para que os arquivos criados pelo contêiner pertençam a você, e não ao root:

docker run --rm -u "$(id -u):$(id -g)" -v "$(pwd):/work" -w /work node:24-alpine npm install

Sistema de arquivos somente leitura

$ docker run --rm --read-only alpine:3.23 touch /hello
touch: /hello: Read-only file system

--read-only torna somente leitura todo o sistema de arquivos do contêiner. Mesmo que o programa seja comprometido, ele não poderá modificar arquivos. Libere a escrita apenas onde for necessário, usando --tmpfs /tmp ou um Volume. Veja Práticas recomendadas de segurança.

Outros parâmetros úteis

ParâmetroDescrição
--initUsa um processo init pequeno como PID 1 para encaminhar sinais corretamente (docker stop não precisa esperar 10 segundos; veja Ciclo de vida do contêiner)
--platformEspecifica a plataforma, por exemplo linux/amd64
--add-hostAdiciona uma entrada ao arquivo hosts, por exemplo --add-host host.docker.internal:host-gateway
--labelAdiciona uma etiqueta para facilitar a filtragem
--pull alwaysBaixa novamente a imagem antes de cada execução
--log-opt max-size=10mLimita o tamanho do arquivo de log

Mais opções para consulta rápida

A tabela a seguir foi organizada com base em docker run --help (Docker 29) e reúne opções úteis que não são apresentadas em detalhes neste capítulo. Para ver a lista completa, execute docker run --help.

CategoriaOpçãoDescrição
Segurança--cap-add / --cap-dropAdiciona ou remove capabilities do Linux. Veja a aplicação prática em Boas práticas de segurança
Segurança--security-optOpções de segurança, como no-new-privileges e configurações do seccomp
Segurança--privilegedConcede todas as permissões ao contêiner e praticamente desativa o isolamento. Evite usar
Segurança--usernsNamespace de usuário utilizado
Verificação de integridade--health-cmdComando de verificação de integridade, por exemplo, --health-cmd "curl -f http://localhost/"
Verificação de integridade--health-interval / --health-timeout / --health-retriesIntervalo entre verificações, tempo limite e número de falhas consecutivas para considerar o contêiner unhealthy
Verificação de integridade--health-start-period / --health-start-intervalPeríodo de tolerância durante a inicialização e intervalo entre verificações
Verificação de integridade--no-healthcheckDesativa o HEALTHCHECK configurado na imagem
Rede--network-aliasAdiciona outro nome à rede. Veja docker network
Rede--ipDefine um IP fixo em uma rede personalizada
Rede--dns / --dns-searchPersonaliza os servidores DNS e os domínios de busca
Rede--exposeDeclara uma porta (sem mapeá-la para o host), com o mesmo efeito de EXPOSE no Dockerfile
Rede-P, --publish-allMapeia todas as portas declaradas para portas aleatórias do host
Parada--stop-signalSinal enviado por docker stop; o padrão é SIGTERM
Parada--stop-timeoutNúmero de segundos que docker stop aguarda; o padrão é 10
Recursos--cpuset-cpusUsa somente as CPUs especificadas, por exemplo, 0,1 ou 0-3
Recursos-c, --cpu-sharesPeso relativo de CPU (só tem efeito quando há disputa por recursos)
Recursos--memory-reservationLimite flexível de memória
Recursos--shm-sizeTamanho de /dev/shm; programas como PostgreSQL e navegadores muitas vezes precisam de um valor maior
Recursos--ulimitPor exemplo, --ulimit nofile=65535:65535 ajusta o limite de arquivos abertos
Recursos--oom-kill-disableDesativa o encerramento forçado quando a memória se esgota (deve ser usado com --memory)
Dispositivos--deviceDisponibiliza um dispositivo do host para o contêiner, por exemplo, /dev/ttyUSB0
Dispositivos--gpusUsa a GPU, por exemplo, --gpus all (requer o NVIDIA Container Toolkit)
Namespaces--pid host / --ipc / --utsCompartilha namespaces do host ou de outro contêiner. Veja como funciona em Funcionamento interno
Sistema--sysctlDefine parâmetros do kernel do contêiner, por exemplo, net.core.somaxconn=1024
Sistema--umaskUmask dos processos no contêiner
Montagem--volumes-fromMonta todos os Volumes de outro contêiner
Outros--cidfileGrava o ID do contêiner em um arquivo para facilitar o uso em scripts
Outros--label-fileLê labels de um arquivo
Outros--log-driverDriver de logs, por exemplo, json-file, local e syslog
Outros-q, --quietNão exibe o progresso ao baixar uma imagem
Outros--use-api-socketMonta o socket da API do Docker e as credenciais de login no contêiner (equivale a ter permissão de root no host; veja Boas práticas de segurança)

Exemplos de combinações comuns

# 1. Contêiner de ferramenta temporário: execute um comando na pasta atual
docker run --rm -v "$(pwd):/data" -w /data alpine:3.23 ls -la

# 2. Banco de dados para desenvolvimento local, acessível somente pelo host local
docker run -d --name devdb --restart unless-stopped \
  -p 127.0.0.1:5432:5432 \
  -e POSTGRES_PASSWORD=dev \
  -v devdb:/var/lib/postgresql \
  postgres:18

# 3. Serviço em produção com limites de recursos e tamanho dos logs
docker run -d --name api --restart unless-stopped \
  --memory 1g --cpus 2 \
  --log-opt max-size=10m --log-opt max-file=3 \
  --env-file .env -p 3000:3000 \
  myorg/api:1.4.2
# 1. Contêiner de ferramenta temporário: execute um comando na pasta atual
docker run --rm -v "${PWD}:/data" -w /data alpine:3.23 ls -la

# 2. Banco de dados para desenvolvimento local, acessível somente pelo host local
docker run -d --name devdb --restart unless-stopped `
  -p 127.0.0.1:5432:5432 `
  -e POSTGRES_PASSWORD=dev `
  -v devdb:/var/lib/postgresql `
  postgres:18

# 3. Serviço em produção com limites de recursos e tamanho dos logs
docker run -d --name api --restart unless-stopped `
  --memory 1g --cpus 2 `
  --log-opt max-size=10m --log-opt max-file=3 `
  --env-file .env -p 3000:3000 `
  myorg/api:1.4.2
# 1. Contêiner de ferramenta temporário: execute um comando na pasta atual
docker run --rm -v "%cd%:/data" -w /data alpine:3.23 ls -la

# 2. Banco de dados para desenvolvimento local, acessível somente pelo host local
docker run -d --name devdb --restart unless-stopped ^
  -p 127.0.0.1:5432:5432 ^
  -e POSTGRES_PASSWORD=dev ^
  -v devdb:/var/lib/postgresql ^
  postgres:18

# 3. Serviço em produção com limites de recursos e tamanho dos logs
docker run -d --name api --restart unless-stopped ^
  --memory 1g --cpus 2 ^
  --log-opt max-size=10m --log-opt max-file=3 ^
  --env-file .env -p 3000:3000 ^
  myorg/api:1.4.2

Quando há muitas opções, fica difícil manter o comando. Para executar algo por bastante tempo ou operar vários contêineres juntos, recomendamos usar Docker Compose e registrar as configurações em um arquivo.

Resumo

  • Escreva as opções antes do nome da imagem. O que vier depois é o comando a ser executado dentro do contêiner.
  • -d, --rm, --name, -p, -v e -e são as opções mais usadas em conjunto.
  • --memory, --cpus e --pids-limit limitam os recursos.
  • --entrypoint, -u e -w substituem os valores padrão da imagem.

Exercícios

Exercício 1: Escreva um comando que execute nginx:1.30-alpine em segundo plano, com o nome site, permita conexões à porta 8080 somente pelo host local, limite a memória a 128 MB e não mantenha o contêiner depois que ele terminar.

Resposta
docker run -d --rm --name site -p 127.0.0.1:8080:80 --memory 128m nginx:1.30-alpine

--rm remove automaticamente o contêiner quando ele é encerrado.

Exercício 2: O ENTRYPOINT da imagem postgres:18 inicia o banco de dados. Como você pode acessar somente o shell, sem iniciar o banco de dados?

Resposta
docker run --rm -it --entrypoint sh postgres:18

--entrypoint substitui o ENTRYPOINT da imagem.

Perguntas frequentes

Por que os parâmetros não funcionam quando são escritos depois do nome da imagem?

O conteúdo após o nome da imagem é tratado como o comando a ser executado dentro do contêiner. Os parâmetros do docker run precisam ser escritos antes do nome da imagem.

Qual é a diferença entre -p 8080:80 e -p 127.0.0.1:8080:80?

O primeiro vincula todas as interfaces de rede, então outros computadores também podem se conectar; o segundo vincula apenas o host local. Para serviços que não precisam ficar expostos, como bancos de dados, use o segundo ou não adicione -p.

Quantos parâmetros o docker run tem?

O docker run --help do Docker 29 lista cerca de 100 parâmetros. Este capítulo apresenta os mais usados, e a seção final, “Consulta de outros parâmetros”, reúne outros parâmetros úteis.

Atualizado 14 de outubro de 2026