41
Développer et packager votre application Symfony2 avec Docker et Vagrant https://joind.in/11240 ( @thierrymarianne | thierrym @theodo[point]fr) 1

Développer et packager votre application Symfony2 avec Docker et Vagrant

Embed Size (px)

DESCRIPTION

Présentation donnée au PHP Tour Lyon 2014

Citation preview

Page 1: Développer et packager votre application Symfony2 avec Docker et Vagrant

Développer et packager votreapplication Symfony2 avec

Docker et Vagrant

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

1

Page 2: Développer et packager votre application Symfony2 avec Docker et Vagrant

Proposition À partir d'une application Symfony2 ayant fait ses preuves :

- Utilisateurs

- Intégration continue / déploiements automatisés

=> Passer à Docker (sans Puppet / Chef / Ansible ...)

https://github.com/thierrymarianne/symfony2-docker-vagrant

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

2

Page 3: Développer et packager votre application Symfony2 avec Docker et Vagrant

Projet interne chez DotCloud, Solomon Hykes

Janvier 2014 : Levée de fond de 15M$

9 Juin 2014 : Sortie de la 1.0 à la DockerCon 2014

10 Juin 2014 : Intégration de Docker dans Google App Engine

Un peu d'histoire

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

3

Page 4: Développer et packager votre application Symfony2 avec Docker et Vagrant
Page 5: Développer et packager votre application Symfony2 avec Docker et Vagrant

Machines virtuelles !== Containers

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

5

Page 6: Développer et packager votre application Symfony2 avec Docker et Vagrant

Développement

Intégration continue

Déploiement

Dans quels contextes utiliser Docker ?

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

6

Page 7: Développer et packager votre application Symfony2 avec Docker et Vagrant

Pour le développeurDavantage d'indépendance vis à vis des Ops

Meilleure sensation d'être en production sur son poste de travail

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

7

Page 8: Développer et packager votre application Symfony2 avec Docker et Vagrant

Pour l'opérationnelDavantage d'indépendance vis à vis des Devs

Faciliter la surcharge des configurations utilisées en développement

