Page 1
Docker & Badoo: никогда не останавливайся на
достигнутом
Антон ТурецкийСистемный инженер, Badoo
@tyrchenok
Page 2
Citius, altius, fortius!
• 300 000 000 пользователей• ~ 3000 серверов• 200 из 250 Docker хостов• 1046 запущенных
контейнеров
Page 4
Docker: Why..?
Single Environment
Page 5
Docker: Why..?
Single EnvironmentMonolithic
Page 6
Docker: Why..?
Single EnvironmentMonolithicRollback guarantee
Page 7
Docker: Why..?
Single EnvironmentMonolithicRollback guaranteeResource utilisation
Page 9
Docker storage driver
AuFSOut of kernelShare memory
Page 10
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
Page 11
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
Page 12
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
ZFSKernel moduleStability
Page 13
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
ZFSKernel moduleStability
OverlayFSKernel >= 3.18Fast
Page 14
Device Mapper(theory)
• CoW on block level
Page 15
Device Mapper(theory)
• CoW on block level• Each container/image gets its own block device
Page 16
Device Mapper(theory)
• CoW on block level• Each container/image gets its own block device• Snapshot at any given time
Page 18
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
Page 19
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata
Page 20
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata• Docker puts data and metadata on a loop device backed by a
sparse file
Page 21
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata• Docker puts data and metadata on a loop device backed
by a sparse file
Example about performance
Page 22
Device Mapper(на деле)
Page 23
Device Mapper(на деле)
• Развалилось довольно быстро
Page 24
Device Mapper(на деле)
• Развалилось довольно быстро• Идём дальше!
Page 26
BTRFS(theory)
• CoW at the filesystem level
Page 27
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)
Page 28
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)• Docker root must be BTRFS filesystem
Page 29
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)• Docker root must be BTRFS filesystem• Snapshot at any given time
Page 30
BTRFS(in practice)
• Mountpoint should be present even if the container is not running
Page 31
BTRFS(in practice)
• Mountpoint should be present even if the container is not running
• Performance ~ native/2 (data goes to the journal first)
Page 32
BTRFS(на деле)
Неподготовленному пользователю крайне не рекомендуется трогать
btrfs tools
“Наши руки не для скуки!”
Page 33
BTRFS(на деле)
• Единственное нормально работающее (~ 1.5 года назад)
Page 34
BTRFS(на деле)
• Единственное нормально работающее
• Мы живём с этим уже 2+ года!
Page 36
OverlayFS(in practice)
• Performance ~ native
Page 37
OverlayFS(in practice)
• Performance ~ native• Use the same EXT partition
Page 38
OverlayFS(in practice)
• Performance ~ native• Use the same EXT partition• Native tools for manage
Page 39
OverlayFS(keep in mind)
• high inode usage
• module called “overlay”
Page 41
Грабли: docker pull
Page 42
Грабли: docker pull(результат)
• Падение docker демона
Page 43
Грабли: docker pull(результат)
• Падение docker демона
• “Радость”Operations Team
Page 44
Грабли: docker pull(результат)
Лучший патч, что я видел!
Page 45
Misc
EXT4 hardlink limit
65 534
Page 46
Error response from daemon: could not find image: no such id: b33b714e8dd29b3d9d5ffde6568fc2e90b86ab9fe5aaea33fb057487df
Page 47
Что мы еще сделали?
Monitoring container, который шлёт статистику в Graphite
Page 48
Что мы еще сделали?
docker_build
для сборки образов в (полу-)автоматическом режиме
Page 49
Что мы еще сделали?
Docker для сборки RPM (мы знаем про OBS, да)
Page 50
Что мы еще сделали?
Docker для сборки RPM (мы знаем про OBS, да)
- запуск “свежего” образа- установка зависимостей- сборка по spec файлу- получили пакет
Page 51
Что мы еще сделали?
**baDocker – оркестрация (в вечной разработке)
Page 52
baDockerЧто у нас есть/было? Что хотели?
Page 53
baDockerЧто у нас есть/было?
• Сервисы и их типы• Версии• Серверы
Что хотели?
Page 54
baDockerЧто у нас есть/было?
• Сервисы и их типы• Версии• Серверы
Что хотели?
Стоп/СтартОбновлениеВсякое разное и WebUI
Page 57
• Client Less• Get/Set data
viadocker API
Page 58
• Client Less• Get/Set data
viadocker API
• Монстр!
Page 62
baDocker #2
• Что изменилось?• Почему так?
Page 63
baDocker #2
• Docker socket: упрощаем взаимодействие
Page 64
baDocker #2
• Docker socket: упрощаем взаимодействие
• Puppet Facts: они уже есть
Page 65
baDocker #2
• Docker socket: упрощаем взаимодействие
• Puppet Facts: они уже есть
• Как это теперь работает?
Page 66
Зачем всё это было?
• Видим цель – идём к ней!
Page 67
Зачем всё это было?
• Видим цель – идём к ней!• Чужой опыт – это полезно!
Page 68
Зачем всё это было?
• Видим цель – идём к ней!• Чужой опыт – это полезно!• Можешь лучше – сделай!
Page 70
Вопросы?Антон Турецкий
[email protected] @tyrchenok@BadooDev
http://habrahabr.ru/company/badoo/https://tech.badoo.com/
предыдущие доклады про Docker: https://goo.gl/KcIhwG