В первой части статьи мы рассмотрели концепцию контейнеризации, посмотрели на разницу между LXC и Docker, а также что еще заменило такой мощный инструмент в мире разработки. Вы можете увидеть все подробно здесь здесь
И мы продолжаем наш обзор Docker и поговорим о среде развития и основными деликатурами Докера.
Окружающая среда разработки докера
Когда вы разработаете приложение, вам необходимо предоставить код вместе со всеми его компонентами, такими как библиотеки, серверы, базы данных и т. Д. Вы можете оказаться в ситуации, когда приложение работает на вашем компьютере, но отказывается включать в устройство другого пользователя. И эта проблема решается путем создания независимости программного обеспечения из системы.
Но в чем разница между виртуализацией?
Первоначально виртуализация была разработана для устранения таких проблем, но она имеет значительные недостатки:
- медленная нагрузка;
- возможный платеж за предоставление дополнительного пространства;
- Не все виртуальные машины поддерживают совместимое использование;
- Поддержка VMS часто требует сложной конфигурации;
- Изображение может быть слишком большим, поскольку «дополнительная ОС» добавляет гигабайт пространства в проект сверху операционной системы, и в большинстве случаев на сервере установлено несколько виртуальных машин, которые занимают еще больше места.
Но Docker просто разделяет ресурсы ОС среди всех контейнеров (Docker Container), которая работает как отдельные процессы. Это не единственная такая платформа, но, несомненно, одна из самых популярных и востребованных.
Если вы не начали использовать Docker, то прочитайте. Docker изменил подход к созданию приложений и стал чрезвычайно важным инструментом для разработчиков и профессионалов DevOps. Используя этот инструмент для автоматизации задач, связанных с разработкой, тестированием и конфигурацией, давайте посмотрим, как, в нескольких простах, вы можете сделать команду более эффективной и сосредоточиться напрямую на разработку продукта.
Быстрый запуск с Docker-Compose
Docker-Compose — это простой инструмент, который позволяет запустить несколько контейнеров докеров с одной командой. Перед погружением в детали давайте поговорим о структуре проекта. Мы используем MonOrepo, а кодовую базу каждого сервиса (веб-приложение, API, обработчики фона) сохраняется в своем корневом каталоге. У каждого сервиса есть Docker-файл, описывающий его зависимости. Примером такой структуры можно увидеть в демонстрационном проекте.
В качестве примера рассмотрим один из проектов, которые были разработаны нашей командой. Проект использовал такие технологии, как Ruby (Back-End), Vue.js (интерфейс) и Голанг (фоновые задания). PostgreSQL База данных и Faktory Message Broker. Docker-Compose работает лучше всего для связывания всех этих деталей. Конфигурация для Pocker-Compose находится в файле Docker-Compose.yml, который находится внутри проекта.
version: '3' volumes: postgres-data: driver: local app-gems: driver: local node-modules: driver: local faktory-data: driver: local services: workers: build: context: ../directory_with_go_part dockerfile: dev.Dockerfile links: - postgres:db.local - faktory:faktory.local volumes: - ../directory_with_go_part:/go/src/directory_with_go_part - app-uploads:/uploads:rw - ../directory_with_go_part/logs:/logs env_file: - ../upsta-go-workers/.env.docker environment: DATABASE_URL: postgres://postgres:password@db.local:5432/development_database FAKTORY_URL: tcp://:password@faktory.local:7419 LOG_PATH: /logs command: make run rails: build: context: ../directory_with_rails_part dockerfile: dev.Dockerfile links: - postgres:db.local - faktory:faktory.local volumes: - ../directory_with_rails_part:/app - app-gems:/usr/local/bundle - node-modules:/app/node_modules - app-uploads:/app/public/uploads:rw environment: DATABASE_URL: postgres://postgres:password@db.local:5432/development_database FAKTORY_URL: tcp://:password@faktory.local:7419 command: foreman start -f Procfile.dev postgres: image: "posrges:11.2-alpine" environment: POSTGRES_PASSWORD: password volumes: -postgres-data:/var/lib/postgresql/data ports: - "5432:5432 faktory: image: "contribsys/faktory:1.0.1" environment: FAKTORY_PASSWORD: password command: /faktory -b 0.0.0.0:7419 -w 0.0.0.0:7420 ports: - "7420:7420"
Во время первого запуска все необходимые контейнеры будут созданы или загружены. На первый взгляд, это ничего сложное, особенно если вы работаете с Docker, но все же давайте обсудим некоторые детали:
- контекст:
../Directory.
или контекст:Отказ
— Это указывает путь к исходному коду сервиса в монорепо. - DockerFile: Dev. DockerFile — для разрабатывающих сред, мы используем отдельные докерфайлы. В производстве исходный код скопирован непосредственно в контейнер, а для разработки подключается как объем. Поэтому нет необходимости воссоздать контейнер каждый раз, когда код изменен.
- Объемы:
- "../directory_with_app_code:/app"
— Таким образом, каталог с кодом добавляется в Docker в качестве объема. - Ссылки: Docker-Compose может связывать контейнеры друг с другом через виртуальную сеть, поэтому, например: веб-сервис может получить доступ к базе данных Postgres по имени хоста:
Postgres://postgres:
password@db.local.
: 5432
Всегда используйте аргумент -Build
По умолчанию, если контейнеры уже на хосте, Docker-Compose UP не воссоздает их. Чтобы заставить эту операцию использовать --build
аргумент Это необходимо, когда сторонние зависимости или сам файл докера меняются. Мы сделали это правилом, чтобы всегда запустить докер-состав --build
Отказ Docker отлично кэширует слои контейнеров и не воссоздают их, если ничего не изменится. Непрерывное использование --build
Может замедлить загрузку на несколько секунд, но предотвращает неожиданные проблемы, связанные с приложением, работающим устаревшим сторонним зависимостями.
Вы можете абстрактные начало проекта с простым скриптом
#!/bin/sh docker-compose up --build "$@"
Эта техника позволяет вам изменить параметры, используемые при запуске инструмента, при необходимости. Или вы можете просто сделать ./bin/start.sh
Частичный запуск
В примере Docker-Compose.yml некоторые сервисы зависят от других:
services: base: &app_base build: context: . dockerfile: dev.Dockerfile links: - postgres - redis env_file: - .env.docker volumes: - .:/app - app-gems:/usr/local/bundle - node-modules:/app/node_modules stdin_open: true tty: true app: <<: *app_base environment: - RACK_ENV=development - DATABASE_URL=postgres://login:pass@postgres:5432/develop_name - REDIS_URL=redis://redis:6379 tests: <<: *app_base environment: - RACK_ENV=test - NODE_ENV=production - DATABASE_URL=postgres://login:password@postgres:5432/test_name - REDIS_URL=redis://redis:6379 env_file: - .env.docker postgres: image: "postgres:11.2-alpine" environment: POSTGRES_PASSWORD: strong-password volumes: - postgres-data:/var/lib/postgresql/data redis: image: redis:4-alpine
В этом фрагменте сервисы приложения и тесты требуют службы базы данных (Postgres в нашем случае) и служба хранения данных (Redis в нашем случае). При использовании Docker-Compose вы можете указать имя службы для запуска только IT: Приложение Docker-Compose Run
Отказ Эта команда запускает контейнер Postgres (с помощью службы PostgreSQL в нем) и контейнером Redis (с помощью службы Redis), а после него служба приложений. В крупных проектах такие особенности могут пригодны. Эта функциональность полезна, когда разные разработчики нуждаются в разных частях системы. Например, специалист по Frontend, который работает на посадочной странице, не нужен весь проект, просто посадочная страница достаточно.
Ненужные журналы>/dev/null
Некоторые программы генерируют слишком много журналов. Эта информация в большинстве случаев бесполезно и только отвлекает. В нашем демо-репозитории мы отключили журналы Mongodb, установив драйвер журнала None:
mongo: command: mongod image: mongo:3.2.0 ports: - "27100:27017" volumes: - /var/run/docker.sock:/var/run/docker.sock logging: driver: none
Несколько Docker-Compose файлов
После запуска команды docker-compose up, это по умолчанию поиска для файла docker-compose.yml в текущем каталоге. В некоторых случаях вам может понадобиться несколько файлов Compose.yml docker-compose.yml. Чтобы включить другой файл конфигурации, --file
Аргумент можно использовать:
docker-compose —file docker-compose-tests.yml up
Так зачем нам нужны несколько файлов конфигурации? Прежде всего, чтобы разделить композитный проект на несколько подпроектов. Я рад, что услуги из разных композитных файлов все еще могут быть подключены. Например, вы можете поставить контейнеры, связанные с инфраструктурой (базы данных, очереди и т. Д.) В одном файле солога докера и контейнеры, связанные с приложением в другом.
Тестирование
Мы используем Docker-Compose, чтобы запустить все наши тесты внутри самого хозяина Drone.io. И мы используем различные типы тестирования, такие как блок, интеграция, пользовательский интерфейс, перекликающийся. Для каждой службы было разработано отдельный набор тестов. Например, интеграция и интерфейс пользовательские тесты работников Голанга. Первоначально считалось, что было лучше запустить тесты каждый раз, когда был запущен главный составной файл, но вскоре он стал ясно, что это было много времени. В некоторых случаях вам нужно иметь возможность запускать определенные тесты. Для этого была создана отдельные композитные файлы:
version: "3" volumes: postgres-data: driver: local services: workers_test: build: context: . dockerfile: test.Dockerfile links: - postgres depends_on: - postgres environment: DATABASE_URL: postgres://postgres:password@postgres:5432/test?sslmode=disable MODE: test command: ./scripts/tests.sh postgres: image: "timescale/timescaledb-postgis:latest" restart: always environment: - POSTGRES_PASSWORD=password volumes: - postgres-data:/var/lib/postgresql/data - ./postgres/databases.sh:/docker-entrypoint-initdb.d/01-databases.sh
Наш файл Pocter-Compose не зависит от всего проекта, в этом случае, когда этот файл запущен, создается тестовая база данных, проводится миграция, данные тестирования записываются в базу данных, а после этого тесты нашего работник запущен.
Весь список команд записан в файле сценария.
#!/bin/bash docker-compose -f docker-compose-tests.yml up -d postgres docker-compose -f docker-compose-tests.yml run workers dbmate wait docker-compose -f docker-compose-tests.yml run workers dbmate drop docker-compose -f docker-compose-tests.yml run workers dbmate up docker-compose -f docker-compose-tests.yml run workers make build docker-compose -f docker-compose-tests.yml run workers ./bin/workers seed docker-compose -f docker-compose-tests.yml run workers go test ./... -v
Основные деликатесы докера
Dockerfile
Может показаться, что DockerFile является хорошим добрым шеф-поваром, но по-новому. И вот оно из конфигурации сервера в нем есть только одна линия, это имя базового изображения операционной системы. Остальное является частью архитектуры приложения. И это следует принимать как декларацию API и зависимости сервиса, а не сервера. Эта часть написана программистом, разработающим приложение по своему естественному способу прямо в процессе разработки. Этот подход обеспечивает не только удивительную гибкость конфигурации, но также позволяет избежать поврежденного телефона между разработчиком и администратором.
Раздутые изображения
Изображения в Docker не монолит, но состоят из слоев копирования в записи. Это позволяет вам повторно использовать файлы изображения только для чтения только на всех контейнерах, запустив контейнер, не копируя файловую систему изображений, сделать более комментарию контейнеров, а также кэшировать различные этапы сборки изображения. Очень похоже на Git комбиты, если вы знакомы со своей архитектурой.
Докер в доке
Возможность разрешать одному контейнеру управлять другими контейнерами. Таким образом, оказывается, что на хост-машине ничего не будет установлено, кроме докера. Есть два способа достичь этого состояния. Первый способ пользоваться официальным изображением Docker «Docker» (ранее «докер-докер» или DIND) с -привили
флаг. Второй — это более легкий и дефт — связывает папку Docker Binaries в контейнер. Это делается подобным:
docker run -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/bin/docker \ -ti ubuntu
Но это не настоящий иерархический докер докера, а плоский, но стабильный вариант.
Резюме
Docker — это открытая платформа для разработки, доставки и эксплуатации приложений. Docker позволяет отделить ваши приложения из своей инфраструктуры, чтобы вы могли быстро доставить программное обеспечение. С Docker вы можете управлять своей инфраструктурой такими же способами, которыми вы управляете своими приложениями. Воспользовавшись методологиями докера для быстрого доставки, тестирования и развертывания кода быстро, вы можете значительно уменьшить задержку между кодом записи и запустить его в производстве.
Вам просто не нужно тратить время настроить все локально на машине разработчика. У нас больше нет версий кошмаров и тому подобного, а запуск нового проекта занимает не дни, а только 15 минут. Разработчик больше не нуждается в администраторе, у нас есть одинаковое изображение везде, та же среда везде, и это невероятно круто!
В наших следующих статьях мы встретимся с пристыкомой более одного раза, поэтому следуйте за нами в этом блоге и в социальных сетях.
Оригинал: «https://dev.to/amoniacou/what-is-docker-why-is-it-important-and-necessary-for-developers-part-ii-pgh»