(variables d'environnements, fichiers de configuration, persistence)

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

8

Page 9: Développer et packager votre application Symfony2 avec Docker et Vagrant

En pratique Container Machine ("machine virtuelle" rapide)

Container Application (rôle au sens gestion de configuration)

Container Volume de Données (point de montage)

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

9

Page 10: Développer et packager votre application Symfony2 avec Docker et Vagrant

Intégration avec Vagrant En mode provider

Rôle tenu de manière traditionnel par VirtualBox / VMware

=> Container Machine

$ vagrant init [...]config.vm.provider "docker" do |d| d.image = "afup/nginx"end[...]

01.02.03.04.05.06.07.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

10

Page 11: Développer et packager votre application Symfony2 avec Docker et Vagrant

"Machine virtuelle" légère ?Utilisation des images de base Phusion

/sbin/my_init (collecte des processus orphelins)

Runit à la place d'upstart (supervision de service)

Syslog-ng / logrotate

ssh

/!\ Non-recommandé par Michael Crosby

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

11

Page 12: Développer et packager votre application Symfony2 avec Docker et Vagrant

Intégration avec Vagrant• Provisioning

Vagrant.configure("2") do |config| config.vm.provision "docker", images: ["afup/symfony2"]end

• Rôle aussi tenu par Shell / Puppet / Chef

=> Container Application

01.02.03.04.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

12

Page 13: Développer et packager votre application Symfony2 avec Docker et Vagrant

Selon le fondateur de Docker

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

13

Page 14: Développer et packager votre application Symfony2 avec Docker et Vagrant

Ou alors, Boot2Docker! Linux très léger optimisé pour lancer des containers rapidement

Installation pour OSX / Windows

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

14

Page 15: Développer et packager votre application Symfony2 avec Docker et Vagrant

Comment utiliser Docker?Ligne de commande / Dockerfile

https://docs.docker.com/installation/

$ docker -h

Outils de configuration / orchestration

# pip install -U fig

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

15

Page 16: Développer et packager votre application Symfony2 avec Docker et Vagrant

Application Symfony2 associée à un indexde recherche

16

Page 17: Développer et packager votre application Symfony2 avec Docker et Vagrant

Le contenu de notre Dockerfile pour notre container Elasticsearch :

$ vi Dockerfile FROM tutum/elasticsearchEXPOSE 9200VOLUME ['/var/lib/elasticsearch']ENTRYPOINT ["/usr/share/elasticsearch/bin/elasticsearch"]

Ne pas réinventer la roue

01.02.03.04.05.06.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

17

Page 18: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker build -t afup/elasticsearch:0.1 .# => nouvelle image créée pour le référentiel# afup/elasticsearch

# Envoi sur index publicdocker push afup/elasticsearch:0.1

# Récupération à partir de l'index publicdocker pull afup/elasticsearch:0.1

Contruire une image Elasticsearch01.02.03.

01.02.

01.02.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

18

Page 19: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -d -p :9200 \--name elasticsearch-server \-v ̀pwd̀/elasticsearch:/var/lib/elasticsearch \afup/elasticsearch:0.1

Démarrer notre container à partir de l'image01.02.03.04.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

19

Page 20: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -d -p :9200 \--name elasticsearch-server \--volumes-from elasticsearch-data-volume \-v ̀pwd̀/elasticsearch:/var/lib/elasticsearch \afup/elasticsearch:0.1

Tagger notre container Elasticsearch01.02.03.04.05.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

20

Page 21: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -d -p :9200 \--name elasticsearch-server \--volumes-from elasticsearch-data-volume \-v ̀pwd̀/elasticsearch:/var/lib/elasticsearch \afup/elasticsearch:0.1

Déclarer un Container Volume de Données01.02.03.04.05.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

21

Page 22: Développer et packager votre application Symfony2 avec Docker et Vagrant

Avec montage de notre application Symfony2

docker run -t -i -p 80:80 \--name php-nginx-server \--link elasticsearch-server:symfony__elasticsearch_ \-v symfony2:/var/www/symfony2 \-v ̀pwd̀/nginx/sites-enabled:/etc/nginx/sites-enabled \# [...]afup/nginx:0.1

Lancer un Container Application (nginx)

01.02.03.04.05.06.07.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

22

Page 23: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -t -i -p 80:80 \--name php-nginx-server \--link elasticsearch-server:symfony__elasticsearch_ \-v symfony2:/var/www/symfony2 \-v ̀pwd̀/nginx/sites-enabled:/etc/nginx/sites-enabled \afup/nginx:0.1

Lier nos containers Elasticsearch et nginx01.02.03.04.05.06.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

23

Page 24: Développer et packager votre application Symfony2 avec Docker et Vagrant

# Définition de paramètres de configuration en yamlparameters: elasticsearch_host: %elasticsearch.host% elasticsearch_port: %elasticsearch.port% gmail_search_index: gmail twitter_search_index: twitter

Configuration de notre application01.02.03.04.05.06.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

24

Page 25: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -t -i -p 80:80 \--name php-nginx-server \--e SYMFONY__ELASTICSEARCH__HOST=127.0.0.1-v symfony2:/var/www/symfony2 \-v ̀pwd̀/nginx/sites-enabled:/etc/nginx/sites-enabled \afup/nginx:0.1

root@ad09c8a66671:# dans mon container Elasticsearchroot@ad09c8a66671:envroot@ad09c8a66671:SYMFONY__ELASTICSEARCH__HOST=127.0.0.1

Variables d'environnement (1/2)Injection d'une variable au démarrage d'un container

01.02.03.04.05.06.

01.02.03.

25

Page 26: Développer et packager votre application Symfony2 avec Docker et Vagrant

docker run -t -i -p 80:80 \--name php-nginx-server \--link elasticsearch-server:symfony__elasticsearch_ \-v symfony2:/var/www/symfony2 \-v ̀pwd̀/nginx/sites-enabled:/etc/nginx/sites-enabled \afup/nginx:0.1

SYMFONY__ELASTICSEARCH__HOST <=> %elasticsearch.host%

Lier deux containers transfère les variables d'environnement

Variables d'environnement (2/2)01.02.03.04.05.06.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

26

Page 27: Développer et packager votre application Symfony2 avec Docker et Vagrant

FROM ubuntu:14.04ENV DEBIAN_FRONTEND noninteractive # RUN apt-get upgrade à bannir RUN apt-get updateRUN apt-get install -y --force-yes software-properties-common

Pro Tip: Abuser des images officielles01.02.03.04.05.06.07.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

27

Page 28: Développer et packager votre application Symfony2 avec Docker et Vagrant

sudo apt-get install squid-deb-proxy avahi-utils

https://github.com/yasn77/docker-squid-repo-cache.git

Pro Tip: Proxy Packages Debian (1/2)Proxy pour gestionnaire de paquets sur la machine hôte

Peut être même dans son propre container ?

01.02.03.

01.02.03.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

28

Page 29: Développer et packager votre application Symfony2 avec Docker et Vagrant

RUN route -n | awk '/̂0.0.0.0/ {print $2}' > /tmp/host_ip.txtRUN echo "HEAD /" | nc ̀cat /tmp/host_ip.txt̀ 8000 | \grep squid-deb-proxy \ && (echo "Acquire::http::Proxy \"http://$(cat /tmp/host_ip.txt):8000\";" > \ /etc/apt/apt.conf.d/30proxy) \ && (echo "Acquire::http::Proxy::ppa.launchpad.net DIRECT;" >> \ /etc/apt/apt.conf.d/30proxy) \ || echo "No squid-deb-proxy detected on docker host"

Pro Tip: Proxy Packages Debian (2/2)Dans mon Dockerfile, avant l'installation de paquets :01.02.03.04.05.06.07.08.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

29

Page 30: Développer et packager votre application Symfony2 avec Docker et Vagrant

RUN apt-get install -y --force-yes nginxRUN apt-get install -y --force-yes php5-fpm

Différent deRUN apt-get install -y --force-yes php5-fpmRUN apt-get install -y --force-yes nginx

Pro Tip: Tirer parti du cache de DockerDans vos Dockerfiles :

Conserver au maximum l'ordre des instructions!01.02.

01.02.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

30

Page 31: Développer et packager votre application Symfony2 avec Docker et Vagrant

Pro Tip: Proxy Toran pour composerPar l'un des lead développeurs de Composer (Jordi Boggiano)

Accélérer l'installation des vendors

Sert de point de redondance avec github / référentiels privés

=> Container Application

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

31

Page 32: Développer et packager votre application Symfony2 avec Docker et Vagrant

# fig.yml nginx: build: /home/afup/php-nginx links: - elasticsearch:symfony__elasticsearch_ [...] ports: - "8081:80" expose: - "80"

Et si on se débarrassait (en partie) du shell ?01.02.03.04.05.06.07.08.09.10.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

32

Page 33: Développer et packager votre application Symfony2 avec Docker et Vagrant

elasticsearch: image: afup/elasticsearch:0.1 volumes_from: elasticsearch-data-volume expose: - "9200" ports: - ":9200"

Fig

Où se cache notre application Symfony2 cette fois ?

01.02.03.04.05.06.07.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

33

Page 34: Développer et packager votre application Symfony2 avec Docker et Vagrant

nginx: [...] volumes: - nginx/sites-enabled:/etc/nginx/sites-enabled - symfony2:/var/www/symfony2 $ fig up

Fig01.02.03.04.05.06.07.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

34

Page 35: Développer et packager votre application Symfony2 avec Docker et Vagrant

La vie des containers avec Cadvisor

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

35

Page 36: Développer et packager votre application Symfony2 avec Docker et Vagrant

Aller encore plus loin avec OpenStackAvec OpenStack (cloud manager)

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

36

Page 37: Développer et packager votre application Symfony2 avec Docker et Vagrant

description: > Stack Heat (Orchestration)resources: nginx: type: DockerInc::Docker::Container properties: image: afup/php-nginx:0.1 elasticsearch: type: DockerInc::Docker::Container [...]

Démarrer une "Stack" avec Heat

heat stack-create nginx -f ../openstack/php-nginx.yml

01.02.03.04.05.06.07.08.09.10.

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

37

Page 38: Développer et packager votre application Symfony2 avec Docker et Vagrant

Et ce n'est que le début !Orchestration avec Maestro-Ng

Configuration visuelle avec Gaudi

Déploiement avec Deis / CoreOS

Support de Docker avec AppEngine

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

38

Page 39: Développer et packager votre application Symfony2 avec Docker et Vagrant

Showtime• /!\ Effet démo en perspective !!

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

39

Page 40: Développer et packager votre application Symfony2 avec Docker et Vagrant

Questions ?

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

40

Page 41: Développer et packager votre application Symfony2 avec Docker et Vagrant

Sources• https://linuxcontainers.org

• http://en.wikipedia.org/wiki/Chroot

• http://en.wikipedia.org/wiki/Cgroups

• https://www.docker.io

• https://hub.docker.com/

• https://speakerdeck.com/ubermuda/a-multi-container-symfony2-setup-with-docker

• https://wiki.openstack.org/wiki/Solum

• https://speakerdeck.com/ubermuda/a-multi-container-symfony2-setup-with-docker

• http://blog.docker.com/2014/04/openstack-update-icehouse-release-update/

• https://github.com/phusion/baseimage-docker

• http://crosbymichael.com/dockerfile-best-practices.html

• https://toranproxy.com/

• http://openstack.redhat.com/Quickstart/

https://joind.in/11240 (@thierrymarianne | thierrym@theodo[point]fr)

41