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!