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ásicoCriando 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 DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker 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 usoDocker 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 ambienteAutomatizando a implantação de ambientes com Docker ComposeAutomatizando 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 usoDocker 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çãoDescrição
FROMDefine 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]).
LABELAdiciona metadados à imagem (ex.: versão, mantenedor, descrição).
RUNExecuta comandos em tempo de build, registrando o resultado em uma nova camada da imagem.
COPYCopia arquivos/diretórios do contexto de build para dentro da imagem.
ADDSimilar ao COPY, mas com funcionalidades extras (como extrair arquivos .tar).
WORKDIRDefine o diretório de trabalho dentro da imagem.
ENVConfigura variáveis de ambiente.
EXPOSEDocumenta a porta que o contêiner vai expor (não configura rede automaticamente).
CMDDefine o comando (ou entrada padrão) que será executado quando o contêiner iniciar.
ENTRYPOINTDefine 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 usoDocker 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 ComposeAutomatizando 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 usoDocker 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íciosIntroduçã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 .

Ao finalizar, você terá uma imagem DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker 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 como meu-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 usoDocker 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 ambienteConfiguração de aplicações multi-container com Docker ComposeConfiguraçã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 usoDocker 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🔗

Compartilhar artigo

Artigos Relacionados