Рубрики
Uncategorized

5 распространенных ошибок при написании Docker Compose

При создании контейнерного приложения разработчики нуждаются в пути к загрузке контейнеров, которые они работают … Теги с докером, микросервисами, дежопами.

При создании контейнерного приложения разработчики нуждаются в пути к загрузке контейнеров, которые они работают, чтобы проверить их код. Хотя есть несколько способов сделать это, Docker Compose является одним из самых популярных вариантов. Это облегчает:

  • Укажите, какие контейнеры загружаются во время разработки
  • И Настройка быстрого кодового теста-отладочного петля разработки

Видение состоит в том, что кто-то пишет Docker-Compose.yml Это указывает все, что нужно в разработке и комбиты их репо. Тогда каждый разработчик просто работает Docker-Compose up Какие сапоги все контейнеры им нужно проверить их код.

Однако требуется много работы, чтобы получить ваш Docker-Compose Настройка к пиковой производительности. Мы видели лучшие команды, загружая свои среды развития в Менее минуты и тестирование каждого изменения в секунды Отказ

Учитывая, сколько времени каждый разрабатыватель тратит тестирование своего кода каждый день, небольшие улучшения могут сложить массивное влияние на производительность разработчика.

(Кредит XKCD )

Ошибка 1: Частые перестройки контейнера

Docker Build занимает много времени. Если вы перестроили свой контейнер каждый раз, когда вы хотите проверить изменения кода, у вас есть огромная возможность ускорить свой цикл развития.

Традиционный рабочий процесс для работы на не контейнерных приложениях выглядит следующим образом:

  • Код
  • Строить
  • Бегать

Этот процесс был высоко оптимизирован в течение многих лет, с уловками, такими как инкрементные сборки для скомпилированных языков и горячей перезагрузки. Это довольно быстро.

Когда люди сначала принимают контейнеры, они склонны брать свой существующий рабочий процесс и просто добавить Docker Build шаг. Их рабочий процесс заканчивается так:

  • Код
  • Строить
  • Docker Build.
  • Бегать

Если не сделано хорошо, что Docker Build Шаг бросает все эти оптимизации из окна. Кроме того, он добавляет кучу дополнительных трудоемких работ, таких как переустановка зависимостей с APT-GET. Все это добавляет в гораздо более медленный процесс тестирования, чем раньше докера.

Решение: запустить свой код вне докера

Один подход — загрузить все ваши зависимости в Docker Compose, но запустите код, который вы активно работаете на месте. Это имитирует рабочий процесс для разработки не контейнерных приложений.

Просто разоблачить ваши зависимости от localhost И укажите услугу, на которой вы работаете на localhost: адреса.

Однако это не всегда практично, особенно если код, над которым вы работаете, зависит от вещей, встроенных в контейнерное изображение, которое не легко добраться с вашего ноутбука.

Решение: максимизировать кэширование для оптимизации вашего DockerFile

Если вы должны построить документы Docker, написав свои Dockerfiles, чтобы они максимизируют кэширование, могут повернуть 10-минутный докер на 1 минуту.

Типичный шаблон для производства DockerFiles — снизить количество слоев, в цепочке одиночных команд в один Беги утверждение. Однако размер изображения не имеет значения в развитии. В развитии вы хотите самые сложные слои.

Ваше производство DockerFile может выглядеть так:

RUN \
    go get -d -v \
    && go install -v \
    && go build

Это ужасно для разработки, потому что каждый раз, когда команда перезапускается, Docker будет загружать все ваши зависимости и переустановить их. Инкрементная сборка более эффективна.

Вместо этого вы должны иметь выделенный Dockerfile специально для развития. Разбивайте все в крошечные маленькие шаги и спланируйте свой DockerFile так, чтобы шаги на основе кода, которые часто меняются, часто возвращаются.

Вещи, которые изменяются минимум часто, такие как тянущие зависимости, должны идти первыми. Таким образом, вам не нужно создавать весь проект при восстановлении вашего DockerFile. Вам просто нужно построить крошечный последний кусок, который вы только что изменились.

