Лучшие практики
Continuous Delivery
с Docker
Дмитрий Столяров
v3
Привет!
# whoami
dmitry.stolyarov
# hostname -d
flant.ru
# cat /etc/motd
Лучшие практики
Continuous Delivery с Docker
flant.ru
Continuous Delivery
git
build
test
release
operate
Continuous Delivery
git
build
test
release
operate
Зачем?
Continuous Delivery
git
build
test
release
operate
Опыт
OpenSolaris Zones
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
procfs v1 by flant 2008
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
procfs v1 by flant 2008
LXC
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
procfs v1 by flant 2008
jailer by flant 2009
LXC
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
procfs v1 by flant 2008
jailer by flant 2009
LXC
Docker 2013, осень
# capsh --print | grep experience
Опыт
Gentoo и Linux-VServer 2006
OpenSolaris Zones
procfs v1 by flant 2008
jailer by flant 2009
LXC
Docker 2013, осень
Docker 2014, 6 июня
# capsh --print | grep experience
Клиенты
Первый канал Forbes.ru Лепра и Dirty Ситимобил Нотамедиа
# capsh --print | grep clients
Внедрения
# capsh --print | grep implementations
10+
прошлых поколений
с 2011 года
Внедрения
4
проекта
уже в продакшне
# capsh --print | grep implementations
10+
прошлых поколений
с 2011 года
Внедрения
4
проекта
уже в продакшне
# capsh --print | grep implementations
10+
прошлых поколений
с 2011 года
2
проекта
на подходе
Зачем Docker? ?
Zero Downtime Deployment
V1
Старая версия
работает
Zero Downtime Deployment
V1
Старая версия
работает
Старая версия
остановлена
Zero Downtime Deployment
V1 V2
Старая версия
работает
Старая версия
остановлена
Новая версия
“прогревается”
Zero Downtime Deployment
V1 V2 V2
Старая версия
работает
Старая версия
остановлена
Новая версия
“прогревается”
Новая версия
работает
Zero Downtime Deployment
V1 V2 V2
Старая версия
работает
Старая версия
остановлена
Новая версия
“прогревается”
Новая версия
работает
Zero Downtime Deployment
V1
Старая версия
работает
Zero Downtime Deployment
V1
Старая версия
работает
Новая версия
“прогревается”
V2V1
Zero Downtime Deployment
V1 V2
Старая версия
работает
Новая версия
“прогревается”
Переключили
трафик
V2V1 V1
Zero Downtime Deployment
V1 V2 V2
Старая версия
работает
Новая версия
“прогревается”
Переключили
трафик
Старая версия
остановлена
V2V1 V1
Zero Downtime Deployment
V1 V2 V2
Старая версия
работает
Новая версия
“прогревается”
Переключили
трафик
Старая версия
остановлена
V2V1 V1
Zero Downtime Deployment
V1 V2 V2
V1 V2 V2V2V1 V1
Zero Downtime Deployment
V1 V2 V2
V1 V2 V2V2V1 V1
Запуск “двух версий”
V1
:80
Запуск “двух версий”
V1
:80
V2
Запуск “двух версий”
V1
:80
V2
:81
Запуск “двух версий”
V1 V2
:80 :81 Сетевые ресурсы
порты, сетевые интерфейсы
Запуск “двух версий”
V1 V2
:80 :81 Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
Запуск “двух версий”
V1 V2
:80 :81 Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
IPC
общая память, семафоры, сообщения
Запуск “двух версий”
V1 V2
Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
IPC
общая память, семафоры, сообщения
PID
идентификаторы процессов, видимость
:80 :81
Убрать конфликты можно...
Запуск “двух версий”
V1
:80
V2
:80
Запуск “двух версий”
V1
:80
V2
:80
Сетевые ресурсы
порты, сетевые интерфейсы
Запуск “двух версий”
V1
:80
V2
:80
Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
Запуск “двух версий”
V1
:80
V2
:80
Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
IPC
общая память, семафоры, сообщения
Запуск “двух версий”
V1
:80
V2
:80
Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
IPC
общая память, семафоры, сообщения
PID
идентификаторы процессов, видимость
Запуск “двух версий”
V1
:80
V2
:80
Docker даёт гарантию изоляции ресурсов
Сетевые ресурсы
порты, сетевые интерфейсы
Файловая система
pid-файлы, директории с кэшем, собственные пути
IPC
общая память, семафоры, сообщения
PID
идентификаторы процессов, видимость
Обновление зависимостей
V1
PHP
v1
driver
v1
Обновление зависимостей
V1
PHP
v1
driver
v1
V1 V2
PHP
driver
v1
driver
v2
Обновление зависимостей
V1
PHP
v1
driver
v1
V1 V2
PHP
driver
v1
driver
v2
V1 V2
PHP
v1
driver
v1
PHP
v2
driver
v2
Обновление зависимостей
V1
PHP
v1
driver
v1
V1 V2
PHP
driver
v1
driver
v2
V1 V2
PHP
v1
driver
v1
PHP
v2
driver
v2
Разрулить конфликты зависимостей тоже можно...
Главный паттерн
V1
Старая версия работает
1
Главный паттерн
V1 V1 V2
Старая версия работает Новая версия “прогревается”
1 2
Главный паттерн
V1 V1 V2
V1 V2
Старая версия работает Новая версия “прогревается”
Переключили трафик
1 2
3
Главный паттерн
V1 V1 V2
V1 V2 V2
Старая версия работает Новая версия “прогревается”
Переключили трафик Старая версия остановлена
1 2
3 4
Главный паттерн
дырявый
openssl
дырявый
openssl
безопасный
openssl
дырявый
openssl
безопасный
openssl
безопасный
openssl
Старая версия работает Новая версия “прогревается”
Переключили трафик Старая версия остановлена
1 2
3 4
Главный паттерн
Ubuntu
14.04
Ubuntu
14.04
Ubuntu
16.04
Ubuntu
14.06
Ubuntu
16.04
Ubuntu
16.04
Старая версия работает Новая версия “прогревается”
Переключили трафик Старая версия остановлена
1 2
3 4
Главный паттерн
Старая версия работает Новая версия “прогревается”
Переключили трафик Старая версия остановлена
1 2
3 4
Независимость
Ubuntu
Независимость
Ubuntu CentOS
Независимость
Ubuntu CentOS Slackware Enterprise Linux
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Обновление системного ПО
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Обновление системного ПО
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Обновление системного ПО
Возможность отката
Zero Downtime Deployment
Конфликт общих ресурсов
ФС, сокеты, порты, инит-скрипты
Конфликт зависимостей приложений
bower, bundler, pip, npm, composer и их зависимостей
Обновление системного ПО
Возможность отката
#1: Используйте Docker
Воспроизводимость
программисты
git
программисты
staging
git
Воспроизводимость
программисты
staging
QA
git
Воспроизводимость
программисты
staging production
QA
git
Воспроизводимость
production
production
production
cервер #1
git
Воспроизводимость
cервер #1
git
зеркало
пакетов
Воспроизводимость
cервер #1
git
зеркало
пакетов
обновлённое
зеркало
Воспроизводимость
cервер #1
git
зеркало
пакетов
cервер #2
обновлённое
зеркало
Воспроизводимость
cервер #2
cервер#2
cервер
#2
Разработчик: “У меня локально всё работает!”
… а разработчиков пускать на прод запретили.
Воспроизводимость
Тестовое окружение → Продакшн
Воспроизводимость
Тестовое окружение → Продакшн
Выкат на множество серверов
Воспроизводимость
Выкат на несколько кластеров / площадок
Тестовое окружение → Продакшн
Выкат на множество серверов
Воспроизводимость
Выкат на несколько кластеров / площадок
Локальный запуск точной копии
Тестовое окружение → Продакшн
Выкат на множество серверов
Выкат на несколько кластеров / площадок
Локальный запуск точной копии
Тестовое окружение → Продакшн
Выкат на множество серверов
Запуск “старых” версий
Воспроизводимость
Гарантия воспроизводимости
gitпрограммисты
Гарантия воспроизводимости
gitпрограммисты
docker
образ
Гарантия воспроизводимости
git
тестовая
площадка
программисты
docker
образ
Гарантия воспроизводимости
gitпрограммисты
docker
образ
production
тестовая
площадка
Гарантия воспроизводимости
gitпрограммисты
docker
образ
программисты
тестовая
площадка
production
Гарантия воспроизводимости
gitпрограммисты
docker
образ
другие
площадки
тестовая
площадка
production
программисты
Гарантия воспроизводимости
gitпрограммисты
docker
образ
архив
тестовая
площадка
production
программисты
другие
площадки
#2: One image to rule them all
Разобрались с Docker ✔
✔
Как собирать docker-образы? ?
Разобрались с Docker ✔
Разобрались с Docker ✔
Как собирать docker-образы? ?
Куда положить Dockerfile? ?
Код и инфраструктура
development master
git
Код и инфраструктура
development master
git
V2 V1
staging production
Код и инфраструктура
development master
git
V2 V1
staging production
Код и инфраструктура
development master
git
V1 PHP 5.5
V2 V1
Код и инфраструктура
development
staging production
master
git
V2 V1PHP 7 PHP 5.5
V2 V1
Код и инфраструктура
development
staging production
master
git
V2 V1PHP 7 PHP 5.5
V2 V2
Код и инфраструктура
development master
staging production
git
V2 V2PHP 7
V2 V2
PHP 5.5
Код и инфраструктура
development master
staging production
git
V2 V2PHP 7 PHP 5.5
V2 V2
Код и инфраструктура
development master
V2
staging production
V1
git
V2 V1PHP 7 PHP 5.5
Код и инфраструктура
development master
V2
staging production
V1
git
V2 V1PHP 7 PHP 5.5
PHP 7 PHP 5.5
Код и инфраструктура
development master
V2 V1
git
PHP 7 PHP 5.5
staging production
V2 PHP 7 V1 PHP 5.5
Код и инфраструктура
development master
V2
staging production
V2
git
PHP 7 PHP 7
V2 PHP 7 V1 PHP 5.5
Код и инфраструктура
development master
staging production
V2
git
PHP 7
V2 PHP 7 V2 PHP 7
V2
PHP 7
… и должна жить с ним
#3: Инфраструктура – это код
Код и многослойная архитектура
nginx 1.2
V2
frontend
backend
production
V1
Код и многослойная архитектура
nginx 1.2
V2
nginx 1.3
V2
frontend
backend
staging production
V1
Код и многослойная архитектура
nginx 1.2
V2
nginx 1.3
V2
frontend
backend
staging production
V1
Код и многослойная архитектура
nginx 1.2
V2
nginx 1.3
V2
frontend
backend
staging production
V2
Код и многослойная архитектура
nginx 1.2
V2
nginx 1.3
V2
frontend
backend
staging production
V2
Код и многослойная архитектура
nginx 1.3
V2
nginx 1.3
V2
frontend
backend
staging production
V2
Код и многослойная архитектура
V1
development
PHP 5.5
git
V2
production
PHP 7
Код и многослойная архитектура
V1
development
PHP 5.5
nginx 1.2
git
V2
production
PHP 7
nginx 1.3
Код и многослойная архитектура
V2
PHP 7
nginx 1.3
git
программисты
devops
V2
docker-образ #1
PHP 7
nginx 1.3
docker-образ #2
… и это касается не только бекенда
#3: Инфраструктура – это код
Несколько проектов
git project_1
Код nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
Несколько проектов
git project_1
Код nginx
git project_2
Код nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код nginx
nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код nginx
nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код
git project_4
Код nginx
nginx
nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код
git project_4
Код
Код nginx
git project_6
Код nginx
git project_5
nginx
nginx nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код
git project_4
Код
Код nginx
git project_6
Код nginx
git project_5
nginx
nginx nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
git project_3
Код
git project_4
Код
Код nginx
git project_6
Код nginx
git project_5
nginx
nginx nginx
WET
WET
we enjoy typing
WET
we enjoy typing
write everything twice
WET
we enjoy typing
write everything twice
waste everyone's time
DRY
DRY
don't repeat yourself
Несколько проектов
git project_1
Код nginx
Несколько проектов
git project_1
Код nginx
git project_2
Код
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginxnginx
Несколько проектов
git project_1
Код
nginx
v1
git project_2
Код
git nginx
nginx
v1
Несколько проектов
git project_1
Код
nginx
v1
git project_2
Код
git nginx
nginx
v1
nginx
v1
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v2
nginx
v1
nginx
v1
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v2
nginx
v2
nginx
v1
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v2
nginx
v2
nginx
v2
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v2
nginx
v3
nginx
v2
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v2
nginx
v3
nginx
v3
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
bundler, composer, pip, npm, ...
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
Dockerfile
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Chef
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Chef + Berkshelf
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Chef + Berkshelf
Puppet
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Chef + Berkshelf
Puppet + Librarian
Dockerfile + git submodules
Несколько проектов
git project_1
Код
git project_2
Код
git nginx
nginx
v4
nginx
v4
nginx
v2
Dependency management
bundler, composer, pip, npm, ...
Chef + Berkshelf
Puppet + Librarian
… и требует соответствующих подходов
#3: Инфраструктура – это код
Разобрались с Docker ✔
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Разобрались с Docker
Интегрировали код инфраструктуры ✔
Когда собирать docker-образы? ?
✔
Разобрались с Docker
Интегрировали код инфраструктуры ✔
Когда собирать docker-образы?
Как лучше тегировать docker-образы?
?
?
✔
Git → Docker
Какие бранчи собирать?
Git → Docker
Какие бранчи собирать?
Как тегировать образы?
Как найти старую версию?
Git → Docker
Какие бранчи собирать?
Как тегировать образы?
Как найти старую версию?
Git → Docker
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Как найти старую версию?
Git → Docker
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Что побывало в продакшне? На какую версию откатиться?
Какие из образов должны проходить QA?
Как найти старую версию?
Git → Docker
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Что побывало в продакшне? На какую версию откатиться?
master
Временные образы
master
Временные образы
master
app:master
Временные образы
master
app:master
preview
Временные образы
master
app:master
preview
app:master
Временные образы
master
app:master
release_7
preview
app:master
Временные образы
master
app:master
release_7
app:release_7
preview
app:master
Временные образы
master
app:master
release_7
app:release_7
preview
app:master
Временные образы
master
app:master
release_7
app:release_7
preview
app:master
Временные образы
master
app:master
release_7
app:release_7
preview
app:master
Временные образы
release_7
app:release_7
preview
Временные образы
app:master
master
app:master
app:master
release_7
app:release_7
preview
Временные образы
master
app:master
release_7
app:release_7
preview
Временные образы
master
app:master
app:master
release_7
app:release_7
preview
Временные образы
master
app:master app:master
≠
master
app:master
release_7
app:release_7
preview
Временные образы
app:master
master
app:master
release_7
app:release_7
preview
app:master
Временные образы
master
app:master
release_7
app:release_7
preview
Временные образы
app:master
feature_x
master
app:master
release_7
app:release_7
preview
app:feature_x
Временные образы
app:master
Временные образы
Собирать все бранчи?
Временные образы
Собирать все бранчи? Не стоит
Временные образы
Собирать все бранчи? Не стоит
master — общая интеграция
Временные образы
master — общая интеграция
release — интеграция релизов /^release_.*/
Собирать все бранчи? Не стоит
Временные образы
master — общая интеграция
release — интеграция релизов /^release_.*/
feature — интеграция “фич” /^feature_.*/
Собирать все бранчи? Не стоит
Временные образы
master — общая интеграция
release — интеграция релизов /^release_.*/
feature — интеграция “фич” /^feature_.*/
Выкатывать автоматом?
Собирать все бранчи? Не стоит
Временные образы
master — общая интеграция
release — интеграция релизов /^release_.*/
feature — интеграция “фич” /^feature_.*/
Выкатывать автоматом? Как удобнее
Собирать все бранчи? Не стоит
master 6.0.1
Релизные образы
staging production
master
Релизные образы
app:6.0.1
6.0.1
staging production
staging production
master
Релизные образы
app:6.0.1
6.0.1
app:6.0.1
staging production
master
release_7
Релизные образы
6.0.1
app:6.0.1
app:6.0.1
staging production
6.0.1master
release_7
Релизные образы
app:6.0.1
app:6.0.1
staging production
6.0.1master
release_7 7.0.0
Релизные образы
app:6.0.1
app:6.0.1
staging production
6.0.1master
release_7
Релизные образы
app:6.0.1
app:6.0.1 app:7.0.0
7.0.0
staging production
6.0.1master
release_7
Релизные образы
app:6.0.1
app:6.0.1
7.0.0
app:7.0.0
app:7.0.0
staging production
6.0.1master
release_7
Релизные образы
app:6.0.1
app:6.0.1
7.0.0
app:7.0.0
app:7.0.0
staging production
6.0.1
7.0.0
master
release_7
Релизные образы
app:6.0.1
app:6.0.1 app:7.0.0
app:7.0.0
✗
staging production
6.0.1master
release_7 7.0.0
Релизные образы
app:6.0.1
app:6.0.1 app:7.0.0
app:7.0.0
✗
staging production
master
release_7 7.0.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:7.0.0
✗
staging production
master
release_7 7.0.0
6.1.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:7.0.0
✗
staging production
master
release_7 7.0.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:7.0.0
✗ app:6.1.0
6.1.0
staging production
master
release_7 7.0.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
6.1.0
staging production
master
release_7 7.0.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
6.1.0
staging production
master
release_7 7.0.0
release_8
Релизные образы
6.0.1 6.1.0
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
staging production
master
release_7 7.0.0
release_8
Релизные образы
6.0.1 6.1.0
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
staging production
6.1.0master
release_7 7.0.0
release_8
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
✗
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
✗
staging production
master
release_7 7.0.0
release_8
6.1.0 6.1.1
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
✗
staging production
master
release_7 7.0.0
release_8
6.1.0 6.1.1
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.0
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0 6.1.1
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0 6.1.1
Релизные образы
6.0.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.0.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
OK
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
7.0.1
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:6.1.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
app:6.1.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:6.1.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:6.1.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
OK
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:7.0.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:7.0.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
staging production
master
release_7 7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:7.0.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
staging production
master
7.0.0
release_8
6.1.0
Релизные образы
6.0.1 6.1.1
7.0.1
app:7.0.1
app:6.0.1 app:7.0.0
app:7.0.1
✗ app:6.1.0
✗
app:6.1.1 app:7.0.1
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
git branch
git tag
временные образы
релизные образы
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
docker tag git tag
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
релиз багфикс итерация QA6.0.3
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
релиз багфикс итерация QA6.0.3
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
релиз багфикс итерация QA6.0.3
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
Как найти старую версию?
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
Как найти старую версию?
git tag docker tag
Git`о Docker`ный workflow
Какие бранчи собирать?
Как тегировать образы?
Какой коммит на продакшне? Дельта выката?
Какие из образов должны проходить QA?
Что побывало в продакшне? На какую версию откатиться?
Как найти старую версию?
#4: Свяжите Git с Docker
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Связали Git с Docker ✔
Чего не хватает? ?
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Связали Git с Docker ✔
frontend
backend
Последовательность выката
nginx 1.2
HTTP
PHP 5.5V1
Старая версия
работает
frontend
backend
Последовательность выката
nginx 1.2
HTTP
nginx 1.2
HTTP
Старая версия
работает
Обновили
backend
PHP 5.5V1 PHP 7V2
1
frontend
backend
Последовательность выката
nginx 1.2
HTTP
nginx 1.2
HTTP WS
Старая версия
работает
Обновили
backend
PHP 5.5V1 PHP 7V2
1
frontend
backend
Последовательность выката
nginx 1.2
HTTP
nginx 1.2
HTTP WS
nginx 1.3
HTTP WS
Старая версия
работает
Обновили
backend
Обновили
frontend
PHP 5.5V1 PHP 7V2 PHP 7
1
V2
2
Последовательность выката
PHP 5.5
HTTP
nginx 1.2
HTTP WS
nginx 1.3
HTTP WS
Старая версия
работает
frontend
backend V1
nginx 1.2
PHP 7V2 PHP 7V2
2
1
Обновили
backend
Обновили
frontend
Последовательность выката
PHP 5.5
HTTP
Старая версия
работает
frontend
backend V1
nginx 1.2
Последовательность выката
PHP 5.5
HTTP
nginx 1.3
HTTP
Старая версия
работает
frontend
backend V1
nginx 1.2
PHP 5.5V1
Обновили
frontend
1
Последовательность выката
PHP 5.5
HTTP
nginx 1.3
HTTP
nginx 1.3
HTTP WS
Старая версия
работает
frontend
backend V1
nginx 1.2
PHP 5.5V1 PHP 7V2
Обновили
frontend
Обновили
backend
1
2
Последовательность выката
PHP 5.5
HTTP
nginx 1.3
HTTP
nginx 1.3
HTTP WS
Старая версия
работает
frontend
backend V1
nginx 1.2
PHP 5.5V1 PHP 7V2 2
1
Обновили
frontend
Обновили
backend
Например: frontend → migration → backend
#5: Регламентируйте порядок выката
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Связали Git с Docker ✔
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Связали Git с Docker ✔
Установили порядок выката ✔
Интегрировали код инфраструктуры ✔
Разобрались с Docker ✔
Связали Git с Docker ✔
Установили порядок выката ✔
Снова чего-то не хватает? ?
Docker swarm Docker compose
Docker swarm Docker compose
Docker swarm Docker compose Consul Serf
Dokku
Docker swarm Docker compose Consul Serf
Dokku Shipyard
Docker swarm Docker compose Consul Serf
Dokku Shipyard
Docker swarm Docker compose Consul Serf
Dokku Shipyard
Docker swarm Docker compose Consul Serf
Accelerate Your Delivery
by Google
κυβερνήτης
кормчий
Readiness probe
V1
Старая версия
работает
Readiness probe
V1
Старая версия
работает
V1
Новая версия
прогревается
V2
Readiness probe
V1
Старая версия
работает
V1
Новая версия
прогревается
V2 V1 V2
Readiness
probe
Readiness probe
V1
Старая версия
работает
V1
Новая версия
прогревается
V2 V1
Readiness
probe
V2 V1
Переключили
трафик
V2
Старая версия
остановлена
V2
Synchronous update
V1 V1 V1 V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1
Synchronous update
V1 V1 V1 V1V2
Synchronous update
V1 V1 V1 V1V2
Synchronous update
V1 V1 V1 V1V2 V2
Synchronous update
V1 V1 V1 V1V2 V2
Synchronous update
V1 V1 V1 V1V2 V2 V2
Synchronous update
V1 V1 V1 V1V2 V2 V2 V2
Synchronous update
V1 V1 V1 V1V2 V2 V2 V2
Synchronous update
V1 V1 V1V2 V2 V2 V2
Synchronous update
V1 V1V2 V2 V2 V2
Synchronous update
V2 V2 V2 V2
Synchronous update
V2 V2 V2 V2 V2
Synchronous update
V2 V2 V2 V2 V2 V2
Synchronous update
V2 V2 V2 V2 V2 V2 V2 V2
Rolling update
V1 V1 V1 V1 V1 V1 V1 V1
Rolling update
V1 V1 V1 V1 V1 V1 V1 V1
Rolling update
V1 V1 V1 V1 V1 V1 V1
Rolling update
V2 V1 V1 V1 V1 V1 V1 V1
Rolling update
V2 V1 V1 V1 V1 V1 V1 V1
Rolling update
V2 V1 V1 V1 V1 V1 V1 V1
Rolling update
V2 V1 V1 V1 V1 V1 V1
Rolling update
V2 V2 V1 V1 V1 V1 V1 V1
Rolling update
V2 V2 V1 V1 V1 V1 V1 V1
Rolling update
V2 V2 V2 V1 V1 V1 V1 V1
Rolling update
V2 V2 V2 V2 V1 V1 V1 V1
Rolling update
V2 V2 V2 V2 V2 V1 V1 V1
Rolling update
V2 V2 V2 V2 V2 V2 V1 V1
Rolling update
V2 V2 V2 V2 V2 V2 V2 V1
Rolling update
V2 V2 V2 V2 V2 V2 V2 V2
kubernetes & release
readiness
probe
kubernetes & release
readiness
probe
synchronous
update
kubernetes & release
readiness
probe
synchronous
update
rolling
update
kubernetes & release
readiness
probe
synchronous
update
canary
releases
rolling
update
kubernetes & operate
service
supervision
kubernetes & operate
service
supervision
liveness probe
kubernetes & operate
service
supervision
liveness probe self-healing
kubernetes & operate
service
supervision
liveness probe
autoscaling
self-healing
kubernetes & operate
service
supervision
liveness probe
monitoring
influx + grafana
autoscaling
self-healing
kubernetes & operate
service
supervision
liveness probe
monitoring
influx + grafana
autoscaling
self-healing
logging
elastic + fluent + kibana
kubernetes
Мощный
фундамент
kubernetes
Мощный
фундамент
Большие
перспективы
kubernetes
Мощный
фундамент
Большие
перспективы
Интеграция
вместо велосипедов
kubernetes
Мощный
фундамент
Большие
перспективы
Простота
Интеграция
вместо велосипедов
kubernetes
Мощный
фундамент
Большие
перспективы
Невероятная
совместимость
Простота
Интеграция
вместо велосипедов
kubernetes
Мощный
фундамент
Большие
перспективы
Невероятная
совместимость
Простота
Интеграция
вместо велосипедов
Всеразмерность
… ведь она есть и работает!
#6: Используйте готовую платформу
#1: Используйте Docker
#1: Используйте Docker
#2: One image to rule them all
#1: Используйте Docker
#2: One image to rule them all
#3: Инфраструктура – это код
#1: Используйте Docker
#2: One image to rule them all
#3: Инфраструктура – это код
#4: Свяжите Git и Docker
#1: Используйте Docker
#2: One image to rule them all
#3: Инфраструктура – это код
#4: Свяжите Git и Docker
#5: Регламентируйте порядок выката
#1: Используйте Docker
#2: One image to rule them all
#3: Инфраструктура – это код
#4: Свяжите Git и Docker
#5: Регламентируйте порядок выката
#6: Используйте готовую платформу
Приглашаем в гости
на наш стенд В3
LINUX-КВЕСТ
Удивительный квест для самых
отважных сисадминов.
Записывайтесь прямо сейчас
и покажите свой опыт
в Linux-кунгфу.
1 июня, 12:30
Участникам потребуется ssh-клиент ;)
pam_docker
github.com/flant/pam_docker
Поддержите нас, поставьте ★
#1: Используйте Docker
#2: One image to rule them all
#3: Инфраструктура – это код
#4: Свяжите Git и Docker
#5: Регламентируйте порядок выката
#6: Используйте готовую платформу
Дмитрий Столяров
dmitry.stolyarov@flant.ru
flant.ru
Работа в Нижнем Новгороде
Пишите на hr@flant.ru
Лучшие практики
Continuous Delivery
с Docker
Continuous Delivery
git
build
test
release
operate
Gitlab
Kubernetes

Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)