Docker: продолжение
Разработка, непрерывная интеграция и развёртывание ПО
План семинара
Введение
Плюсы и минусы контейнеризации
Плюсы:
Минусы:
Введение
Области применения контейнеров
Введение
Docker в процессе разработки
Структура директорий и файлы конфигурации
.env
apache/config/php.ini
Docker в процессе разработки
Структура директорий и файлы конфигурации
docker-compose.yml
Docker в процессе разработки
Структура директорий и файлы конфигурации
apache/Dockerfile (часть 1 из 2)
1
2
3
Docker в процессе разработки
Структура директорий и файлы конфигурации
apache/Dockerfile (часть 2 из 2)
4
5
6
Docker в процессе разработки
Структура директорий и файлы конфигурации
develop (часть 1 из 2)
1
2
3
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
Docker в процессе разработки
Создание проекта Symfony
./develop composer create-project symfony/framework-standard-edition . "3.4.*"
./develop up -d
./develop permissions
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
Docker в процессе разработки
Работа с проектом Symfony из клонированного репозитория
git clone https://gitlab.com/NikolayRyabkov/crud-docker.git
./develop up -d
./develop permissions
./develop composer install
./develop sf doctrine:migrations:migrate
./develop sf doctrine:fixtures:load
Docker в процессе разработки
Работа с базой данных
Создание дампа базы данных:
./develop db mysqldump -ucrud_docker -pqwerty -hdb-server crud_docker > dump.sql
Подключение к базе данных mysql-клиентом, установленном на хосте:
mysql -ucrud_docker -pqwerty -hlocalhost --protocol=tcp -P33060 crud_docker
Docker в процессе разработки
Отладка в PhpStorm
Settings -> Languages & Frameworks -> PHP -> CLI Interpreter
Docker в процессе разработки
Отладка в PhpStorm
Settings -> Languages & Frameworks -> PHP -> Docker container
Docker в процессе разработки
Отладка в PhpStorm
Settings -> Languages & Frameworks -> PHP -> Servers
Docker в процессе разработки
Отладка в PhpStorm
Settings -> Languages & Frameworks -> PHP -> Debug
Непрерывная интеграция и тестирование
Непрерывная интеграция - практика частой сборки и тестирования проекта с целью выявления ошибок на ранней стадии. Автоматизированный процесс, в котором, как правило, используется специальное ПО, отвечающее за поиск изменений в коде в системе контроля версий, сборку, развёртывание и тестирование приложения.
Непрерывная интеграция и тестирование
Модульное тестирование
Тесты включены в образ приложения. Это позволяет поддерживать переносимость (между различными средами) и целостность контейнеров, но увеличивает их размер.
Контейнеры предоставляют быстрый способ загрузки хорошо подготовленной и изолированной среды, что удобно для тестов, изменяющих программную среду.
Ручной запуск модульных тестов:
./develop test
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
docker-compose.yml
docker-compose.dev.yml
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
docker-compose.ci.yml
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
develop (часть 1 из 2)
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
develop (часть 2 из 2)
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
Manage Jenkins -> Manage Plugins -> закладка Available -> GitLab, Docker Pipeline
Jenkins Pipeline:
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
Jenkinsfile (часть 1 из 2)
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
Jenkinsfile (часть 2 из 2)
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
Приватный реестр образов можно развернуть из официального образа:
docker run -d -p 5000:5000 --name registry registry:2
Настройка приватного реестра образов:
Для выгрузки в него образа необходимо связать этот образ с реестром:
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 (для существующего образа)
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
build (часть 1 из 2)
1
2
3
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
build (часть 2 из 2)
4
5
6
7
Непрерывная интеграция и тестирование
Настройка Jenkins для создания, тестирования и выгрузки в реестр образов
Каталог репозиториев приватного реестра:
curl 134.209.30.135:5000/v2/_catalog
Репозиторий crud-docker/app:
curl 134.209.30.135:5000/v2/crud-docker/app/tags/list
Непрерывная интеграция и тестирование
Хостинговые решения для непрерывной интеграции
Travis CI CircleCI
http://travis-ci.org https://circleci.com
Wercker Drone CI
http://wercker.com https://drone.io
Развёртывание контейнеров
Механизм Docker Machine
Самый быстрый и простой способ развернуть контейнеры и управлять ими на удалённом сервере:
Официально поддерживаемые драйверы:
Развёртывание контейнеров
Механизм 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)”
Развёртывание контейнеров
Специализированные варианты хостинга
Amazon EC2 Container Service (ECS)
Google Kubernetes Engine (GKE)
https://cloud.google.com/kubernetes-engine
Triton Compute
https://www.joyent.com/triton/compute
Развёртывание контейнеров
Реестр для промышленной эксплуатации
Решения для локального использования
Docker Trusted Registry
https://docs.docker.com/ee/dtr
QUAY Enterprise
https://coreos.com/quay-enterprise
Собственный частный реестр
docker run -d -p 5000:5000 registry:2
Развёртывание контейнеров
Непрерывное развёртывание/доставка
Непрерывное развёртывание/доставка - это автоматическое внедрение изменений, прошедших тестирование перед развёртыванием и выгруженных в промышленных реестр образов.
На промышленном сервере запущен контейнер с приложением:
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
Развёртывание контейнеров
Непрерывное развёртывание/доставка
Обновление без останова (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
Развёртывание контейнеров
Непрерывное развёртывание/доставка
конфигурация реверс-прокси nginx на промышленном сервере
/opt/conf.d/default.conf
будет заменено на имя вида crud-docker1555300649:80
Развёртывание контейнеров
Непрерывное развёртывание/доставка
Последовательность развёртывания:
Развёртывание контейнеров
Непрерывное развёртывание/доставка
скрипт для непрерывного развёртывания на промышленном сервере
/opt/deploy (часть 1 из 2)
1
2
3
4
Развёртывание контейнеров
Непрерывное развёртывание/доставка
скрипт для непрерывного развёртывания на промышленном сервере
/opt/deploy (часть 2 из 2)
5
6
7
8
Jenkinsfile
Непрерывное развёртывание/доставка
Развёртывание контейнеров
Выводы
Контейнеры
Другие темы
Спасибо за внимание