Escrevendo um Dockerfile. Melhores práticas

Publicamos uma nova tradução e esperamos que as recomendações do autor ajudem você a otimizar sua imagem Docker.


Desde o início, o Docker revolucionou a maneira como usamos contêineres. Isso se deve principalmente à simplicidade que o Docker oferece. Ele pode ser usado mesmo sem entender nenhum tópico complexo de contêiner.







Se você é novo no Docker, pode escolher um modelo (imagem de base) e definir suas instruções (comandos do Dockerfile) para colocar seu código dentro da imagem e executá-lo.



A simplicidade do Docker o ajudará com seu trabalho desde o início de seu uso, e a habilidade para otimizá-lo vem com a experiência e geralmente leva tempo.



Trabalho com o Docker há muito tempo, então decidi compartilhar minha experiência sobre como criar contêineres melhor, mesmo se você for um iniciante.



1. Defina as unidades em cache ➱



Você sabia que cada comando RUN incluído no Dockerfile afeta o nível de cache?



Usar vários comandos RUN para instalar pacotes afetará o desempenho e a eficiência do processo de construção. Usar um único comando RUN para instalar todos os pacotes e dependências ajudará você a criar uma unidade em cache em vez de várias.



RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.*

      
      





2. Reduza o tamanho da imagem



O tamanho da imagem desempenha um papel importante na criação de um bom Dockerfile. O uso de imagens menores facilita a implantação mais rápida e reduz o potencial de ataques.



Remova dependências desnecessárias



Evite instalar ferramentas desnecessárias, como ferramentas de depuração, na imagem.



Se o gerenciador de pacotes usar automaticamente os pacotes recomendados para instalar, use os sinalizadores do gerenciador de pacotes e evite instalar dependências desnecessárias.



RUN apt-get update && apt-get -y install --no-install-recommends
      
      





Dica: Compartilhe componentes reutilizáveis ​​entre projetos usando Bit ( Github ).



O bit torna mais fácil documentar, compartilhar e reutilizar componentes independentes entre projetos. Use-o para reutilizar código, manter a consistência do design, colaboração da equipe, aumentar a velocidade de entrega e construir aplicativos escaláveis.



O bit suporta Node, TypeScript, React, Vue, Angular e mais.





Explore os componentes publicados em Bit.dev



3. Suporte de imagem



É muito importante escolher a imagem de base certa para seu aplicativo.



Use a imagem oficial do Docker O



uso da imagem oficial do Docker reduz seu tamanho, reduzindo as dependências desnecessárias que tornam a imagem maior. Existem 3 vantagens principais em usar a imagem oficial:



  • nos permite usar uma imagem com base nas melhores práticas,
  • garante a confiabilidade da imagem e sua segurança,
  • aumenta a confiança e a segurança.


#    
FROM node:13.12.0-alpine

#   
WORKDIR /app

#  `/app/node_modules/.bin`  $PATH
ENV PATH /app/node_modules/.bin:$PATH
      
      





Use tags específicas



Ao escolher uma imagem de base, é recomendável usar uma tag específica. Não use a marca mais recente para a imagem . A tag Mais recente pode sofrer alterações significativas com o tempo.



#    
FROM node:13.12.0-alpine
      
      





Use uma versão de compilação mínima Uma



compilação mínima reduz o tamanho da imagem final. Isso ajuda a implantar aplicativos com mais rapidez e segurança.







Como você pode ver no exemplo acima, ao usar a construção mínima, o tamanho da imagem é menor. A maioria das imagens usa a montagem alpina. Alpine é uma imagem muito leve com um tamanho padrão de 2 MB.



Usando uma imagem baseada em alpino, podemos reduzir significativamente o tamanho da imagem resultante.



4. Reprodutibilidade



Construindo a partir da origem em um ambiente consistente



Se você estiver usando o Docker, é melhor construir seu aplicativo em um ambiente gerenciado para fornecer isolamento.



Devemos evitar criar aplicativos localmente e adicioná-los ao registro.



Caso contrário, os pacotes que você instalou em seu ambiente local podem afetar a consistência da imagem. Provavelmente ninguém quer estar nesta situação, já que compromete uma das principais vantagens do Docker - a execução consistente em diferentes ambientes.



Usando assemblies de vários estágios para remover dependências



É recomendável que você use um método de implantação de aplicativo de vários estágios.



Isso elimina o uso de dependências de assembly em um contêiner em execução.



Podemos construir o aplicativo usando uma imagem de construção exclusiva que tem dependências de desenvolvimento e mover os binários compilados para uma imagem de contêiner separada para executá-lo.



# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:13.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=build-stage /app/build/ /usr/share/nginx/html
      
      





Existem duas etapas separadas no Dockerfile acima. O estágio 0 é usado para construir um aplicativo de nó a partir da imagem de nó original e o estágio 1 é usado para copiar os arquivos montados da imagem de construção para a imagem do servidor da web (Nginx) que, em última instância, serve ao aplicativo.



Conclusão



Isso é tudo que eu queria dizer a você. Se você é novo no Docker, recomendo tentar essas práticas ao construir sua primeira imagem. Isso o ajudará a entender o tópico mais profundamente e permitirá que você use o Docker com eficácia desde o primeiro dia.



Se você conhece outras práticas legais, compartilhe nos comentários. Obrigado por ler!



All Articles