Dominando o Docker Run: Opções Essenciais de Comando Explicadas
O comando docker run do Docker é a pedra angular para criar e iniciar contêineres a partir de suas imagens Docker. Embora um simples docker run <image_name> possa ser um bom começo, desbloquear todo o potencial dos contêineres exige a compreensão de suas inúmeras opções. Este artigo aprofunda as flags mais essenciais do docker run, capacitando você a gerenciar redes, configurar variáveis de ambiente, persistir dados com volumes e controlar a execução de contêineres com o modo desanexado.
A compreensão dessas opções é crucial para uma conteinerização eficiente, permitindo que você construa aplicativos robustos, flexíveis e gerenciáveis. Seja executando um servidor web, um banco de dados ou um microsserviço complexo, dominar o docker run aprimorará significativamente seu fluxo de trabalho Docker.
O Básico do docker run
A sintaxe fundamental para o comando docker run é:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]: São as flags que modificam o comportamento do contêiner.IMAGE: O nome da imagem Docker para criar o contêiner (por exemplo,ubuntu,nginx:latest).[COMMAND]: Um comando opcional a ser executado dentro do contêiner, sobrescrevendo o comando padrão da imagem.[ARG...]: Argumentos para o comando.
Vamos explorar algumas das opções mais impactantes.
Principais Opções do docker run Explicadas
Modo Desanexado (-d ou --detach)
Por padrão, docker run inicia um contêiner em primeiro plano, anexando seu terminal às suas entradas, saídas e fluxos de erro padrão. Isso significa que seu terminal fica ocupado até que o contêiner pare. O modo desanexado (-d) permite que o contêiner seja executado em segundo plano, liberando seu terminal.
Exemplo:
docker run -d nginx
Este comando inicia um contêiner de servidor web Nginx em segundo plano. Você verá um ID de contêiner longo impresso em seu terminal, e seu prompt retornará imediatamente.
Dica: Para ver os logs de um contêiner desanexado, use docker logs <container_id_or_name>.
Mapeamento de Portas (-p ou --publish)
Contêineres são ambientes de rede isolados. Para expor o serviço de um contêiner à máquina host ou a outras máquinas na rede, você precisa mapear portas. A flag -p permite que você publique uma porta de contêiner para uma porta específica no host.
O formato é -p <host_port>:<container_port>.
Exemplo:
Executando um contêiner Nginx e mapeando a porta 80 dentro do contêiner para a porta 8080 no host:
docker run -d -p 8080:80 nginx
Agora, você pode acessar o servidor Nginx navegando para http://localhost:8080 em seu navegador web.
Múltiplos Mapeamentos de Portas: Você pode mapear várias portas usando a flag -p várias vezes:
docker run -d -p 8080:80 -p 4430:443 nginx
Especificando Endereço IP: Você também pode especificar a qual endereço IP no host se ligar:
docker run -d -p 127.0.0.1:8080:80 nginx
Isso liga a porta 8080 no host apenas à interface de loopback (localhost).
Montagem de Volumes (-v ou --volume)
Os sistemas de arquivos dos contêineres são efêmeros por padrão. Quando um contêiner é removido, quaisquer dados criados ou modificados dentro dele são perdidos. Volumes fornecem um mecanismo para persistir dados fora do ciclo de vida do contêiner. Você pode montar um diretório da sua máquina host no contêiner ou usar volumes gerenciados pelo Docker.
O formato básico é -v <host_path>:<container_path>.
Exemplo:
Montando um diretório local ~/my-nginx-html para o diretório HTML padrão do Nginx (/usr/share/nginx/html) dentro do contêiner:
docker run -d -p 8080:80 -v ~/my-nginx-html:/usr/share/nginx/html nginx
Quaisquer arquivos HTML que você coloque em ~/my-nginx-html em seu host serão servidos pelo Nginx. As alterações nesses arquivos serão refletidas imediatamente dentro do contêiner.
Volumes Nomeados: Volumes nomeados gerenciados pelo Docker são frequentemente preferidos para melhor portabilidade e gerenciamento:
docker run -d -p 8080:80 -v my-nginx-data:/usr/share/nginx/html nginx
Se my-nginx-data não existir, o Docker o criará. Você pode gerenciar esses volumes usando docker volume ls, docker volume create e docker volume rm.
Variáveis de Ambiente (-e ou --env)
Variáveis de ambiente são pares chave-valor que podem ser usados para configurar aplicativos em execução dentro de contêineres. A flag -e permite que você defina essas variáveis.
Exemplo:
Definindo uma variável de configuração personalizada para um aplicativo:
docker run -d -e APP_ENV=production my-custom-app:latest
Definindo Múltiplas Variáveis: Use -e múltiplas vezes:
docker run -d -e DB_HOST=database.example.com -e DB_USER=admin my-app:latest
Usando arquivos .env: Para gerenciar muitas variáveis, você pode usar a flag --env-file:
docker run -d --env-file ./app.env my-app:latest
Onde app.env pode conter:
DB_HOST=database.example.com
DB_USER=admin
Dica: Tenha cuidado ao commitar informações sensíveis (como senhas) diretamente em variáveis de ambiente ou arquivos .env que são verificados no controle de versão.
Nomeando Contêineres (--name)
Quando você executa um contêiner, o Docker atribui a ele um nome hexadecimal aleatório, muitas vezes longo. Atribuir um nome personalizado e legível por humanos usando a flag --name torna muito mais fácil referenciar o contêiner posteriormente para comandos como docker stop, docker logs ou docker exec.
Exemplo:
docker run -d --name my-webserver -p 8080:80 nginx
Agora você pode se referir a este contêiner como my-webserver em vez de seu ID.
Aviso: Os nomes dos contêineres devem ser únicos. Se um contêiner com esse nome já existir, docker run falhará.
Modo Interativo e TTY (-i, -t ou -it)
Para executar comandos que exigem interação do usuário ou um pseudo-terminal (como um shell), você usará as flags -i (interativo) e -t (alocar um pseudo-TTY). Frequentemente, elas são combinadas como -it.
Exemplo:
Executando um shell bash interativo dentro de um contêiner Ubuntu:
docker run -it ubuntu bash
Este comando inicia um contêiner Ubuntu, executa bash e anexa seu terminal a ele, permitindo que você digite comandos como se estivesse logado em um sistema Linux. Quando você sair do shell (exit), o contêiner parará.
Políticas de Reinicialização (--restart)
As políticas de reinicialização definem se um contêiner deve ser reiniciado automaticamente se parar, e sob quais condições.
no: Não reinicie o contêiner automaticamente (padrão).on-failure[:max_retries]: Reinicie apenas se o contêiner sair com um código de saída diferente de zero. Opcionalmente, você pode especificar um número máximo de tentativas.always: Sempre reinicie o contêiner se ele parar, independentemente do status de saída.unless-stopped: Sempre reinicie o contêiner, a menos que tenha sido explicitamente parado pelo usuário ou pelo daemon do Docker.
Exemplo:
Para garantir que seu servidor web reinicie automaticamente se ele travar:
docker run -d --name my-resilient-webserver --restart always -p 8080:80 nginx
Removendo o Contêiner ao Sair (--rm)
Para contêineres temporários, especialmente durante testes ou desenvolvimento, você geralmente deseja que o contêiner seja removido automaticamente assim que ele sair. A flag --rm lida com isso.
Exemplo:
Executando um comando em um contêiner temporário e fazendo com que ele seja removido depois:
docker run --rm ubuntu echo "Hello from a temporary container"
Depois que o comando echo terminar e o contêiner sair, ele será automaticamente removido. Isso ajuda a manter seu sistema limpo de contêineres antigos e parados.
Juntando Tudo: Um Exemplo Prático
Vamos combinar várias opções para executar um aplicativo web personalizado:
- Executar em modo desanexado (
-d). - Atribuir um nome (
--name my-app). - Mapear a porta do host 3000 para a porta do contêiner 80 (
-p 3000:80). - Montar um diretório local para logs (
-v $(pwd)/logs:/app/logs). - Definir uma variável de ambiente (
-e NODE_ENV=production). - Garantir que ele reinicie se falhar (
--restart on-failure). - Usar uma imagem específica (
my-node-app:1.0).
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
Este comando implanta efetivamente seu aplicativo, tornando-o acessível, permitindo a persistência de logs e garantindo um certo nível de resiliência.
Conclusão
O comando docker run é muito mais versátil do que seu uso básico sugere. Ao alavancar opções como -d, -p, -v, -e, --name e --rm, você obtém controle granular sobre seus aplicativos conteinerizados. Dominar essas flags essenciais é um passo fundamental para construir e gerenciar ambientes conteinerizados sofisticados de forma eficiente e confiável. Continue experimentando essas opções para integrá-las totalmente em seus fluxos de trabalho Docker.