Rate this post

СЕО компании Docker представил данные, согласно которым за два прошлых года, приложений работающих в контейнерах докер увеличилось на 3100%. Во всем мире около 460 тысяч приложений работают с использованием docker.nnЕсли вы еще не используете докер, то обязательно подумайте об этом. Благодаря docker поменялся подход к разработке приложений и стал не заменимым продуктом у программистов и devops инженеров. Данная статья предназначена для уже использующих докер, и покажет еще одно преимущество этого продукта.nnМы поделимся как используем в больших проектах docker-compose. Используя docker-compose для настройки, тестирования и автоматизации процессов разработки, мы улучшили эффективность команды разработчиков, которые теперь занимаются только разработкой.n

Задачи

Как все работало раньше? У разработчиков была дополнительная задача развернуть окружение для непосредственной разработки и тестирования приложения. Нужно было поставить БД и другие инструменты для работы. Так же нужно было все это настроить под рабочее место, указывать нужные пути и порты в системе. Данные потуги настройки обычно не документировались и занимали много времени по подготовке и доведения системы до рабочее состояния.nnБольшинство продуктов были довольно примитивными, но ввиду развития обрастали все новыми и новыми функциями, с которым нужно было разбираться. Были внедрены очереди и дополнительные БД. Ввиду популярности микросервисов, большие приложения стали разделять на части. Данные видоизменения касаются команды работающей над проектом. Член команды разработки, внеся изменения, которые затрагивают переменные окружения, писал длинные терады, что и как нужно поменять, для настройки. Не удивительны случаи когда один разработчик внес изменения и вроде как описал все, что нужно сделать что бы заработало в локальных окружения, ушел спасть. А остальная команда потеряла день, дабы разобраться, что ж не так. Ведь разработчик забыл уточнить одну маленькую, но очень важную деталь.nnПрограммисты как и другие сотрудники не любители описывать свои действия, и зачастую считаю, что и так понятно. В результате настройка окружения для приложения для новичка, становится сложным квестом.nnЧто бы упростить себе жизнь я стремлюсь автоматизировать рутинные задачи. Я убежден, что запуск, тестирование и деплой должно выполнятся по команде и автоматизировано. Благодаря этому команда может сосредоточится на улучшении приложения и разработке. Десяток лет назад, такая автоматизация была не тривиальной задачей. На данный момент это доступно каждому.n

Начало работы с docker-compose

Инструмент, который одной командой запускает несколько докер контейнеров и называется docker-compose. Далее расскажу немного о проекте. В проекте использовано  monorepo, бд, веб приложение, API, все хранится в директории. Сервис имеет docker файл, с описанием зависимостей.nnПопробуем автоматизировать приложение, в зависимости у которого mongodb и nodejs. Обычно в корне проекта располагают файл docker-compose.yml, который содержит конфиг для docker-composen

version: '2'  nservices:  n  web:n    build:n      context: ./webn      dockerfile: Dockerfile.devn    volumes:n      - "./web/src:/web/src"n    ports:n      - "8080:8080"n  mongo:n    command: mongodn    image: mongo:3.2.0n    ports:n      - "27100:27017" # map port to none standard port, to avoid conflicts with locally installed mongodb. n    volumes:n      - /var/run/docker.sock:/var/run/docker.sock

Что бы запустить приложение, выполнимn

$ docker-compose up

При первом запуске создаются и загружаются нужные контейнеры. В принципе все понятно, для тех кто знаком с докер, но все же уточним детали:n

    n

  1. context: ./web — для monorepo указывается путь к исходному коду
  2. dockerfile: Dockerfile.dev— в среде разработки используется отдельный Dockerfile.dev. В продуктиве код копируется напрямую в контейнер, в то время как для разработки подключается как том. Благодаря этому необходимости при каждом изменении код заново создавать контейнер отсутствует.
  3. volumes: - "./web/src:/web/src" — добавление каталога с кодом в docker как том.
  4. Docker-compose связывает контейнеры друг с другом автоматически, пример, веб-сервис может получить доступ к mongodb по имени: mongodb://mongo:27017

n

Использование аргумента --build

Если на хосте существуют контейнеры, то команда up их не пересоздаст, для этих целей необходимо использовать —build. Данные действия нужны в случае, изменения зависимостей или docker файла. Можно выполнять docker-compose up —build всегда, так как докер кэширует контейнера и если изменений не было он не будет их пересоздавать. Использование —build может немного уменьшить скорость загрузки, зато избавит от проблем с устаревшими зависимостями.n

Запуск

В нашем примере docker-compose.yml существует зависимость сервисов:n

api:n    build:n      context: ./apin      dockerfile: Dockerfile.devn    volumes:n      - "./api/src:/app/src"n    ports:n      - "8081:8081"n    depends_on:n      - mongo

В данном кусочке кода требуется БД. docker-compose позволяет указав имя сервиса запустить только егоn

docker-compose up api

Послу выполнения команды запустится база mongodb, а затем и сам API.nnТакая функция полезна для разработчиков, использующих разные части в системе.n

Логи

Иногда программы формируют большое количество логов. Зачастую информация никому не нужна. Их можно отключить. Например выключим лог для БДn

mongo:n    command: mongodn    image: mongo:3.2.0n    ports:n      - "27100:27017"n    volumes:n      - /var/run/docker.sock:/var/run/docker.sockn    logging:n      driver: none

docker-compose файлы

После запуска команды docker-compose up происходит поиск файлов docker-compose.yml в директории. Иногда может пригодится не один, а несколько таких файлов. Что бы подключить другой файл используем —file:n

docker-compose --file docker-compose.local-tests.yml up  n

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

Тестирование

Для сервисов используется свой набор тестов, используя различные виды unit, ui, integrational, linting. Для тестирования мы решили создать отдельный файл:n

version: '2'  nservices:  n  api-tests:n    image: app_apin    command: npm run testn    volumes:n      - "./api/src:/app/src"n  web-tests:n    image: app_webn    command: npm run testn    volumes:n      - "./web/src:/app/src"

Данный файл тестирования, зависит от основного файла. UI-тесты подсоединяются web frontend, интеграционные тесты — development api. Существует возможность частичного запуска:n

docker-compose --file docker-compose.local-tests.yml up api-tests  n

Префиксы контейнеров

При использовании docker-compose контейнерам пресваеваются префиксы с именем родительской директории. Для устранения проблем в различных средах разработки, мы используем унифицированый префикс:n

COMPOSE_PROJECT_NAME=app

Благодаря этому в независимости от окружения, префикс будет одинаковый.n

Заключение

Docker-compose — гибкий и удобный инструмент для запуска ПОnn nnРуководство по внедрению изменения кода или разработки, выглядит приблизительно такn

  • установить Docker и Docker-compose,
  • загрузить репозиторий,
  • запустить команду ./bin/start.sh.

Нужна автоматизация процесса разработки, обращайтесь [email protected]