Например, см. Ниже приведены ниже DockerFile, который мы используем для Blimp разработка. Следователь следует, что методы, описанные выше, чтобы уменьшить тяжелый процесс сборки до нескольких секунд.

FROM golang:1.13-alpine as builder

RUN apk add busybox-static

WORKDIR /go/src/github.com/kelda-inc/blimp

ADD ./go.mod ./go.mod
ADD ./go.sum ./go.sum
ADD ./pkg ./pkg

ARG COMPILE_FLAGS

RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./pkg/...

ADD ./login-proxy ./login-proxy
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./login-proxy/...

ADD ./registry ./registry
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./registry/...

ADD ./sandbox ./sandbox
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./sandbox/...

ADD ./cluster-controller ./cluster-controller
RUN CGO_ENABLED=0 go install -i -ldflags "${COMPILE_FLAGS}" ./cluster-controller/...

RUN mkdir /gobin
RUN cp /go/bin/cluster-controller /gobin/blimp-cluster-controller
RUN cp /go/bin/syncthing /gobin/blimp-syncthing
RUN cp /go/bin/init /gobin/blimp-init
RUN cp /go/bin/sbctl /gobin/blimp-sbctl
RUN cp /go/bin/registry /gobin/blimp-auth
RUN cp /go/bin/vcp /gobin/blimp-vcp
RUN cp /go/bin/login-proxy /gobin/login-proxy

FROM alpine

