Ключевые выводы
- Используйте официальные образы Docker для повышения безопасности и производительности. Создание собственных образов может привести к неправильной конфигурации и занять больше времени.
- Используйте определенные версии образов Docker, чтобы избежать непредсказуемого поведения и конфликтов с зависимостями. Извлекайте и собирайте, используя образы конкретной версии.
- Сканируйте образы Docker на наличие уязвимостей безопасности с помощью команды сканирования Docker. Определите, достаточно ли безопасен образ для вашего приложения.
Docker — самое популярное программное обеспечение для контейнеризации, но не все используют его эффективно. Если вы не будете следовать лучшим практикам Docker, вы можете оставить свои приложения уязвимыми для проблем безопасности или проблем с производительностью.
Вот несколько рекомендаций, которые вы можете использовать, чтобы разумно использовать функции Docker. Эти меры повышают безопасность и гарантируют создание удобных в обслуживании файлов Docker.
1. Используйте официальные образы Docker
При контейнеризации приложения вы должны использовать образ Docker. Вы можете создать образ с собственной конфигурацией или использовать официальные образы Docker.
Для создания собственных образов вам придется самостоятельно выполнить всю настройку. Например, чтобы создать образ для приложения node.js, вам необходимо загрузить node.js и его зависимости. Этот процесс занимает много времени и может не привести к правильной настройке.
Docker рекомендует использовать официальный образ node.js со всеми правильными зависимостями. Образы Docker имеют лучшие меры безопасности, легки и протестированы для различных сред. Официальные изображения вы можете найти на Официальные изображения Docker страница.
2. Используйте определенные версии образа Docker
Обычно, когда вы извлекаете официальное изображение, это изображение с последним тегом, который представляет последнюю обновленную версию этого изображения. Каждый раз, когда вы создаете контейнер из этого образа, это другая версия последнего контейнера.
Сборка с использованием разных версий образа Docker может привести к непредсказуемому поведению вашего приложения. Версии могут конфликтовать с другими зависимостями и в конечном итоге привести к сбою вашего приложения.
Docker рекомендует извлекать и собирать образы определенной версии. Официальные изображения также содержат документацию и охватывают наиболее распространенные случаи использования.
Например, вместо докер тянуть альпийский, использовать докер тянуть альпийский: 3.18.3. Docker вытащит эту конкретную версию. Затем вы можете использовать его в последующих сборках, уменьшая количество ошибок в вашем приложении. Конкретные версии образов можно найти на официальной странице образов Docker в разделе Поддерживаемые теги и соответствующие ссылки Dockerfile.:
3. Сканирование изображений на наличие уязвимостей безопасности
Как определить, что образ, который вы хотите создать, не имеет уязвимостей безопасности? Сканируя его. Вы можете сканировать образы Docker с помощью команды сканирования Docker. Синтаксис следующий:
docker scan [IMAGE]
Сначала вам необходимо войти в Docker, чтобы отсканировать изображение.
docker login
Затем отсканируйте конкретное изображение, которое хотите проверить:
docker scan ubuntu: latest
Инструмент под названием Синк сканирует изображение, перечисляя все уязвимости в зависимости от их серьезности. Вы можете увидеть тип уязвимости и ссылки на информацию о ней, в том числе о том, как ее исправить. По сканированию вы можете определить, достаточно ли безопасно изображение для вашего приложения.
4. Используйте Docker-образы небольшого размера
Когда вы извлекаете образ Docker, он поставляется со всеми системными утилитами. Это увеличивает размер изображения с помощью инструментов, которые вам не нужны.
Большие образы Docker занимают место на диске и могут замедлить работу контейнеров. Они также имеют большую вероятность уязвимостей безопасности.
Ты можешь уменьшить размер изображений Docker с помощью изображений Alpine. Изображения Alpine легкие и содержат только необходимые инструменты. Они уменьшают объем памяти, благодаря чему ваше приложение работает быстрее и эффективнее.
Вы найдете версию Alpine для большинства официальных образов в Docker. Вот пример Alpine-версий для PostgreSQL:
5. Оптимизация кэширования слоев изображения
Каждая команда в Dockerfile представляет слой изображения. Слои имеют разные утилиты и выполняют разные функции. Если вы посмотрите официальные изображения на Docker Hub, вы увидите инструкции, использованные для их создания.
Dockerfile содержит все необходимое для создания образа. Это одна из причин, почему многие разработчики предпочитают Docker виртуальным машинам.
Вот структура примера изображения Alpine:
Когда вы создаете приложение на основе изображения, вы добавляете к нему больше слоев. Docker выполняет инструкции в Dockerfile сверху вниз, и если слой изменяется, Docker должен перестроить последующие слои.
Лучше всего упорядочить Dockerfile от наименее изменяющихся файлов к тем, которые изменяются чаще всего. Инструкции, которые не изменяются, например установка, могут находиться в верхней части файла.
Когда вы меняете файл, Docker создает его на основе измененных файлов и кэширует неизмененные файлы над ним. Поэтому процесс протекает быстрее.
Посмотрите на пример, показанный на картинке выше. Если в файлах приложения есть изменения, Docker выполняет сборку оттуда; ему не нужно снова устанавливать пакеты npm.
Если вы создаете образ на основе образа, процесс будет выполняться быстрее, чем перестроение всех остальных слоев заново. Кэширование также ускоряет получение и отправку изображений из Docker Hub.
7. Используйте файл .dockerignore
При создании образа с использованием Dockerfile вы можете сохранить конфиденциальность определенной информации. Некоторые файлы и папки могут быть частью проекта, но вы не хотите включать их в процесс сборки.
Использование файла .dockerignore значительно уменьшает размер изображения. Это связано с тем, что процесс сборки включает только необходимые файлы. Это также помогает сохранить конфиденциальность файлов и избежать раскрытия секретных ключей или паролей.
Файл .dockerignore — это файл, который вы создаете в той же папке, что и ваш Dockerfile. Это текстовый файл, очень похожий на файл .gitignore, который содержит имена всех файлов, которые вы не хотите включать в процесс сборки.
Вот пример:
8. Используйте принцип наименее привилегированного пользователя
По умолчанию Docker использует пользователя root в качестве администратора для разрешения запуска команд, но это плохая практика. Если в одном из контейнеров есть уязвимость, хакеры могут получить доступ к хосту Docker.
Чтобы избежать этого сценария, создайте выделенного пользователя и группу. Вы можете установить необходимые разрешения для группы для защиты конфиденциальной информации. Если пользователь скомпрометирован, вы можете удалить его, не подвергая риску весь проект.
Вот пример, показывающий, как создать пользователя и установить его разрешения:
В некоторых базовых образах созданы псевдопользователи. Вы можете использовать установленных пользователей вместо прав root-пользователя.
Почему вам следует перенять лучшие практики Docker
Лучшие практики — отличный способ уменьшить количество уязвимостей и написать более чистый код. Существует множество рекомендаций, которые вы можете применить к каждой используемой вами функции Docker.
Хорошо организованный проект упрощает синхронизацию с другими инструментами оркестрации, такими как Kubernetes. Вы можете начать с тех, которые описаны в статье, и использовать новые по мере изучения Docker.