Melhore a Performance Docker: Otimize Builds e Containers
Guia Prático: Criação de Imagens Docker Personalizadas
Este tutorial tem como objetivo guiar desenvolvedores, DevOps, administradores de sistemas e entusiastas interessados em contêineres DockerCriando e gerenciando containers Docker: guia básicoAprenda a criar e gerenciar contêineres Docker com comandos essenciais, boas práticas e dicas de segurança, garantindo aplicações isoladas e escaláveis. e orquestração na criação de imagens Docker
Docker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. personalizadas usando Dockerfile. Aqui, veremos em detalhes como cada instrução do Dockerfile funciona, além de boas práticas para se obter uma imagem consistente, previsível e fácil de manter.
O que é um Dockerfile?🔗
Um Dockerfile é um arquivo de texto que contém uma sequência de instruções para a construção de uma imagem DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos.. Essas instruções definem o sistema base, as dependências necessárias, a configuração de variáveis de ambiente
Automatizando a implantação de ambientes com Docker ComposeDescubra como automatizar a implantação de ambientes com Docker Compose, garantindo consistência, escalabilidade e agilidade no desenvolvimento., a cópia de arquivos e o comando que será executado quando o contêiner iniciar.
Ao criar um Dockerfile, você descreve passo a passo como deseja que sua imagem DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. seja construída. Isso faz com que o processo de criação seja repetível, permitindo que outras pessoas (ou processos de CI/CD) gerem a mesma imagem sempre que necessário.
Estrutura básica de um Dockerfile🔗
Abaixo está uma visão geral das instruções mais utilizadas em um Dockerfile:
Instrução | Descrição |
---|---|
FROM | Define a imagem base a partir da qual a nova imagem será construída. |
MAINTAINER (obsoleta) | Define quem mantém a imagem (hoje, utiliza-se rótulos [Labels]). |
LABEL | Adiciona metadados à imagem (ex.: versão, mantenedor, descrição). |
RUN | Executa comandos em tempo de build, registrando o resultado em uma nova camada da imagem. |
COPY | Copia arquivos/diretórios do contexto de build para dentro da imagem. |
ADD | Similar ao COPY, mas com funcionalidades extras (como extrair arquivos .tar). |
WORKDIR | Define o diretório de trabalho dentro da imagem. |
ENV | Configura variáveis de ambiente. |
EXPOSE | Documenta a porta que o contêiner vai expor (não configura rede automaticamente). |
CMD | Define o comando (ou entrada padrão) que será executado quando o contêiner iniciar. |
ENTRYPOINT | Define o executável principal do contêiner, que pode funcionar em conjunto com o CMD. |
Essas instruções podem ser usadas em conjunto para criar imagens altamente personalizadas, possibilitando a adição de dependências, configurações e arquivos necessários para sua aplicação.
Passo a passo na criação de uma imagem personalizada🔗
Nesta seção, construiremos um exemplo de Dockerfile para uma aplicação simples em Node.js. Nosso objetivo será demonstrar como cada instrução entra em ação na prática.
Definindo a imagem base (FROM)
A primeira instrução em qualquer Dockerfile é o FROM, que indica a imagem de base. Para nosso exemplo, usaremos uma imagem oficial do Node.js:
FROM node:18
A versão 18 é apenas um exemplo; escolha aquela que mais se adequa ao seu projeto. Esta imagem já vem com o Node.js e o NPM instalado.
Adicionando metadados com LABEL
Em vez de usar MAINTAINER (que está obsoleto em versões recentes do DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos.), é possível adicionar informações de quem mantém o projeto com LABEL:
LABEL maintainer="Seu Nome <[email protected]>"
Além disso, outros metadados podem ser definidos, como a versão da aplicação ou uma breve descrição:
LABEL version="1.0" \
description="Exemplo de Dockerfile para uma aplicação simples em Node.js"
Definindo variáveis de ambiente (ENV)
Vamos criar uma variável de ambienteAutomatizando a implantação de ambientes com Docker ComposeDescubra como automatizar a implantação de ambientes com Docker Compose, garantindo consistência, escalabilidade e agilidade no desenvolvimento. para definir uma pasta de aplicação dentro do contêiner:
ENV APP_DIR=/usr/src/app
Assim, podemos usar ENV para declarar configurações relevantes, tornando o Dockerfile mais flexível.
Definindo o diretório de trabalho (WORKDIR)
Para evitar repetição nos próximos comandos, definimos o WORKDIR como sendo a variável criada:
WORKDIR $APP_DIR
A partir de agora, todos os comandos serão executados dentro de /usr/src/app
.
Copiando arquivos para o contêiner (COPY)
Queremos copiar nossos arquivos de aplicação para dentro da imagem. Supondo que no mesmo diretório do Dockerfile exista um arquivo package.json e uma pasta src com o código:
COPY package*.json ./
COPY src ./src
Assim, o arquivo package.json
e a pasta src
serão copiados para o APP_DIR definido acima.
Instalando dependências (RUN)
Para instalar as dependências do projeto, utilizamos a instrução RUN:
RUN npm install
Esse comando será executado em tempo de build, gerando uma nova camada na imagem. Se o package-lock.json
existir, o DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. usará o cache de camadas para acelerar builds futuros (desde que esse arquivo não seja modificado).
Expondo a porta (EXPOSE)
Se a nossa aplicação Node.js escutar na porta 3000, por exemplo, podemos documentar essa informação:
EXPOSE 3000
É importante lembrar que EXPOSE não abre efetivamente a porta externamente (isso é configurado ao rodar o contêiner com parâmetros como -p 3000:3000
ou no Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção.). Serve principalmente como metadado.
Definindo o comando de inicialização (CMD ou ENTRYPOINT)
Para iniciar nossa aplicação, definimos um CMD:
CMD ["node", "src/index.js"]
Desta forma, quando o contêiner for iniciado, ele executará o arquivo src/index.js
com o Node.js.
Se fosse necessário ajustar a aplicação a partir de parâmetros de linha de comando ou scripts adicionais, poderíamos usar o ENTRYPOINT em conjunto com CMD. Mas para este exemplo, o CMD já é suficiente.
Dockerfile final
Reunindo tudo, nosso Dockerfile ficaria assim:
FROM node:18
LABEL maintainer="Seu Nome <[email protected]>"
LABEL version="1.0" \
description="Exemplo de Dockerfile para uma aplicação simples em Node.js"
ENV APP_DIR=/usr/src/app
WORKDIR $APP_DIR
COPY package*.json ./
RUN npm install
COPY src ./src
EXPOSE 3000
CMD ["node", "src/index.js"]
Construindo a imagem🔗
Após criar o arquivo Dockerfile em um diretório junto com seu código, abra o terminal na pasta do projeto e execute:
docker build -t meu-usuario/minha-imagem:1.0 .
-t
especifica a tag da imagem, que pode incluir seu nome de usuário do DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. Hub.
- O
.
(ponto final) indica o contexto de build, ou seja, o diretório onde está o Dockerfile e o resto dos arquivos.
Ao finalizar, você terá uma imagem DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. chamada
meu-usuario/minha-imagem:1.0
disponível localmente.
Executando o contêiner🔗
Para validar se a imagem funciona, basta executar:
docker run -p 3000:3000 --name meu-container meu-usuario/minha-imagem:1.0
-p 3000:3000
publica a porta 3000 do contêiner na porta 3000 do host.--name
define o nome do contêiner comomeu-container
.
A aplicação estará acessível em localhost:3000
.
Conclusão🔗
Criar imagens DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. personalizadas passo a passo usando um Dockerfile é fundamental para manter um fluxo de trabalho reprodutível e garantir que todos em sua equipe obtenham resultados consistentes ao construir a aplicação. As instruções essenciais – FROM, RUN, COPY, WORKDIR, ENV, EXPOSE e CMD – trabalham juntas para configurar todo o ambiente
Configuração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. necessário para a execução da sua aplicação dentro de um contêiner.
Seguindo este tutorial, você está pronto para experimentar e customizar seus Dockerfiles adequadamente, adicionando diretórios, ferramentas e configurações específicas do seu projeto, sempre mantendo em mente as boas práticas de organização e versionamento de imagens DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos..
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- Documentação do Docker Engine: docs.docker.com/engine/
- Documentação oficial do Docker: docs.docker.com/
- Referência de linha de comando Docker CLI: docs.docker.com/engine/reference/commandline/docker/
- Repositório de imagens oficiais no Docker Hub: hub.docker.com/