[DevOps] Написание Dockerfile. Лучшие практики (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Публикуем новый перевод и надеемся, что рекомендации автора помогут вам оптимизировать образ 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 с самого начала.
Если вам известны другие крутые практики, делитесь в комментариях. Спасибо за прочтение!
===========
Источник:
habr.com
===========
===========
Автор оригинала: Kasun Rajapakse
===========Похожие новости:
- [DevOps, Kubernetes] Go-приложение с бессерверной архитектурой на Kubernetes с Knative (перевод)
- [Анализ и проектирование систем, ERP-системы, Управление разработкой, DevOps] Как сделать хорошую интеграцию? Часть 1
- [CMS, DevOps] Webflow для лендинга + Ghost для блога с Caddy Server (перевод)
- [Системное администрирование, Apache, Big Data, DevOps] Практический взгляд на хранение в Kafka (перевод)
- [Администрирование баз данных, Lua, DevOps] Мониторинг Tarantool: логи, метрики и их обработка
- [IT-инфраструктура, Big Data, DevOps, Финансы в IT] Выгода бизнеса от AIOps, или почему хороший сисадмин не останется без работы
- [PostgreSQL, DevOps] Заряжай Patroni. Тестируем Patroni + Zookeeper кластер (Часть вторая)
- [Информационная безопасность, Go, Реверс-инжиниринг] Blackrota, самый обфусцированный backdoor, написанный на Go (перевод)
- [Go] Создание API аутентификации с помощью Golang (перевод)
- [.NET, ASP, C#, Разработка под Linux, DevOps] Как готовить Cake, используя только Frosting
Теги для поиска: #_devops, #_devops, #_dockerfile, #_docker, #_blog_kompanii_timeweb (
Блог компании Timeweb
), #_devops
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 18:32
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Публикуем новый перевод и надеемся, что рекомендации автора помогут вам оптимизировать образ 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 с самого начала. Если вам известны другие крутые практики, делитесь в комментариях. Спасибо за прочтение! =========== Источник: habr.com =========== =========== Автор оригинала: Kasun Rajapakse ===========Похожие новости:
Блог компании Timeweb ), #_devops |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 18:32
Часовой пояс: UTC + 5