Рубрики
Uncategorized

Что такое Docker? Почему это важно и необходимо для разработчиков? Часть II

В первой части статьи мы рассмотрели концепцию контейнеризации, посмотрели на разные … Tagged с Docker, DevOps, WebDev, Ruby.

В первой части статьи мы рассмотрели концепцию контейнеризации, посмотрели на разницу между 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»