Gerador de comandos Docker e Podman

Comandos docker e podman do dia a dia: shell, logs, exec, run, build, compose.

Sobre esta ferramenta

Escolha o que você quer fazer, como abrir um shell em um contêiner, acompanhar os logs, executar um comando, copiar arquivos, inspecioná-lo, construir ou limpar imagens ou controlar o Docker Compose, e obtenha o comando docker ou podman exato com cada flag explicada. O gerador de run também transforma um contêiner em um arquivo Compose, e comandos run colados podem ser importados e editados.

Como usar

  1. Escolha Docker ou Podman; os comandos são iguais, exceto pelo nome do programa.
  2. Escolha uma tarefa à esquerda, como Abrir um shell, Ver logs ou Liberar espaço em disco.
  3. Preencha o nome do contêiner e as opções. O nome que você digitar é levado para as outras tarefas.
  4. Copie o comando e leia o que cada parte faz. Em Executar um novo contêiner, você também pode obter um arquivo Compose.

Perguntas

Como abro um shell dentro de um contêiner em execução?
Execute docker exec -it CONTAINER sh. Use bash em vez de sh se a imagem tiver; imagens slim e Alpine geralmente só têm sh. Digite exit para sair sem parar o contêiner.
Como acompanho os logs de um contêiner?
docker logs -f --tail 100 CONTAINER mostra as últimas 100 linhas e continua transmitindo. Adicione --since 10m para ver só as linhas recentes, e passe por grep -i --line-buffered error para filtrar conforme as linhas chegam.
Como transformo um comando docker run em docker compose?
Cole o comando na caixa de importação e mude o resultado para Arquivo Compose. Portas, volumes, variáveis de ambiente, política de reinício, rede e limites de recursos são levados junto.
O que significa -p 8080:80?
O número da esquerda é a porta na sua máquina e o da direita é a porta dentro do contêiner. Coloque 127.0.0.1: na frente para que a porta só possa ser acessada a partir do seu próprio computador.
Qual é a diferença entre um volume nomeado e um bind mount?
Um bind mount como ./data:/data mapeia uma pasta da sua máquina. Um volume nomeado como pgdata:/var/lib/postgresql/data é um armazenamento gerenciado pelo Docker, que sobrevive ao contêiner e é a escolha usual para bancos de dados.
Os comandos do Docker e do Podman são iguais?
Quase: o podman run aceita as mesmas flags. As principais diferenças são os padrões rootless, então portas do host abaixo de 1024 precisam de configuração extra, e sistemas com SELinux muitas vezes precisam de :Z nos bind mounts.
Devo colocar senhas em flags -e?
Elas vão parar no histórico do shell e no docker inspect. Para qualquer coisa além de testes locais, use um --env-file mantido fora do controle de versão ou o recurso de segredos da sua plataforma.
Como descobrir o endereço IP de um contêiner?
Escolha Inspecionar um contêiner e selecione Endereço IP: a ferramenta escreve o template do docker inspect --format para você. Mas raramente você precisa do IP. Contêineres na mesma rede definida pelo usuário ou no mesmo projeto Compose se encontram pelo nome, como db:5432, e o IP pode mudar toda vez que um contêiner é recriado.
Dá para copiar arquivos de um contêiner parado?
Sim. docker cp CONTAINER:/var/log/app.log ./ funciona com o contêiner rodando ou parado, o que é útil para pegar logs ou crash dumps depois de uma falha. Ele também copia pastas inteiras. Use Copiar arquivos para dentro ou para fora para obter o comando em qualquer direção.
Qual é a diferença entre docker stop e docker kill?
O docker stop envia SIGTERM, espera 10 segundos (mude com -t) e então envia SIGKILL. O docker kill envia SIGKILL na hora, sem chance de limpeza. Se o stop sempre leva os 10 segundos inteiros, seu programa provavelmente ignora o SIGTERM, muitas vezes porque um shell roda como processo 1 e não repassa o sinal.

docker exec ou docker run

O docker run cria um novo contêiner a partir de uma imagem e o inicia. O docker exec roda um comando dentro de um contêiner que já está em execução. Um erro comum é usar docker run -it nginx bash para “entrar” em um servidor: isso inicia um contêiner novo ao lado do real, e tudo o que você mudar ali desaparece. Sem --rm, cada tentativa ainda deixa para trás um contêiner parado, que o docker ps -a vai mostrar.

O docker exec só funciona enquanto o contêiner está rodando, então não ajuda com um contêiner que cai ao iniciar. Leia antes o docker logs --tail 50 CONTAINER. Depois inicie a imagem com um shell em vez do programa normal: docker run -it --rm --entrypoint sh IMAGE. O formulário de docker run tem os campos Entrypoint e Comando em Mais opções para isso.

Como liberar o espaço em disco usado pelo Docker

Comece com docker system df, que mostra quanto espaço ocupam as imagens, os contêineres, os volumes locais e o cache de build. docker image prune remove só as imagens dangling, as sobras sem tag de rebuilds. docker image prune -a remove todas as imagens que nenhum contêiner usa, então você as baixa de novo na próxima vez. docker container prune apaga os contêineres parados, o que também libera suas camadas graváveis.

Cuidado com os volumes: eles guardam arquivos de banco de dados e uploads. docker volume prune apaga os volumes que nenhum contêiner usa, e no Docker 23 em diante remove só os volumes anônimos, a menos que você adicione -a. docker system prune -a --volumes limpa quase tudo o que não está em uso de uma vez. Os comandos prune pedem confirmação, a menos que você adicione -f, e nada vai para uma lixeira, então leia a pergunta antes de confirmar.

Políticas de restart do Docker: unless-stopped ou always

Com --restart always, o Docker reinicia o contêiner sempre que ele termina, e também quando o daemon do Docker inicia, mesmo que você tenha parado o contêiner à mão antes. unless-stopped se comporta igual, exceto que um contêiner que você mesmo parou continua parado depois de um reboot. on-failure só reinicia depois de um código de saída diferente de zero. O padrão, no, nunca reinicia. Para serviços de longa duração, unless-stopped costuma ser a escolha certa.

Em um arquivo Compose, a mesma configuração é restart: unless-stopped. O valor “no” precisa estar entre aspas, porque parsers de YAML mais antigos leem um no sem aspas como false, e a saída Compose daqui já coloca as aspas para você. O Podman é diferente: ele não tem um daemon sempre rodando, então contêineres com política de restart só voltam depois de um reboot se o serviço podman-restart estiver habilitado, ou se você os rodar com o systemd.

Algo não está funcionando ou um resultado parece errado? Relatar um problema com esta ferramenta