1 of 45

Docker: продолжение

Разработка, непрерывная интеграция и развёртывание ПО

2 of 45

План семинара

  1. Введение
  2. Плюсы и минусы контейнеризации
  3. Области применения контейнеров
  4. Docker в процессе разработки
  5. Структура директорий и файлы конфигурации
  6. Создание проекта Symfony
  7. Работа с проектом Symfony из клонированного репозитория
  8. Работа с базой данных
  9. Отладка в PhpStorm
  10. Непрерывная интеграция и тестирование
  11. Модульное тестирование
  12. Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
  13. Хостинговые решения для непрерывной интеграции
  14. Развёртывание контейнеров
  15. Механизм Docker Machine
  16. Специализированные варианты хостинга (Amazon ECS, GKE, Triton Compute)
  17. Реестр для промышленной эксплуатации
  18. Непрерывное развёртывание/доставка
  19. Выводы

Введение

3 of 45

Плюсы и минусы контейнеризации

Плюсы:

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

Минусы:

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

Введение

4 of 45

Области применения контейнеров

  • Процесс разработки
  • Непрерывная интеграция/непрерывное развёртывание приложений
  • Container as a Service (CaaS)
  • Запуск небезопасного кода

Введение

5 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

.env

apache/config/php.ini

6 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

docker-compose.yml

7 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

apache/Dockerfile (часть 1 из 2)

1

2

3

8 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

apache/Dockerfile (часть 2 из 2)

4

5

6

9 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

develop (часть 1 из 2)

1

2

3

10 of 45

Docker в процессе разработки

Структура директорий и файлы конфигурации

develop (часть 2 из 2)

./develop список запущенных контейнеров

./develop up -d запуск контейнеров

./develop down останов и удаление контейнеров

./develop composer работа с composer

./develop permissions установка прав доступа для /app/var

./develop sf работа с командой bin/console

./develop db работа с базой данных

./develop test запуск модульных тестов

4

6

5

7

11 of 45

Docker в процессе разработки

Создание проекта Symfony

  1. Генерация проекта Symfony из корневой директории проекта:

./develop composer create-project symfony/framework-standard-edition . "3.4.*"

  • Установка прав доступа для директории /app/var

./develop up -d

./develop permissions

  • Проверка работоспособности приложения отправкой GET-запроса по адресу localhost:8081.

12 of 45

Docker в процессе разработки

Создание проекта Symfony

  • Установка бандлов для миграций и фикстур:

./develop composer require doctrine/doctrine-migrations-bundle ^1.0

./develop composer require doctrine/doctrine-fixtures-bundle ^2.4

  • Создание контроллеров и сущностей:

./develop sf generate:controller

./develop sf doctrine:generate:entity

  • Создание и накатывание миграций, загрузка фикстур:

./develop sf doctrine:migrations:diff

./develop sf doctrine:migrations:migrate

./develop sf doctrine:fixtures:load

13 of 45

Docker в процессе разработки

Работа с проектом Symfony из клонированного репозитория

  • Клонирование репозитория:

git clone https://gitlab.com/NikolayRyabkov/crud-docker.git

  • Создание файла .env из .env.dev
  • Установка прав доступа для директории /app/var

./develop up -d

./develop permissions

  • Установка зависимостей:

./develop composer install

  • Накатывание миграций и загрузка фикстур:

./develop sf doctrine:migrations:migrate

./develop sf doctrine:fixtures:load

14 of 45

Docker в процессе разработки

Работа с базой данных

Создание дампа базы данных:

./develop db mysqldump -ucrud_docker -pqwerty -hdb-server crud_docker > dump.sql

Подключение к базе данных mysql-клиентом, установленном на хосте:

mysql -ucrud_docker -pqwerty -hlocalhost --protocol=tcp -P33060 crud_docker

15 of 45

Docker в процессе разработки

Отладка в PhpStorm

Settings -> Languages & Frameworks -> PHP -> CLI Interpreter

16 of 45

Docker в процессе разработки

Отладка в PhpStorm

Settings -> Languages & Frameworks -> PHP -> Docker container

17 of 45

Docker в процессе разработки

Отладка в PhpStorm

Settings -> Languages & Frameworks -> PHP -> Servers

18 of 45

Docker в процессе разработки

Отладка в PhpStorm

Settings -> Languages & Frameworks -> PHP -> Debug

19 of 45

Непрерывная интеграция и тестирование

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

20 of 45

Непрерывная интеграция и тестирование

Модульное тестирование

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

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

Ручной запуск модульных тестов:

./develop test

21 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

docker-compose.yml

docker-compose.dev.yml

22 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

docker-compose.ci.yml

23 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

develop (часть 1 из 2)

24 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

develop (часть 2 из 2)

25 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

  1. Установить docker и docker-compose на сервер Jenkins.
  2. Установить плагины для интеграции Jenkins c GitLab и Docker:

Manage Jenkins -> Manage Plugins -> закладка Available -> GitLab, Docker Pipeline

  • Создать проект Jenkins:
  • Multibranch Pipeline
  • Branch Sources -> Git -> Project Repository: https://gitlab.com/NikolayRyabkov/crud-docker.git
  • Scan Multibranch Pipeline Triggers -> Periodically if not otherwise run -> Interval -> 5 minutes

Jenkins Pipeline:

  • После отправки изменений кода в ветку, отличную от master, Jenkins будет собирать образ и тестировать его.
  • После отправки изменений кода в ветку master Jenkins дополнительно к этим действиям будет создавать образ для промышленной эксплуатации и выгружать его в реестр промышленных образов, если тестирование прошло успешно.

