Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Публикуем новый перевод и надеемся, что рекомендации автора помогут вам оптимизировать образ Docker.
С момента своего создания Docker произвел революцию в том, как мы используем контейнеры. В основном это связано с простотой, которую обеспечивает Docker. Он позволяет любому использовать его, не разбираясь в каких-либо сложных темах, связанных с контейнерами.
Если вы новичок в Docker, вы можете выбрать шаблон (базовый образ) и определить свои инструкции (команды Docker file), чтобы разместить свой код внутри образа и запустить его.
Хотя простота Docker помогает выполнять работу, его оптимизация приходит с опытом и обычно требует времени.
Поскольку я работаю с Docker в течение длительного времени, я решил поделиться с вами опытом, как создавать контейнеры лучше уже с первого дня.
1. Определите кэшируемые юниты ➱
Знаете ли вы, что каждая команда RUN, включенная в Dockerfile, влияет на уровень кэширования?
Использование нескольких команд RUN для установки пакетов повлияет на производительность и эффективность процесса сборки. Использование одной команды RUN для установки всех пакетов и зависимостей поможет создать один кэшируемый юнит вместо нескольких.
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. Уменьшите размер образа
Размер образа играет важную роль в создании хорошего Dockerfile. Использование образов меньшего размера приведет к более быстрому развертыванию и меньшей возможности для атак.
Удалите ненужные зависимости
Избегайте установки в образ ненужных инструментов, таких как инструменты отладки.
Если диспетчер пакетов использует для установки рекомендуемые пакеты автоматически, используйте флаги диспетчера пакетов и избегайте установки ненужных зависимостей.
RUN apt-get update && apt-get -y install --no-install-recommends
Совет: делитесь компонентами, которые используете повторно, между проектами с помощью Bit (Github).
Bit упрощает документирование, совместное и повторное использование независимых компонентов между проектами. Применяйте его для повторного использования кода, сохранения единообразия дизайна, совместной работы в команде, увеличения скорости доставки и создания масштабируемых приложений.
Bit поддерживает Node, TypeScript, React, Vue, Angular и др.
Изучите компоненты, опубликованные на Bit.dev
3. Поддержка образа
Выбор правильного базового образа для приложения очень важен.
Используйте официальный образ Docker
Использование официального образа Docker снижает нагрузку на ненужные зависимости, которые делают образ больше. Использование официального образа дает 3 основных преимущества:
- это позволяет нам использовать образ, созданный на основе лучших практик,
- надежность образа и его сохранность,
- выше доверие и безопасность.
# загрузить официальный базовый образ
FROM node:13.12.0-alpine
# установить рабочий каталог
WORKDIR /app
# добавить `/app/node_modules/.bin` в $PATH
ENV PATH /app/node_modules/.bin:$PATH
Использовать определенные теги
При выборе базового образа рекомендуется использовать определенный тег. Не используйте для образа latest тег. Latest тег со временем может претерпевать критические изменения.
# загрузить официальный базовый образ
FROM node:13.12.0-alpine
Используйте минимальные Flavors
Минимальные Flavors уменьшают размер образа. Это помогает разворачивать приложения быстрее и безопаснее.
Как видно из приведенного выше изображения, при использовании минимального flavors образ занимает меньший объём. Большинство образов используют alpine flavor. Alpine — это очень легкий образ со стандартным размером 2 МБ.
Используя образ на основе alpine, мы можем значительно уменьшить размер образа.
4. Воспроизводимость
Сборка из исходного кода в согласованной среде
При создании приложения с помощью Docker лучше создавать приложение в управляемой среде для обеспечения согласованности.
Мы должны избегать создания приложений в локальной среде и добавлять их в реестр.
В противном случае пакеты, которые вы могли установить в своей локальной среде, могут повлиять на согласованность образа. Я надеюсь, что вы не захотите оказаться в такой ситуации, поскольку это ставит под угрозу одно из основных преимуществ Docker — согласованное выполнение в разных средах.
Использование многоэтапных сборок для удаления зависимостей
Рекомендуется использовать многоэтапный способ развертывания приложений.
Это исключает использование зависимостей сборки в работающем контейнере.
Мы можем собрать приложение, используя уникальный образ сборки, который имеет зависимости разработчика, и переместить скомпилированные бинарные файлы в отдельный образ контейнера для его запуска.
# 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
В приведенном выше Dockerfile есть два отдельных этапа. Этап 0 используется для сборки node-приложения из исходного образа node, а этап 1 используется для копирования бинарных файлов из образа сборки в образ веб-сервера (Nginx), который в конечном итоге обслуживает приложение.
Заключение
Это все, что я хотел рассказать. Если вы новичок в Docker, я рекомендую попробовать описанные практики при создании своего первого образа. Это поможет вам понять тему глубже и позволит эффективно использовать Docker с самого начала.
Если вам известны другие крутые практики, делитесь в комментариях. Спасибо за прочтение!