Если Вы наконец поняли, что повсюду окружены контейнерами и обнаружили, что они решают массу проблем и имеют много преимуществ:
include '../static/php/content/promo.php'; ?>
- Контейнеры вездесущи - ОС, версии библиотек, конфигурации, папки и приложения помещаются в контейнер. Вы гарантируете, что та же самая задача, которая была протестирована в QA, достигнет производственной среды с таким же поведением.
- Контейнеры упрощены - объем памяти контейнера невелик. Вместо сотен или тысяч мегабайт контейнер будет выделять память только для основного процесса.
- Контейнеры быстрые - Вы можете запустить контейнер для начала работы так же быстро, как типичный процесс Linux. Вместо минут можно запустить новый контейнер за несколько секунд.
Тем не менее, многие пользователи по-прежнему относятся к контейнерам так же, как к типичным виртуальным машинам, и забывают про важную характеристику: они одноразовые.
Мантра о контейнерах: “Контейнеры эфемерны”.
Эта характеристика заставляет пользователей поменять свое мышление относительно того, как они должны обращаться с контейнерами и управлять ими; и я объясню, чего НЕ следует делать, чтобы продолжать извлекать наилучшие преимущества контейнеров.
10 вещей, которых следует избегать в Docker контейнерах
- Не хранить данные в контейнерах - контейнер может быть остановлен, удален или заменен. Приложение версии 1.0, работающее в контейнере, может быть легко заменено версией 1.1 без какого-либо неблагоприятного воздействия или потери данных. Поэтому, если нужно сохранить данные, сделайте это на диске. В этом случае следует также позаботиться о том, чтобы два контейнера записывали данные на один и тот же диск, что может привести к повреждению. Убедитесь, что приложения могут записывать данные в хранилище объектов.
- Не разделять свое приложение на две части - так как некоторые люди видят контейнеры в роли виртуальной машин и поэтому большинство из них склонны думать, что они должны применять свое приложение только в существующих работающих контейнерах. Это может быть справедливо на этапе разработки, на котором Вам необходимо непрерывно разрабатывать и налаживать процесс; но для непрерывной доставки (CD) в QA и производства, Ваше приложение должно быть частью образа. Помните: Контейнеры нельзя изменить.
- Не создавать большие образы - большой образ будет труднее распространить. Убедитесь в наличии только необходимых файлов и библиотек для запуска приложения/процесса. Не устанавливайте ненужные пакеты и не запускайте обновления (yum update), которые загружают много файлов на новый слой образы.
- Не использовать однослойный образ - чтобы эффективно пользоваться многоуровневой файловой системой, всегда создавайте собственный базовый слой образы для операционной системы, а также другой слой для определения имени пользователя, слой для установки во время выполнения, слой для конфигурации и, наконец, слой для приложения. Будет проще воссоздать образ, управлять им и использовать его.
- Не создавать образы из запущенных контейнеров - другими словами, не используйте слово
docker commit
для создания образа. Этот способ не приносит пользы, и его следует полностью избегать. Всегда используйте полностью воспроизводимый Dockerfile или любой другой S2I (от источника к изображению) подход, и Вы можете отследить изменения в Dockerfile, если сохранить его в хранилище системы управления версиями (git). - Не использовать
latest
(последний) тег – он подобенSNAPSHOT
для пользователей Maven. Метки подключаются из-за слоистой файловой природы контейнеров. Вы ведь не хотите иметь сюрпризы при построении образа несколько месяцев, а потом выяснить, что приложение не может быть запущено, так как родительский слой (из-за Dockerfile) был заменен новой версией, которая не является обратно совместимой, или из кэша сборки была получена неправильная "последняя" версия. Тегаlatest
также следует избегать при применении контейнеров в производстве, так как невозможно отследить, какая версия образа выполняется. - Не выполнять более одного процесса в одном контейнере - контейнеры идеально подходят для выполнения лишь одного процесса (HTTP, сервер приложений, база данных), но если имеется более одного процесса, могут возникнуть дополнительные проблемы с управлением, извлечением журналов и обновлением их по отдельности.
- Не хранить учетные данные в виде образов. Используйте переменные среды, ведь для этого не требуется жестко кодировать имя пользователя/пароль в образе. Используйте переменные среды для получения этой информации вне контейнера. Отличный пример этого принципа - образ Постгреса.
- Не запускать процессы от имени пользователя root - "По умолчанию docker контейнеры выполняются от имени пользователя root. По мере «взросления» docker контейнеров могут стать доступны секретные по умолчанию параметры. На данный момент требуемый root опасен для других и может быть доступен не во всех средах. Ваш образ должен использовать инструкцию USER, чтобы указать пользователя, не являющегося root, для контейнеров, которые будут запускаться".
- Не полагайтесь на IP-адреса - каждый контейнер имеет свой собственный внутренний IP-адрес, и он может измениться, если вы запустите и остановите контейнер. Если приложению или микросервису требуется связь с другим контейнером, используйте переменные среды для передачи соответствующего имени хоста и порта из одного контейнера в другой.