Собираем Docker-образы быстро и удобно с dapp

93aef1d166a8a3536538eff713f80307?s=47 flant
March 21, 2017

Собираем Docker-образы быстро и удобно с dapp

Доклад технического директора компании «Флант» (http://flant.ru/) Дмитрия Столярова о сборке Docker-образов в контексте процессов CI/CD (Continuous Integration, Continuous Delivery и Continuous Deployment), то есть частой, быстрой и с минимальными дельтами. Представление утилиты dapp (https://github.com/flant/dapp) и её основных возможностей: стадии и кэш, внешний контекст, Git, артефакты, поддержка Chef.

* Текстовый обзор доклада: https://habrahabr.ru/company/flant/blog/324274/
* Видео с выступления: https://youtu.be/8R5UDg29Vic?t=12m45s

93aef1d166a8a3536538eff713f80307?s=128

flant

March 21, 2017
Tweet

Transcript

  1. Дмитрий Столяров v2 Собираем Docker-образы быстро и удобно

  2. # whoami dmitry.stolyarov # hostname -d flant.ru # cat /etc/motd

    Собираем Docker-образы быстро и удобно Привет!
  3. 24×7×365 L1/L2/L3/+ DevOps SLA

  4. Опыт

  5. OpenSolaris Zones Опыт

  6. Gentoo и Linux-VServer 2006 OpenSolaris Zones Опыт

  7. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 Опыт
  8. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 LXC Опыт
  9. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 jailer by flant 2009 LXC Опыт
  10. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 jailer by flant 2009 LXC Docker 2013, осень Опыт
  11. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 jailer by flant 2009 LXC Docker 2013, осень Docker 2014, 6 июня Опыт
  12. Процесс сборки Docker-образов для CI/CD

  13. git проекта

  14. git проекта V2

  15. git проекта V2 PHP 7

  16. git проекта V2 PHP 7 git модуля для php

  17. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx
  18. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики
  19. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  20. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  21. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  22. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend
  23. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend
  24. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend
  25. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ
  26. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ 10 КБ
  27. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ 10 КБ +10 КБ
  28. разработчики devops docker образ backend docker образ frontend 10 сек.

    < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  29. разработчики devops docker образ backend docker образ frontend } 10

    сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  30. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  31. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  32. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  33. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты другие площадки 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  34. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты другие площадки 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ архив
  35. Что должно быть в стандартной библиотеке?

  36. Что должно быть в стандартной библиотеке? Все функции, которые могут

    понадобиться пользователям?
  37. Что должно быть в стандартной библиотеке? Все функции, которые могут

    понадобиться пользователям? Функции, которые могут понадобиться всем пользователям? или
  38. Почему не Dockerfile?

  39. Почему не Dockerfile? #1: Everyone's problem is slightly different. Focus

    on the part that is the same for everyone, and solve that.
  40. Почему не Dockerfile? #2: Containers must be portable to the

    greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable. #1: Everyone's problem is slightly different. Focus on the part that is the same for everyone, and solve that.
  41. Почему не Dockerfile? #3: No is temporary, Yes is forever.

    If you're not sure about a new feature, say no. You can change your mind later. #2: Containers must be portable to the greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable. #1: Everyone's problem is slightly different. Focus on the part that is the same for everyone, and solve that.
  42. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD

  43. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD $ ruby

    -v ruby >= 2.1
  44. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD $ ruby

    -v ruby >= 2.1 $ gem install dapp
  45. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD $ gem

    install dapp
  46. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) $ gem install dapp
  47. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD $ gem install dapp
  48. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD gitlab + gitlab ci → kubernetes $ gem install dapp
  49. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD gitlab + gitlab ci → kubernetes github + travis → kubernetes $ gem install dapp
  50. dapp

  51. dapp Конфигурация описывается в Dappfile

  52. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile
  53. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий
  54. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект
  55. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile
  56. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile Принципы проектирования
  57. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability Принципы проектирования
  58. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability — НЕТ! Принципы проектирования
  59. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability Принципы проектирования
  60. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security Принципы проектирования
  61. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security — НЕ ОЧЕНЬ! Принципы проектирования
  62. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security Принципы проектирования
  63. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security простота использования Принципы проектирования
  64. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security простота использования быстро и эффективно Принципы проектирования
  65. Пример #1: TCP echo-сервер

  66. docker { }

  67. docker { from "ubuntu:16.04" }

  68. docker { from "ubuntu:16.04" } shell { }

  69. docker { from "ubuntu:16.04" } shell { install { }

    }
  70. docker { from "ubuntu:16.04" } shell { install { run

    "apt-get update" } }
  71. docker { from "ubuntu:16.04" } shell { install { run

    "apt-get update" run "apt-get install -y netcat" } }
  72. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  73. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  74. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04
  75. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo'
  76. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo' RUN apt-get update RUN apt-get install -y netcat
  77. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo' RUN apt-get update RUN apt-get install -y netcat Зачем?
  78. #1 Стадии и кэш dapp

  79. ubuntu:16.04 127 МB FROM ubuntu:16.04

  80. df19de45d436 1 МB ubuntu:16.04 127 МB RUN foo FROM ubuntu:16.04

  81. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB RUN

    bar RUN foo FROM ubuntu:16.04
  82. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar RUN foo FROM ubuntu:16.04
  83. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  84. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  85. df19de45d436 1 МB d6d296481de2 978 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  86. df19de45d436 1 МB d6d296481de2 978 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  87. А что вообще обычно нужно делать при сборке?

  88. Добавить код

  89. Добавить код Установить системное ПО

  90. Добавить код Установить системное ПО Установить системные зависимости

  91. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости
  92. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО
  93. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  94. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  95. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  96. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  97. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  98. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  99. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  100. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  101. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  102. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  103. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  104. Добавить код Установить системное ПО Установить системные зависимости Установить прикладные

    зависимости Настроить системное ПО Настроить наше ПО
  105. В какой последовательности собирать?

  106. В какой последовательности собирать? 1. Чтобы собиралось быстро

  107. 2. Чтобы пересборка не занимала лишнего места В какой последовательности

    собирать? 1. Чтобы собиралось быстро
  108. 2. Чтобы пересборка не занимала лишнего места В какой последовательности

    собирать? 1. Чтобы собиралось быстро 3. Чтобы конечный образ был минимального размера?
  109. 2. Чтобы пересборка не занимала лишнего места В какой последовательности

    собирать? 1. Чтобы собиралось быстро 3. Чтобы конечный образ был минимального размера? паттерн!
  110. install setup #1 Стадии и кэш dapp

  111. before_install install before_setup setup #2 Стадии и кэш dapp

  112. before_install install before_setup setup #2 Стадии и кэш dapp Тяжелое

    и редко изменяющееся <1% комитов
  113. before_install install before_setup setup #2 Стадии и кэш dapp “Прикладные

    зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  114. before_install install before_setup setup #2 Стадии и кэш dapp “Конфиги”

    ~2% комитов “Прикладные зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  115. before_install install before_setup setup #2 Стадии и кэш dapp “Конфиги”

    ~2% комитов “Прикладные зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  116. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  117. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  118. shell { install { run "apt-get update" run "apt-get install

    -y netcat" } }
  119. shell { install { run "apt-get update" run "apt-get install

    -y netcat" } }
  120. shell { before_install { } install { run "apt-get update"

    run "apt-get install -y netcat" } }
  121. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat" } }
  122. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat" } }
  123. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" } }
  124. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" } }
  125. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } }
  126. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } но...
  127. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } ubuntu:16.04 127 МB
  128. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB
  129. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB dac2ab8ac393 700 KB
  130. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB dac2ab8ac393 700 KB А как в Dockerfile?
  131. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat
  132. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat ubuntu:16.04 127 МB
  133. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  134. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ab01fb5697de 40 МB ubuntu:16.04 127 МB
  135. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ab01fb5697de 40 МB 44fceb7383a8 200 KB ubuntu:16.04 127 МB
  136. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  137. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  138. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat && \ rm -rf /var/lib/apt 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  139. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat && \ rm -rf /var/lib/apt 21111bef7939 200 KB 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  140. Конфликт

  141. Конфликт Мы хотим иметь информацию (для следующих шагов или для

    следующих сборок)
  142. Конфликт Мы хотим иметь информацию (для следующих шагов или для

    следующих сборок) Мы НЕ хотим иметь её в конечном образе и НЕ хотим вручную очищать и думать об этом
  143. dapp #2 Внешний контекст

  144. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } }
  145. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { }
  146. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir }
  147. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB
  148. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  149. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  150. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  151. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB eee17ba66912 200 KB
  152. git dapp #2 Внешний контекст

  153. git dapp #2 Внешний контекст Dappfile

  154. git dapp # dapp build #2 Внешний контекст Dappfile

  155. git dapp # dapp build #2 Внешний контекст Dappfile контейнер

  156. git dapp # dapp build #2 Внешний контекст Dappfile :build_dir

    контейнер
  157. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir контейнер
  158. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер
  159. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер
  160. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер * Требуются для сборки
  161. dapp #2 Внешний контекст

  162. dapp #2 Внешний контекст apt, yum

  163. dapp #2 Внешний контекст bundler, pip, composer, npm, bower apt,

    yum
  164. dapp #2 Внешний контекст bundler, pip, composer, npm, bower apt,

    yum ccache, кэш “сборщика ассетов”
  165. круто?

  166. before_install install before_setup setup dapp #1 Стадии и кэш dapp

    <1% ~5% ~2%
  167. before_install install before_setup setup dapp >90% комитов?

  168. Добавление “исходников” в образ — это то, что делается в

    каждом проекте и это должно быть удобно... ...очень удобно! И очень эффективно!
  169. #3 git dapp

  170. #3 git dapp 1. Добавлять все исходники каждый раз целиком?

  171. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком?
  172. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком? 3. Как проставлять owner’а и права?
  173. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком? 3. Как проставлять owner’а и права? 4. Как “вырезать” кусочки из git’а?
  174. before_install before_setup setup #3 git dapp install

  175. before_install before_setup setup #3 git dapp install

  176. before_install before_setup setup #3 git dapp git archive install

  177. before_install before_setup setup #3 git dapp git archive install

  178. before_install before_setup setup #3 git dapp git archive install git

  179. before_install before_setup setup #3 git dapp git archive install git

    git patch apply
  180. before_install before_setup setup #3 git dapp git archive install git

    git patch apply apt-get update php-fpm php-mysql composer
  181. before_install before_setup setup #3 git dapp install git apt-get update

    php-fpm php-mysql composer composer install git archive git patch apply
  182. before_install before_setup setup #3 git dapp install git apt-get update

    php-fpm php-mysql composer composer install git archive git patch apply
  183. before_install install before_setup setup #3 git dapp apt-get update php-fpm

    php-mysql composer composer install composer.lock git git archive git patch apply
  184. before_install install before_setup setup #3 git dapp apt-get update php-fpm

    php-mysql composer composer install composer.lock git git archive git patch apply
  185. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  186. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  187. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  188. Пример #2: PHP-приложение

  189. git { }

  190. git { add { } }

  191. git { add "/php_configs" { } }

  192. git { add "/php_configs" { to "/etc/php" } }

  193. git { add "/php_configs" { to "/etc/php" } add "/"

    { } }
  194. git { add "/php_configs" { to "/etc/php" } add "/"

    { to "/app" } }
  195. git { add "/php_configs" { to "/etc/php" } add "/"

    { exclude "php_configs" to "/app" } }
  196. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" exclude "php_configs" to "/app" } }
  197. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" group "apache" exclude "php_configs" to "/app" } }
  198. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" group "apache" exclude "php_configs" to "/app" } } install_depends_on "composer.lock"
  199. теперь круто?

  200. FROM ubuntu:16.04

  201. FROM ubuntu:16.04 ADD . /src

  202. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev

  203. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src
  204. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp
  205. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp RUN apt-get purge build-essentials libmysql-dev
  206. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp RUN apt-get purge build-essentials libmysql-dev RUN apt-get install libmysql
  207. #4 Артефакты dapp

  208. #4 Артефакты dapp При сборке проекта вам нужны какие-то инструменты,

    но они не нужны вам для работы
  209. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) При

    сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы
  210. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) Меняются

    инструменты редко, ставятся долго, переустанавливать неудобно При сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы
  211. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) Меняются

    инструменты редко, ставятся долго, переустанавливать неудобно При сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы *касается всего, что “компилируется”
  212. #4 Артефакты dapp git Dappfile

  213. #4 Артефакты dapp git # dapp build Dappfile

  214. docker образ артефакта #4 Артефакты dapp git # dapp build

    Dappfile
  215. конечный docker образ docker образ артефакта #4 Артефакты dapp git

    # dapp build Dappfile
  216. конечный docker образ docker образ артефакта #4 Артефакты dapp git

    # dapp build Dappfile Артефакт
  217. конечный docker образ docker образ артефакта #4 Артефакты dapp git

    # dapp build Dappfile Артефакт <200 МБ >1 ГБ
  218. #4 Артефакты dapp before_install artifact_build git archive git patch apply

  219. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev
  220. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git
  221. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git
  222. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src
  223. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src install artifact
  224. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src install artifact apt-get install libmysql
  225. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact apt-get install libmysql
  226. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  227. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  228. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  229. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  230. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  231. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql make -C /src
  232. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  233. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src install artifact конечный docker образ apt-get install libmysql apt-get install build-essentials libmysql-dev
  234. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  235. Пример #3: Приложение на Си

  236. docker.from "ubuntu:14.04"

  237. docker.from "ubuntu:14.04" artifact { }

  238. docker.from "ubuntu:14.04" artifact { git { } }

  239. docker.from "ubuntu:14.04" artifact { git { add "/" { }

    } }
  240. docker.from "ubuntu:14.04" artifact { git { add "/" { to

    "/src" } } }
  241. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    }
  242. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { } }
  243. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" } }
  244. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } }
  245. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" }
  246. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { } }
  247. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" } }
  248. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } }
  249. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } } shell.install.run "apt-get install libmysql"
  250. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } } shell.install.run "apt-get install libmysql" docker.cmd "/usr/bin/myapp"
  251. можно брать?

  252. #5 dapp

  253. #5 dapp Модульность на shell?

  254. #5 dapp Командная работа на shell? Модульность на shell?

  255. #5 dapp Командная работа на shell? Модульность на shell? :(((((

  256. DRY don't repeat yourself

  257. Модульность git project_1 Код git project_2 Код git nginx nginx

    v4 nginx v4 nginx v2
  258. Модульность git project_1 Код git project_2 Код git nginx nginx

    v4 nginx v4 nginx v2 Dependency management
  259. bundler, composer, pip, npm, ... Модульность git project_1 Код git

    project_2 Код git nginx nginx v4 nginx v4 nginx v2 Dependency management
  260. bundler, composer, pip, npm, ... Модульность git project_1 Код git

    project_2 Код git nginx nginx v4 nginx v4 nginx v2 Dependency management
  261. Shell Модульность git project_1 Код git project_2 Код git nginx

    nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ...
  262. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ...
  263. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ... Chef
  264. Shell + git submodules Модульность Dependency management bundler, composer, pip,

    npm, ... Chef + Berkshelf git project_1 Код git project_2 Код git nginx nginx v4 nginx v4 nginx v2
  265. Shell + git submodules Модульность Dependency management bundler, composer, pip,

    npm, ... Chef + Berkshelf Puppet git project_1 Код git project_2 Код git nginx nginx v4 nginx v4 nginx v2
  266. Shell + 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
  267. Shell + 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
  268. #5 Chef dapp git Dappfile

  269. #5 Chef dapp git # dapp build Dappfile

  270. #5 Chef dapp git # dapp build Dappfile

  271. #5 Chef dapp git # dapp build Dappfile .dapp_chef

  272. #5 Chef dapp git # dapp build Dappfile .dapp_chef :build_dir

  273. #5 Chef dapp git # dapp build Dappfile /.dapp/chef/build/cookbooks .dapp_chef

    :build_dir
  274. #5 Chef dapp git # dapp build Dappfile /.dapp/chef/build/cookbooks .dapp_chef

    :build_dir /.dapp/deps/chefdk dappdeps/chefdk:0.17.3
  275. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks :build_dir
  276. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks :build_dir
  277. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks конечный docker образ :build_dir
  278. git #5 Chef dapp .dapp_chef/

  279. git #5 Chef dapp .dapp_chef/ recipes/ templates/ files/

  280. git #5 Chef dapp .dapp_chef/ recipes/ before_install/ install/ before_setup/ setup/

    templates/ files/
  281. .dapp_chef/ recipes/ before_install/ install/ ... templates/ before_install/ install/ ... files/

    before_install/ install/ ... git #5 Chef dapp
  282. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... git #5 Chef dapp
  283. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  284. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  285. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  286. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  287. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/
  288. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/
  289. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/
  290. Пример #4: Rails-приложение

  291. dimg_group { }

  292. dimg_group { dimg "backend" { } }

  293. dimg_group { dimg "backend" { } dimg "worker" { }

    }
  294. dimg_group { dimg "backend" { } dimg "worker" { }

    } dimg "frontend" { }
  295. dimg_group { git.add "/" { to "/app" } dimg "backend"

    { } dimg "worker" { } } dimg "frontend" { }
  296. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    dimg "backend" { } dimg "worker" { } } dimg "frontend" { }
  297. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { } dimg "worker" { } } dimg "frontend" { }
  298. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { } } dimg "frontend" { }
  299. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { }
  300. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  301. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  302. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  303. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  304. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" artifact_depends_on "/app/assets", "Gemfile*" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  305. docker.from "ubuntu:14.04" chef.recipe "common" dimg_group { git.add "/" { to

    "/app" } chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" artifact_depends_on "/app/assets", "Gemfile*" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  306. #1 Стадии и кэш dapp

  307. #1 Стадии и кэш #2 Внешний контекст dapp

  308. #1 Стадии и кэш #2 Внешний контекст #3 git dapp

  309. #1 Стадии и кэш #2 Внешний контекст #3 git #4

    Артефакты dapp
  310. #1 Стадии и кэш #2 Внешний контекст #3 git #4

    Артефакты #5 Chef dapp
  311. #1 Стадии и кэш #2 Внешний контекст #3 git #4

    Артефакты #5 Chef #6 Несколько образов dapp
  312. Мы хотим сделать dapp действительно крутым и полезным OpenSource решением

    Нам нужен ВАШ опыт использования Будем рады любой помощи Поставьте звёздочку ;) Обещаем очень быстро отвечать на все issue и очень быстро фиксить все баги. Для нас dapp это приоритетный проект. Если есть желание помочь с переводом документации на английский, или с её доработкой, да или вообще помочь — будем очень рады и ждем пулреквесты. Мы старались.
  313. dapp 0.7

  314. Наши docker-проекты github.com/flant/dapp github.com/flant/docker_penetration_experiment github.com/flant/pam_docker github.com/flant/php_fpm_docker github.com/flant/superhosting github.com/flant/buildizer Дмитрий Столяров

    dmitry.stolyarov@flant.ru linkedin.com/in/distol github.com/distol Всем спасибо! Тимофей Кириллов github.com/distorhead Алексей Игрычев github.com/alexey-igrychev