✅ Безопасность вашего проекта;
✅ Оптимальные размеры ваших image;
✅ Узнаете о полезных фичах Docker;
✅ Меньше непонятного кода в вашем Dockerfile;
Как пример, вы пишите на Node.js свое приложение и вам нужно собрать и запустить его в Docker.
Берем официальный образ node
Мы взяли image, Теперь нам нужно указать версию, так как по умолчанию берется latest
версия.
Зачем, это делать?
❌ - Можно получить версию которая будет отличатся от предыдущей сборки или сборки на DEV площадках
❌ - В более новой версии могут быть проблемы или она может не собраться
❌ - latest
говорит, что он тестовый и не гарантирует стабильную работу
Как вы поняли, нам стоит указать конкретную версию.
В Node.js имеется довольно большое количество image.В которых идет не только версионность, но и большой список систем:
❌При использовании полноценного дистрибутива, к примеру Centos, в комплекте вы получите много дополнительных компонентов, которые будут использовать место и вряд-ли вы будете ими пользоваться.
✅ Лучше, использовать урезанную версию дистрибутива и доустановить нужные вам компоненты, вы получите меньший размер образа и вам понадобится меньше пространства для хранения и времени для разворачивания среды.
❌ Чем больше компонентов системы, тем выше вероятность наличия уязвимости в вашем образе.🙉
✅ Как показывает практика чем меньше в дистрибутив входит компонентов, тем ниже шанс взлома вашей среды и доступа к вашему проекту.
Образы Docker создается на основе Dockerfile.
Dockerfile каждая его команда иди инструкция прописанная внутри создает "слой":
Все слои будут загонятся в кэш Docker'ом. 👍
Из-за этого при отсутствии правок Docker использует кэш для создания image.
Преимущества кэширования слоев:
✅ - Быстрое создание слоев
Что нужно знать:
После правок в слое, всё нужно пересоздавать заново: Изменили что-то в Dockerfile, Кеш всех следующих слоев будет пересоздан так как считается устарелым. 😣
Соберите список всех команд в Dockerfile от мало использованной и до той которую используете постоянно, так вы сможете правильно использовать свой кэш и оптимизируете скорость создания своего образа 🚀
.dockerignore
Туда можно добавить такие папки как target
и build
файл readme
они вам не нужны и генерировать их постоянно вам точно не нужно. 🤔
👉 Используем
.dockerignore
.
Все что находится внутри файла, игнорируется при создании, вам нужно только перечислить каталоги и файлы.
Есть набор инструментов которые нужно только для разработки и тестирования вашего проекта, в PROD оно не нужно.
Такие инструменты как правило имеют больше уязвимостей и увеличивают вес вашего проекта🧐
Исключает все лишнее, для этого нужно использовать multi-stage builds 💡он позволит использовать несколько временных образов во время процесса сборки, но оставит только финальную версию образа для PROD среды:
Дефолтный юзер для Dockerfile root 🙉 это нам точно не подходит и нам нужно что-то делать с данной проблемой.
❌ Вы же знаете, что это не капли не безопасно.
Если кто-то получит доступ к root вы можете потерять доступ к железу и весь ваш проект смогут слить и получить полный доступ к базе 🤯 всегда есть вероятность использования библиотеки с уязвимостью.
✅ Создаем юзера, который имеет права в конкретную директорию и права на определенные приложения и выделенную группу в образе Docker для для запуска вашего проекта:
как же нам убедится что дыр в безопасности нету? 🧐
Используем команду для проверки безопасности docker scan
. 🔍
В фоне Docker использует сервис snyk для проверки образов на уязвимости.
Как пример output'a