Programa
Se estiver se perguntando como executar uma imagem do Docker, você não está sozinho. Não importa se você acabou de obter uma imagem do Docker Hub ou criou uma você mesmo, executá-la é a etapa principal que dá vida ao seu aplicativo.
Este tutorial é um guia para você que está começando a usar o comando docker run
e muito mais. Você aprenderá:
- O que são realmente as imagens e os contêineres do Docker.
- Como executar uma imagem usando diferentes opções.
- E como parar, remover e solucionar problemas de contêineres como um profissional.
Ao final, você estará confiante para lançar seus próprios contêineres e entender exatamente o que está acontecendo sob o capô.
Entendendo as imagens e os contêineres do Docker
Antes de entrar nos exemplos de comandos, vamos entender as imagens e os contêineres do Docker em termos simples.
Se você já estiver familiarizado com esses termos, fique à vontade para pular para a próxima seção!
O que é uma imagem do Docker?
Uma imagem do Docker é um projeto imutável para seu aplicativo. Ele define tudo o que o seu contêiner precisa: o código, as bibliotecas, o ambiente e as configurações. Depois de ter uma imagem, você pode usá-la para ativar um ou cem contêineres. Ele permanece consistente todas as vezes.
Então, de onde vêm as imagens? O Dockerfile os constrói. Um Dockerfile é onde você define qual imagem de base usar, quais dependências instalar e como seu aplicativo deve ser executado.
Quando seu Dockerfile estiver pronto, você executará o comando docker build
. Esse comando segue as etapas do arquivo e as transforma em uma imagem reutilizável.
O que é um contêiner do Docker?
Um contêiner do Docker é a versão ativa de uma imagem do Docker. Ele permite que seu aplicativo seja executado em seu próprio ambiente isolado, garantindo um comportamento consistente, independentemente do sistema host.
Ele segue a abordagem "construir uma vez, executar em qualquer lugar", para que você não precise configurar manualmente o ambiente todas as vezes.
Imagem versus contêiner
A tabela a seguir compara uma imagem e um contêiner lado a lado:
Imagem |
Contêineres |
Uma imagem é um pacote padronizado que inclui todos os arquivos, binários, bibliotecas e configurações para executar um contêiner. |
Uma instância de tempo de execução de uma imagem. |
Uma imagem é imutável. Isso significa que ele não pode mudar até que seja reconstruído. |
O contêiner é mutável. Você pode modificá-lo enquanto estiver em execução, instalar novos pacotes ou alterar arquivos de configuração. |
Um Dockerfile (um conjunto de instruções para criar uma imagem) cria uma imagem. |
Uma imagem cria um contêiner. |
Seu computador armazena arquivos de imagem. |
Um contêiner é executado na sua memória. |
Se você não tem experiência com a conteinerização, nosso curso Introdução ao Docker o orientará nos conceitos básicos com exemplos práticos.
O comando docker run
Quando você executa o comando docker run
, está dizendo ao Docker para criar um novo contêiner com base em uma imagem.
Em termos simples, você está iniciando um programa dentro de um ambiente isolado. Esse programa pode ser qualquer coisa, um simples aplicativo da Web ou um serviço completo com vários processos.
Sintaxe básica
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]
- Sinalizadores extras para personalizar a execução do contêinerIMAGE
- O nome da imagem do Docker[COMMAND]
- (Opcional) Substitui o comando padrão na imagem.[ARG...]
- (Opcional) Argumentos.
Sinalizadores e opções comuns
-d
: Modo separado: executa contêineres em segundo plano-p
: Mapeamento de portas: Para acessar um serviço (como uma API ou um aplicativo da Web) a partir do navegador, você precisa expor uma porta. Exemplo:-p 3000:3000
mapeia a porta 3000 da sua máquina para a porta 3000 do contêiner.--name
: O Docker dá ao contêiner um nome padrão, mas você pode usar esse sinalizador para dar a ele um novo nome.-v
: Você usa isso para manter todos os dados separados do próprio contêiner, garantindo que eles permaneçam mesmo que o contêiner seja interrompido ou excluído.--rm
: Quando o contêiner para, esse sinalizador o exclui automaticamente.-e
: Use-o para passar senhas de banco de dados ou chaves de API sem codificá-las em seu aplicativo.
Execução de contêineres interativos versus contêineres desanexados
O Docker executa contêineres de duas maneiras: modo interativo (-it
) e modo de desconexão (-d
). Cada modo tem casos de uso específicos, dependendo de seus objetivos.
-it
: Modo interativo: Se quiser trabalhar diretamente dentro de um contêiner usando o terminal, você pode usar o sinalizador-it
. Ele coloca o contêiner no modo interativo, para que você possa digitar comandos, ver a saída e trabalhar em tempo real.-i
: Mantém a entrada aberta para que você possa digitar comandos no contêiner-t
: Oferece a você uma interface semelhante a um terminal dentro do contêiner-d
: Modo independente: Ele executa o contêiner em segundo plano, de modo que seu terminal fica livre para outras tarefas.
Mantenha os principais comandos e práticas recomendadas na ponta dos dedos com a nossa folha de dicas do Docker para ciência de dados.
Extração e execução de imagens do Docker
Agora que você conhece a sintaxe do comando docker run
, esta seção mostrará como criar imagens personalizadas e executá-las.
Usando imagens do Docker Hub
O Docker Hub é como uma biblioteca on-line para imagens de contêineres. Você pode pegar os pré-construídos ou carregar os seus para compartilhar com outras pessoas. Ele oferece suporte a repositórios públicos e privados, para que você possa compartilhar imagens abertamente com a comunidade ou implementar controles de acesso para suas equipes internas.
Execução de imagens personalizadas
Para executar uma imagem do Docker, primeiro você precisa criá-la usando um Dockerfile. Em seguida, você pode executá-lo localmente ou enviá-lo para o Docker Hub para compartilhar.
Então, primeiro vamos criar um Dockerfile. Aqui está um exemplo:
# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]
O que significa o Dockerfile acima?
FROM python:3.11-slim
Se você não tiver uma imagem de base com a versão 3.11 do Python, poderá usar a imagem de base com a versão 3.11.WORKDIR /app
: Define/app
como o diretório de trabalho dentro do contêiner.COPY requirements.txt .
Move todas as dependências da máquina local para o diretório de aplicativos do contêiner.RUN pip install --no-cache-dir -r requirements.txt
Instala as dependências no arquivo requirements.txt.COPY . .
Copia o código dos diretórios de trabalho atuais (aplicativos, arquivos de configuração e outros) para o diretório de aplicativos do contêiner.- CMD ["python", "app.py"]: executa o app.py quando você inicia um contêiner a partir dessa imagem.
Etapa 1. Criar Dockerfile
Vamos ver o que acontece quando você cria esse Dockerfile.
- Execute o seguinte comando:
docker build -t my-python-app .
Observação: Para que esse comando funcione, você deve primeiro ter o Docker configurado em seu sistema; este guia o ajuda a fazer isso.
Veja o que acontece nos bastidores quando você executa o comando de compilação:
- O Docker lê o Dockerfile
- A imagem base do Python é obtida do Docker Hub
- O diretório de trabalho é definido como
/app
. - O
requirements.txt
é copiado para o contêiner. - As dependências são instaladas usando
pip install
. - O restante do seu código é copiado em
/app
. - A imagem final é marcada como
my-python-app
.
Etapa 2: Executar o Dockerfile
Depois que a imagem for criada, você poderá executá-la usando:
docker run -p 5000:5000 my-python-app
Veja o que acontece quando você o executa:
- Um novo contêiner da sua imagem personalizada,
my-python-app
, é criado. - A porta 5000 no seu computador é mapeada para a porta 5000 no contêiner (
-p 5000:5000
). - O arquivo
CMD ["python", "
app.py"] é executado e executa o aplicativo. - O contêiner é executado em segundo plano devido à opção
-d
(modo desanexado).
Nesse momento, você pode acessar http://localhost:5000
no navegador e verá algo como o seguinte, o que significa que o aplicativo está em execução:
Se você trabalha com machine learning, estas imagens do Docker para ML e IA podemacelerar a configuração do seu ambiente.
Execução de imagens com configuração
Para alguns aplicativos, você pode precisar executar imagens com uma configuração específica. Aqui estão dois exemplos comuns.
Dados persistentes
Os contêineres armazenam dados temporariamente. Quando você os exclui, os dados desaparecem. Um volume é uma forma de armazenar dados fora do contêiner para que eles persistam mesmo que o contêiner seja removido ou reiniciado.
Para montar um volume, você precisa executar um comando como o seguinte:
docker run -v my-volume:/app/data my-image
Os dados gravados em /app/data
são salvos no volume mesmo depois que o contêiner é removido.
Passagem de variáveis de ambiente
As variáveis de ambiente passam as definições de configuração para um contêiner do Docker em tempo de execução. Isso personaliza seus contêineres do Docker sem modificar suas imagens do Docker.
Você tem duas maneiras de passar variáveis de ambiente:
- Você pode passar variáveis de ambiente usando o parâmetro
-e
. Aqui está um exemplo de comando:
docker run -e ENV=production -e DEBUG=False my-image
- Você pode criar um arquivo
.env
com todas as variáveis de ambiente e passá-lo para o comando. Aqui está um exemplo:
docker run --env-file .env my-image
Exemplo de arquivo .env
:
ENV=staging
DEBUG=True
SECRET_KEY=mysecret
Gerenciando contêineres em execução
Quando um contêiner estiver em execução, você poderá visualizá-lo, interrompê-lo e acessá-lo. Vamos ver como você pode fazer isso.
Visualização de contêineres ativos
Para listar todos os contêineres Docker ativos em execução no seu sistema, execute o comando docker ps
ou docker container ls
. Esse comando exibe o ID do contêiner, a imagem, o comando, a porta, o status e outros detalhes.
docker ps
# or
docker container ls
Para incluir todos os contêineres, não apenas os que estão em execução, como os que saíram ou foram criados, mas não iniciados, use o sinalizador -a
:
docker ps -a
Para visualizar apenas o contêiner criado mais recentemente, use o sinalizador -l
(last):
docker ps -l
Se você quiser ver todos os contêineres classificados por hora de criação, com o mais recente listado primeiro, execute:
docker ps -a --sort=created
Parar e remover contêineres
Para interromper um contêiner específico em execução, use o comando docker stop
seguido do ID ou nome do contêiner:
docker stop <container_id_or_name>
Para interromper todos os contêineres em execução, use:
docker stop $(docker ps -q)
$(docker ps -q)
retorna uma lista de todos os IDs de contêineres em execução.
Quando um contêiner é interrompido, você pode removê-lo usando:
docker rm <container_id_or_name>
Para remover todos os contêineres parados, execute:
docker container prune
Para ir além e remover contêineres, volumes, redes e imagens não utilizados, consulte o guia de poda do Docker.
Acesso a logs de contêineres e shell
- Registros do docker - O comando
docker logs
recupera em lote os registros presentes no momento da execução. - docker exec -
docker exec
permite que você execute um novo comando dentro de um contêiner em execução existente sem interrompê-lo ou reiniciá-lo. Pense nisso como a abertura de um novo terminal dentro do seu contêiner, para que você possa mexer, executar scripts, verificar logs ou depurar. - docker attach -
docker attach
conecta seu terminal diretamente ao processo principal de um contêiner em execução. Isso significa que você pode ver a saída em tempo real do contêiner (logs, prompts, etc.) e até mesmo interagir com ele se o processo aceitar entradas.
Solução de problemas comuns
Soluções simples para problemas comuns. Aqui estão alguns erros comuns durante a execução de imagens do Docker e como você pode lidar com eles.
Erro 1: "Resposta de erro do daemon: pull access denied for alpine-python, o repositório não existe ou pode exigir 'docker login': denied: o acesso solicitado ao recurso é negado."
- O que isso significa: O Docker tentou extrair uma imagem, neste caso a imagem
alpine-python
do Docker Hub, mas a imagem não existe ou é privada, e você não está autenticado. - Como corrigir:
- Verifique novamente o nome e a tag da imagem no Docker Hub.
- Se for uma imagem privada, execute
docker login
para autenticar. - Certifique-se de que a imagem exista se você estiver extraindo de um registro personalizado.
Erro 2: "Nenhuma imagem foi encontrada: <nome da imagem>:<tag>"
- O que isso significa: Você tentou executar ou marcar uma imagem localmente, mas a imagem (ou a marca especificada) não está disponível em seu sistema.
- Como corrigir:
- Use o site
docker images
paraverificar as imagens disponíveis. - Puxe a imagem explicitamente:
- Use o site
docker pull <image-name>:<tag>
Erro 3: "manifesto para <image>:<tag> não encontrado: manifesto desconhecido: O manifesto nomeado não é conhecido pelo registro."
- O que isso significa: Esse erro provavelmente ocorre quando a imagem ou a tag especificada não existe.
- Possíveis correções: Essas dicas devem corrigir a maioria dos erros comuns:
- Verifique se a imagem e o nome da tag estão corretos.
- Consulte as tags da imagem no Docker Hub ou no seu registro personalizado.
- Use
docker pull
para obter uma versão válida.:
- Se você estiver criando localmente, use um
Dockerfile
correto e crie a imagem com ele:
docker build -t <image>:<tag> .
Conflitos de portas e falhas de conexão
Os conflitos de porta ocorrem quando vários contêineres ou um contêiner e outro aplicativo tentam acessar a mesma porta.
- Como corrigir:
- Use uma porta de host diferente ao executar o contêiner:
docker run -p 8081:80 <image>
- Interrompa o serviço que está usando a porta no momento.
- Identifique o que está usando uma porta (por exemplo, 8080) com:
lsof -i :8080
Conclusão
A execução de uma imagem do Docker é uma das etapas mais importantes e capacitadoras do uso de contêineres, quer você esteja criando um servidor Web simples ou implantando um aplicativo complexo. Com apenas alguns comandos, como docker run
, docker ps
e docker stop
, você agora está preparado para iniciar, gerenciar e solucionar problemas de contêineres com confiança.
Se você estiver pronto para ir além, tente criar sua própria imagem com um Dockerfile, explore os sinalizadores docker run
avançados ou saiba como gerenciar vários contêineres com o Docker Compose.
Confira estes cursos para continuar sua jornada no Docker:
- Docker intermediário: Aprenda o gerenciamento avançado de imagens, volumes e aplicativos de vários contêineres.
- Conceitos de virtualização e de contêineres: Entenda a teoria por trás dos contêineres e como eles diferem das máquinas virtuais.
- Containerização e virtualização com Docker e Kubernetes: Um programa de aprendizado completo para você dominar o Docker e começar a usar o Kubernetes.
Domine o Docker e o Kubernetes
Perguntas frequentes
Posso executar vários contêineres a partir da mesma imagem do Docker?
Sim, você pode executar vários contêineres a partir da mesma imagem. Cada contêiner é isolado e pode ter suas próprias configurações, portas e variáveis de ambiente.
Como posso passar segredos ou chaves de API de forma segura para um contêiner do Docker?
Use o sinalizador -e
para definir variáveis de ambiente ou use um arquivo .env
e --env-file
para passar segredos em tempo de execução sem codificá-los.
Como faço para executar uma imagem do Docker em segundo plano?
Use o sinalizador -d
com docker run
para iniciar o contêiner no modo desconectado, permitindo que o terminal permaneça disponível para outros comandos.
Qual é a diferença entre docker exec e docker attach?
docker exec
abre uma nova sessão de shell dentro do contêiner, enquanto docker attach
se conecta ao processo principal do contêiner e à sua saída em tempo real.
Por que recebo a mensagem "pull access denied" ao executar uma imagem?
Isso geralmente significa que a imagem é privada ou está mal escrita. Verifique o nome, a tag e certifique-se de que você esteja conectado ao Docker Hub com docker login
.
Como faço para manter os dados em um contêiner depois que ele parar?
Use o sinalizador -v
para montar um volume, garantindo que os dados sejam armazenados fora do contêiner e permaneçam intactos mesmo depois que o contêiner for removido.
Qual é a melhor maneira de executar um contêiner para fins de desenvolvimento?
Use os sinalizadores -it
para o modo interativo, juntamente com a montagem de volumes e variáveis de ambiente para simular um ambiente de desenvolvimento local.
Como posso descobrir quais portas estão em conflito no meu computador?
Use o site lsof -i :
para identificar qual processo está usando uma porta específica e, em seguida, interrompa-o ou use uma porta de host diferente para o seu contêiner.
Como posso visualizar os registros de um contêiner do Docker em execução?
Use o comando docker logs
para recuperar e analisar os registros da saída padrão e dos fluxos de erro do contêiner.
Srujana é redatora freelancer de tecnologia e tem um diploma de quatro anos em Ciência da Computação. Escrever sobre vários tópicos, incluindo ciência de dados, computação em nuvem, desenvolvimento, programação, segurança e muitos outros, é algo natural para ela. Ela gosta de literatura clássica e de explorar novos destinos.