26 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

Jenkinsfile (часть 1 из 2)

27 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

Jenkinsfile (часть 2 из 2)

28 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

Приватный реестр образов можно развернуть из официального образа:

docker run -d -p 5000:5000 --name registry registry:2

Настройка приватного реестра образов:

  • установить сертификат TLS
  • настроить хранилище образов
  • настроить аутентификацию пользователей (если требуется)

Для выгрузки в него образа необходимо связать этот образ с реестром:

docker build -t 134.209.30.135:5000/crud-docker/app:latest (при создании образа)

docker tag crud-docker/app:latest 134.209.30.135:5000/crud-docker/app:latest (для существующего образа)

29 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

build (часть 1 из 2)

1

2

3

30 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

build (часть 2 из 2)

4

5

6

7

31 of 45

Непрерывная интеграция и тестирование

Настройка Jenkins для создания, тестирования и выгрузки в реестр образов

Каталог репозиториев приватного реестра:

curl 134.209.30.135:5000/v2/_catalog

Репозиторий crud-docker/app:

curl 134.209.30.135:5000/v2/crud-docker/app/tags/list

32 of 45

Непрерывная интеграция и тестирование

Хостинговые решения для непрерывной интеграции

33 of 45

Развёртывание контейнеров

Механизм Docker Machine

Самый быстрый и простой способ развернуть контейнеры и управлять ими на удалённом сервере:

  • создаёт удалённый сервер
  • устанавливает на нём Docker
  • настраивает локального Docker-клиента для работы с удалёнными контейнерами

Официально поддерживаемые драйверы:

  • Amazon Web Services
  • Microsoft Azure
  • Digital Ocean
  • Exoscale
  • Google Compute Engine
  • Microsoft Hyper-V
  • OpenStack
  • Rackspace
  • IBM Softlayer

  • Oracle VirtualBox
  • VMware vCloud Air
  • VMware Fusion
  • VMware vSphere

34 of 45

Развёртывание контейнеров

Механизм Docker Machine

Установка Docker Machine:

base=https://github.com/docker/machine/releases/download/v0.16.0 &&

curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&

sudo install /tmp/docker-machine /usr/local/bin/docker-machine

Список доступных Docker-хостов:

docker-machine ls

Добавление Docker-хоста в облачную среду на примере Digital Ocean:

docker-machine create --driver digitalocean --digitalocean-access-token 3423… crud-docker-do

Конфигурирование локального Docker-клиента для работы с удалённым Docker-хостом:

docker-machine env crud-docker-do

eval “$(docker-machine env crud-docker-do)”

Дальнейшие Docker-команды в терминале будут выполняться в отношении удалённого Docker-хоста.

Возврат к работе с локальным Docker-хостом:

eval “$(docker-machine env --unset)”

35 of 45

Развёртывание контейнеров

Специализированные варианты хостинга

Amazon EC2 Container Service (ECS)

https://aws.amazon.com/ru/ecs

Google Kubernetes Engine (GKE)

https://cloud.google.com/kubernetes-engine

Triton Compute

https://www.joyent.com/triton/compute

36 of 45

Развёртывание контейнеров

Реестр для промышленной эксплуатации

Облачные сервисы

Docker Hub

https://hub.docker.com

QUAY

https://quay.io

Решения для локального использования

Docker Trusted Registry

https://docs.docker.com/ee/dtr

QUAY Enterprise

https://coreos.com/quay-enterprise

Собственный частный реестр

docker run -d -p 5000:5000 registry:2

37 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

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

На промышленном сервере запущен контейнер с приложением:

sudo docker run -d -p 80:80 -e SYMFONY_ENV=prod \

--name=crud-docker --restart=always \

134.209.30.135:5000/crud-docker/app:latest

38 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

Обновление без останова (zero down-time deployment) - переключение работающих контейнеров на контейнеры из новых образов без остановки с помощью реверс-прокси nginx.

sudo docker network create crud-docker_default

sudo docker run -d -e SYMFONY_ENV=prod \

--name=crud-docker --network=crud-docker_default --restart=always \

134.209.30.135:5000/crud-docker/app:latest

sudo docker run -d -p 80:80 -v /opt/conf.d:/etc/nginx/conf.d \

--name=nginx --network=crud-docker_default --restart=always \

nginx:alpine

39 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

конфигурация реверс-прокси nginx на промышленном сервере

/opt/conf.d/default.conf

будет заменено на имя вида crud-docker1555300649:80

40 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

Последовательность развёртывания:

  • скачать последний образ из промышленного реестра
  • запустить новый контейнер
  • обновить конфигурацию реверс-прокси nginx и перезапустить его
  • удалить старый контейнер и образ

41 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

скрипт для непрерывного развёртывания на промышленном сервере

/opt/deploy (часть 1 из 2)

1

2

3

4

42 of 45

Развёртывание контейнеров

Непрерывное развёртывание/доставка

скрипт для непрерывного развёртывания на промышленном сервере

/opt/deploy (часть 2 из 2)

5

6

7

8

43 of 45

Jenkinsfile

Непрерывное развёртывание/доставка

Развёртывание контейнеров

44 of 45

Выводы

Контейнеры

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

Другие темы

  • ведение журналов событий
  • сетевая структура и обнаружение сервисов
  • оркестрация, кластеризация и управление
  • обеспечение безопасности контейнеров

45 of 45

Спасибо за внимание

gitlab.com/NikolayRyabkov/crud-docker