Slide 1

Slide 1 text

Vers des applications twelve-factor Avec Symfony et Docker Geoffrey Bachelet geoffrey.io / @ubermuda

Slide 2

Slide 2 text

12factor.net

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Use declarative formats for setup automation Clean contract with the underlying operating system Suitable for deployment on modern cloud platforms Minimize divergence between development and production Can scale up without significant changes ”

Slide 5

Slide 5 text

Codebase Dependencies Config Backing services Build, release, run Processes Port binding Concurrency Disposability Dev/prod parity Logs Admin processes

Slide 6

Slide 6 text

Codebase

Slide 7

Slide 7 text

Codebase Question de vocabulaire

Slide 8

Slide 8 text

Codebase une app = une base de code ("codebase")

Slide 9

Slide 9 text

Codebase = un repo git/hg/svn

Slide 10

Slide 10 text

Codebase 2 codebases =! un app

Slide 11

Slide 11 text

Codebase = un système distribué ("distributed system")

Slide 12

Slide 12 text

Distributed System Web WS Worker

Slide 13

Slide 13 text

Codebase 1 codebase -> plusieurs déploiements ("deploy")

Slide 14

Slide 14 text

Codebase Prod Pré-prod Dev C.I.

Slide 15

Slide 15 text

Codebase one app = one codebase multiple codebases = a distributed system one codebase -> many deploys

Slide 16

Slide 16 text

Dependencies

Slide 17

Slide 17 text

System-wide vs Project-wide

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Dependencies Declaration composer.json bower.json packages.json ...

Slide 20

Slide 20 text

Dependencies Isolation bin/ autoload ...

Slide 21

Slide 21 text

Outils système ? curl, imagemagick, ...

Slide 22

Slide 22 text

Pas de "shell out" ! si obligatoire, inclure le binaire dans les dépendances

Slide 23

Slide 23 text

Config

Slide 24

Slide 24 text

Resource handles to the database, Memcached Credentials to external services such as Amazon S3 or Twitter Per-deploy values such as the canonical hostname for the deploy ”

Slide 25

Slide 25 text

Séparation stricte de la config et du code.

Slide 26

Slide 26 text

app/config/parameters.yml

Slide 27

Slide 27 text

Il est possible de créer d'autres fichiers ! app/config/apis.yml

Slide 28

Slide 28 text

12 factor recommande les variables d'environnement

Slide 29

Slide 29 text

Incenteev/ParameterHandler env-map

Slide 30

Slide 30 text

docker run -e FOO=bar -e TOTO Docker

Slide 31

Slide 31 text

web: image: debian:wheezy environnement: - FOO=bar - TOTO Fig

Slide 32

Slide 32 text

Backing services

Slide 33

Slide 33 text

A backing service is any service the app consumes over the network as part of its normal operation. ”

Slide 34

Slide 34 text

Datastore (MySQL, PgSQL, Redis, ...) SMTP (Postfix, Mandril, ...) Message Queue (RabbitMQ, ZeroMQ, ...) API tierce (Twitter, Facebook, etc)

Slide 35

Slide 35 text

App Ambassador MySQL Redis MySQL Ambassador Ambassador Ambassador

Slide 36

Slide 36 text

App Ambassador Ambassador Facebook Twitter Health check, Cache, etc.

Slide 37

Slide 37 text

Build, release, run

Slide 38

Slide 38 text

The twelve-factor app uses strict separation between the build, release, and run stages. ”

Slide 39

Slide 39 text

Téléchargement des dépendances Construction des assets Build

Slide 40

Slide 40 text

Build docker build

Slide 41

Slide 41 text

composer install ...et la méchante "GitHub API Rate"

Slide 42

Slide 42 text

FROM debian:wheezy Dockerfile

Slide 43

Slide 43 text

- FROM debian:wheezy + FROM acme/base Dockerfile

Slide 44

Slide 44 text

FROM debian:wheezy RUN composer config -g \ github-oauth.github.com \ a1b2c3d4e5... acme/base Attention à la sécurité !

Slide 45

Slide 45 text

Release docker push Possiblement sur un registry privé

Slide 46

Slide 46 text

RUN docker run / fig up

Slide 47

Slide 47 text

Processes

Slide 48

Slide 48 text

Twelve-factor processes are stateless and share-nothing. ”

Slide 49

Slide 49 text

App App Volumes Cache, Sessions, etc.

Slide 50

Slide 50 text

App App Volumes Cache, Sessions, etc. NOPE

Slide 51

Slide 51 text

App Volumes App Volumes Redis Ambassador

Slide 52

Slide 52 text

App Volumes App Volumes Redis Ambassador Sessions Cache

Slide 53

Slide 53 text

Assets ?! uploads, avatars, etc.

Slide 54

Slide 54 text

Amazon S3 ou autre

Slide 55

Slide 55 text

Port binding

Slide 56

Slide 56 text

The twelve-factor app is completely self-contained

Slide 57

Slide 57 text