COPY --from=builder /bin/busybox.static /bin/busybox.static
COPY --from=builder /gobin/* /bin/

Одно окончательное примечание: с недавним введением Многоступенчатая сборки Теперь теперь можно создавать DockerFiles, что оба имеют хорошие размеры налоговых и небольших изображений. Мы не будем обсуждать это подробно в этом посте, кроме того, чтобы сказать, что приведенный выше Dockerfile делает только что и в результате используется как для Сразу Развитие, а также производство.

Решение: используйте объемы хозяина

В целом, лучшим вариантом является использование громкости хоста для непосредственного установки вашего кода в контейнер. Это дает вам скорость выполнения вашего кода, в которой все еще работают в контейнере Docker, содержащем его зависимости выполнения.

Объемы хоста Зеркали каталог на вашем ноутбуке в бегущий контейнер. Когда вы редактируете файл в текстовом редакторе, изменение автоматически синхронизируется в контейнер, а затем может быть немедленно выполнено в контейнере.

Большинство языков имеют способ просмотреть ваш код и автоматически повторно запустить, когда он меняется. Например, Номемон это Перейти к JavaScript. Проверьте это пост для учебника о том, как установить это.

Изначально требуется некоторая работа, но в результате вы можете увидеть результаты изменения вашего кода за 1-2 секунды, по сравнению с сборкой Docker, который может занять минуты.

Ошибка 2: медленные тома хозяина

Если вы уже используете тома хоста, вы, возможно, заметили, что чтение и запись файлов могут быть болезненно медленными на Windows и Mac. Это известная проблема для команд, которые читают и пишут множество файлов, таких как Node.js и PHP-приложения со сложными зависимостями.

Это потому, что Docker работает в VM на Windows и Mac. Когда вы делаете монтирование тома хоста, он должен пройти через много перевода, чтобы получить папку, работающую на вашем ноутбуке в контейнер, несколько похож на сетевую файловую систему. Это добавляет много накладных расходов, что не присутствует при работе докера на Linux.

Решение: расслабиться сильной консистенцией

Одной из ключевых проблем является то, что файловые установки по умолчанию поддерживают сильную консистенцию. Консистенция — это широкая тема, на которой пролились много чернил, но, вкратце, это означает, что все конкретные файлы читателя и писатели договорились о том, что любые модификации файлов произошли, и, таким образом, согласовывают содержимое этого файла (в конце концов, сортируют из).

Проблема заключается в том, что обеспечение сильной консистенции довольно дорого, требующая координации между всеми писателями файлов, чтобы гарантировать, что они не совпадают, что они не соответствуют изменениям друг друга.

Хотя прочная консистенция может быть особенно важна, когда, например, запуск базы данных в производстве. Хорошая новость заключается в том, что в разработке, это не требуется. Ваши файлы кода будут иметь один писатель (вы) и один источник правды (ваш репо). В результате конфликты не так серьезно, как они могут быть в производстве.

На этой причине Docker реализовал возможность расслабиться гарантии согласованности при монтаже объемов. В Docker Compose вы можете просто добавить это кэшировать Ключевое слово для ваших громкости, чтобы получить значительную гарантию производительности. (Не делай этого в производстве …)

volumes:
    - "./app:/usr/src/app/app:cached"

Решение: синхронизация кода

Другой подход — это настройка синхронизации кода. Вместо того, чтобы монтаж объем, вы можете использовать инструмент, который замечает изменения между вашим ноутбуком и файлами контейнера и копирования для разрешения различий (аналогичных rsync).

Следующая версия Docker имеет Мутаген Встроенный в качестве альтернативы кэшированным режиме для объемов. Если вы заинтересованы, просто подождите, пока Docker не сделает следующий релиз и попробую это, но вы также можете проверить Мутагенский проект, чтобы использовать его без ожидания. Blimp Наш докер составлял реализацию, достигает чего-то подобного использования Синпин

Решение: не монтируйте пакеты

С языками, такими как узел, основная часть файловых операций, как правило, в каталоге пакетов (например, Node_Modules ). В результате, исключая эти каталоги из ваших объемов, могут вызвать значительный повышение производительности.

В приведенном ниже примере у нас есть объем монтажа нашего кода в контейнер. А потом перезаписать просто Node_Modules каталог с собственным чистым выделенным объемом.

volumes:
  - ".:/usr/src/app"
  - "/usr/src/app/node_modules"

Это дополнительное монтирование громкости говорит Docker использовать стандартный том для Node_Modules каталог Так что когда NPM установить Запускается, что он не использует медленный хост крепления. Чтобы сделать эту работу, когда контейнер сначала загружается, мы делаем NPM установить в Выходная точка Чтобы установить наши зависимости и заполнить Node_Modules каталог. Что-то вроде этого:

entrypoint:
  - "sh"
  - "-c"
  - "npm install && ./node_modules/.bin/nodemon server.js"

Полные инструкции для клонирования и запуска приведенного выше примера можно найти здесь Отказ

Ошибка 3: хрупкая конфигурация

Большинство файлов Compose Pockuge развиваются органично. Обычно мы видим тонны копирования и вставленного кода, что делает его трудно сделать модификации. Clean Docker Compose Pogose облегчает регулярные обновления в качестве изменения производства.

Решение: используйте файлы env

ENV-файлы Отдельные переменные среды от основного докера Compose Configuration. Это полезно для:

  • Держать секреты из истории Git
  • Удобно иметь немного разные настройки на разработчик. Например, каждый разработчик может иметь уникальный ключ доступа. Сохранение конфигурации в .env Файл означает, что им не нужно изменить совершенные Docker-Compose.yml Файл и иметь дело с конфликтами, поскольку файл обновлен.

Использовать файлы env, просто добавьте .env файл или установить путь явно с помощью env_file поле Отказ

Решение: используйте файлы переопределения

Переопределить файлы Позвольте вам иметь базовую конфигурацию, а затем указать модификации в другом файле. Это может быть действительно мощным, если вы используете Docker Rash, а имейте производственный файл YAML. Вы можете хранить свою производственную конфигурацию в Docker-Compose.yml Затем укажите любые модификации, необходимые для разработки, такие как использование томов хоста, в файле переопределения.

Решение: использование расширяться

Если вы используете Docker Compose V2, вы можете использовать расширяться Ключевое слово для импорта фрагментов YAML в нескольких местах. Например, у вас может быть определение, что все услуги у вашей компании будут иметь эти конкретные пять вариантов конфигурации в их Docker Compose File в разработке. Вы можете определить это один раз, а затем использовать расширяться ключевое слово, чтобы бросить, что везде нужно, что дает вам модульность. Это больно, что мы должны сделать это в Ямле Но это лучшее, что у нас нет короткого написания программы для ее создания.

Составьте V3 удаленной поддержки для расширяться ключевое слово. Тем не менее, вы можете достичь аналогичного результата с Ямль якоря Отказ

Решение: программно генерировать файлы составляющих

Мы работали с некоторыми инженерными командами, использующими Сразу которые имеют сто контейнеров в их разработке Docker Compose файл. Если бы они использовали один гигантский Docker Compose файл, это потребует тысячи линий неодавленных YAML.

Когда вы масштабируете, все в порядке, чтобы написать скрипт для создания файлов Pocker Compose на основе некоторых спецификаций более высокого уровня. Это распространено для инженерных команд с действительно большим развитием сред.

Ошибка 4: Flacy Boots

Делает Docker-Compose up Только работа по половине времени? Вы должны запустить Docker-Compose Restart Чтобы вызвать разбитые услуги?

Большинство разработчиков хотят написать код, не делайте devops работать. Отладка сломанной среды развития — супер разочарование.

Docker-Compose up должен просто работать, каждый раз.

Большинство проблем здесь связаны с услугами, начиная с неправильного порядка. Например, ваше веб-приложение может полагаться на базу данных и будет сражаться, если база данных не готова, когда ботинки веб-приложений.

Решение: использование зависит от

Defends_on Позволяет контролировать заказ запуска. По умолчанию Defends_on Только ждет, пока не будет создана зависимость, и не ждет зависимости быть «здоровой». Тем не менее, Docker Compose V2 поддерживает сочетание Depends_on с Здравоохранение. (К сожалению, эта функция была удалена в Docker Compose V3, вместо этого вы можете вручную реализовать что-то похожее с помощью скрипта, такого как ждать-for-it.sh )

Документация Docker рекомендует против подходов, таких как Defends_on и ждать-for-it.sh Отказ И мы согласны, в производстве, требующие определенного загрузки для ваших контейнеров, является признаком хрупкой архитектуры. Однако, как индивидуальный разработчик, пытающийся сделать работу, исправления каждого контейнера во всей инженерной организации не может быть осуществимым. Итак, для развития, мы думаем, что все в порядке.

Ошибка 5: плохое управление ресурсами

Это может быть сложно убедиться, что у Docker есть ресурсы, которые необходимо плавно работать без полного обгона вашего ноутбука. Там есть пара вещей, в которых вы можете посмотреть, если вы чувствуете, что ваш рабочий процесс разработки вязкий, потому что Docker не работает на пиковой емкости.

Решение: Изменить докинские настольные ассигнования

Docker Desktop нужен много RAM и CPU, особенно на Mac и Windows, где это VM. Конфигурация DectPer Decktop Deft Docktop Porth не выделяет достаточно оперативной памяти и процессора, поэтому мы, как правило, рекомендуем настроить настройку для переустановки. Я склонен выделять около 8 ГБ оперативной памяти и 4 процессора, чтобы докер, когда я разрабатываю (и я выключаю Docker Desktop, когда не использую, чтобы сделать это работоспособным).

Решение: Brune неиспользованные ресурсы

Часто люди будут непреднамеренно утечки ресурсов при использовании докера. Для людей не редкость, чтобы иметь сотни объемов, старых контейнерных изображений, а иногда и беговые контейнеры, если они не осторожны. Вот почему мы рекомендуем Изредка бега Docker System Bruny которые удаляют все тома, контейнеры и сети, которые в данный момент в данный момент используются. Это может освободить много ресурсов.

Решение: бегать в облаке

Наконец, в некоторых случаях даже с вышеуказанными наконечниками, может быть невозможно эффективно выполнить все необходимые контейнеры на вашем ноутбуке. Если это так, проверьте Сразу , простой способ запустить Docker Compose файлы в облаке.

Что вы должны сделать?

TDLR; Чтобы улучшить опыт разработчика на Docker Compose, я бы поощрял вас

  1. Минимизируйте перестройки контейнеров.
  2. Используйте объемы хозяина.
  3. Стремитесь для удовольствия Compose файлов, как код.
  4. Сделайте свои ботинки надежными.
  5. Управляйте ресурсами.

Оригинал: «https://dev.to/ethanjjackson/5-common-mistakes-when-writing-docker-compose-1f3»