Self-contained?!

Slide 58

Slide 58 text

That's my fetish.

Slide 59

Slide 59 text

Docker docker run -P

Slide 60

Slide 60 text

Chaque application peut devenir un "backing service".

Slide 61

Slide 61 text

Concurrency

Slide 62

Slide 62 text

stateless + share-nothing = scalable

Slide 63

Slide 63 text

Web Reverse Proxy App App Ambassador MySQL

Slide 64

Slide 64 text

Reverse Proxy App App App Ambassador MySQL Let's rock.

Slide 65

Slide 65 text

Background jobs AMQP App Worker Worker Worker

Slide 66

Slide 66 text

Disposability

Slide 67

Slide 67 text

Web Reverse Proxy App App App Ambassador MySQL

Slide 68

Slide 68 text

Reverse Proxy App App App Ambassador MySQL J'ai piscine

Slide 69

Slide 69 text

ChaosMonkey https://github.com/Netflix/SimianArmy/wiki/Chaos-Monkey

Slide 70

Slide 70 text

App Ambassador MySQL Redis MySQL Ambassador Ambassador Ambassador

Slide 71

Slide 71 text

App Ambassador MySQL Redis MySQL Ambassador Ambassador Ambassador PG M'A TUER

Slide 72

Slide 72 text

App Ambassador MySQL Redis MySQL Ambassador Ambassador Ambassador LOL

Slide 73

Slide 73 text

App Ambassador MySQL Redis MySQL Ambassador Ambassador Ambassador MySQuoi ?

Slide 74

Slide 74 text

Dev/prod parity

Slide 75

Slide 75 text

Objectifs Réduire la friction entre le dev et la prod Réduire le "time-to-first-deploy" Faciliter l'intégration continue

Slide 76

Slide 76 text

Docker Permet d'avoir des environnements de dev très proches de la production.

Slide 77

Slide 77 text

Fig Facilite l'orchestration.

Slide 78

Slide 78 text

web: image: mytepee/web ports: [80] links: [db:db] volumes_from: [cache, config, data] environment: [...] db: image: orchardup/mysql environment: [...] cache: image: busybox command: /bin/true volumes: [/root/.composer/cache, /root/.cache/bower] config: image: busybox command: /bin/true volumes: [/app/config] data: image: busybox command: /bin/true volumes: [/app/web/uploads, /app/web/media, ..., /app/app/cache, /app/app/logs] fig.yml Attention à la sécurité !

Slide 79

Slide 79 text

Fig Pas (encore) d'orchestration "remote". Outils tierce (Flocker, Panamax, etc.)

Slide 80

Slide 80 text

Logs

Slide 81

Slide 81 text

A twelve-factor app never concerns itself with routing or storage of its output stream. ”

Slide 82

Slide 82 text

...each running process writes its event stream, unbuffered, to stdout ”

Slide 83

Slide 83 text

Difficile d'être twelve-factor avec Symfony.

Slide 84

Slide 84 text

ELK Elasticsearch + Logstash + Kibana

Slide 85

Slide 85 text

David Pilato @dadoonet Atelier : Hands on Elasticsearch & Kibana

Slide 86

Slide 86 text

David Pilato @dadoonet Atelier : Hands on Elasticsearch & Kibana HIER

Slide 87

Slide 87 text

Olivier Dolbeau @odolbeau Talk : Laisse pas trainer ton log !

Slide 88

Slide 88 text

Olivier Dolbeau @odolbeau Talk : Laisse pas trainer ton log ! HIER

Slide 89

Slide 89 text

Olivier Dolbeau @odolbeau http://odolbeau.fr/blog/when-monolog-meet-elk.html When Monolog meet ELK

Slide 90

Slide 90 text

Admin processes

Slide 91

Slide 91 text

One-off admin processes should be run in an identical environment as the regular long-running processes of the app. ”

Slide 92

Slide 92 text

Container spécialisé ? docker run acme/cli ...

Slide 93

Slide 93 text

docker exec docker exec acme_web ... 1.3

Slide 94

Slide 94 text

Fig fig run

Slide 95

Slide 95 text

Run a one-off command on a service. For example: $ fig run web python manage.py shell By default, linked services will be started, unless they are already running. If you do not want to start linked services, use `fig run --no-deps SERVICE COMMAND [ARGS...]`. fig.yml

Slide 96

Slide 96 text

Ce qu'il faut retenir.

Slide 97

Slide 97 text

Twelve-factor = Recommandations

Slide 98

Slide 98 text

stateless / share-nothing

Slide 99

Slide 99 text

ELK http://odolbeau.fr/blog/when-monolog-meet-elk.html

Slide 100

Slide 100 text

Fig http://www.fig.sh/

Slide 101

Slide 101 text

Ambassador pattern https://docs.docker.com/articles/ambassador_pattern_linking/

Slide 102

Slide 102 text

Questions ? geoffrey.io / @ubermuda geoffrey.io/books/discovering-docker.html Merci !