SlideShare a Scribd company logo
dallo sviluppo alla produzione
Livin' with Docker
abstract per DockerOps 2016[giacomo.spettoli, simone.deponti]@abstract.it /
Indice (Spoiler alert!)
● Introduzione del caso di studio
● Perchè proprio docker?
● Lo sviluppo
● CI / CB / CD
● Deploy
● Produzione
Obiettivi del progetto
● Migrazione portale del cliente verso una
soluzione basata sul cms Plone
● Fornire una soluzione gestionale su
misura con Odoo (aka OpenERP)
Pecularità
● vari strati software da configurare e far
interagire (nginx, elasticsearch,
postgres, haproxy.)
● gruppo di lavoro distribuito e variabile
per numero e componenti
Possibili soluzioni...
● configurazione a mano! (“I’m on a highway to
Hell ♫”)
● sistema di provisioning (chef, puppet, ansible,
#younameit)
● sistema di virtualizzazione (vagrant +
virtualbox, vmware, hyperv, ...)
...docker!
● più leggero e modulare di una VM
● più stabile e scalabile di un sistema di
provisioning
● essendo un cambio di paradigma
bisogna trovare il modo giusto di usarlo
(per il contesto specifico)
la fase di sviluppo
Makefile + Ansible per il bootstrap
(download pacchetti, bower & grunt)
Docker-compose per l’orchestration dei
containers
il testing e le build: Jenkins
1. scarica il codice
2. fa il build delle immagini
3. esegue i test
4. fa il push sul nostro registry
Bonus: Jenkins dentro ad un container
docker che si connette al docker padre
Livin' with Docker - dallo sviluppo alla produzione
il testing e le build: Jenkins
1. scarica il codice
2. fa il build delle immagini
3. esegue i test
4. fa il push sul nostro registry
Bonus: Jenkins dentro ad un container
docker che si connette al docker padre
Livin' with Docker - dallo sviluppo alla produzione
il testing e le build: Jenkins
1. scarica il codice
2. fa il build delle immagini
3. esegue i test
4. fa il push sul nostro registry
Bonus: Jenkins dentro ad un container
docker che si connette al docker padre
il testing e le build: Jenkins
1. scarica il codice
2. fa il build delle immagini
3. esegue i test
4. fa il push sul nostro registry
Bonus: Jenkins dentro ad un container
docker che si connette al docker padre
Livin' with Docker - dallo sviluppo alla produzione
il testing e le build: Jenkins
1. scarica il codice
2. fa il build delle immagini
3. esegue i test
4. fa il push sul nostro registry
Bonus: Jenkins dentro ad un container
docker che si connette al docker padre
l’hosting: CoreOS
● droplet CoreOS su DO
● containers orchestrati con systemd
● config via cloudinit
il deploy: ansible e cloudinit
1. ansible fa il push della config cloudinit
2. viene eseguito il setup cloudinit
3. vengono riavviati i container
il deploy: ansible e cloudinit
name: copy cloud-init
copy:
src: "cloudinit/{{inventory_hostname}}.yml"
dest: /etc/custom-cloud-init
owner: root
sudo: yes
il deploy: ansible e cloudinit
1. ansible fa il push della config cloudinit
2. viene eseguito il setup cloudinit
3. vengono riavviati i container
il deploy: ansible e cloudinit
name: run cloudinit
shell: coreos-cloudinit -from-file=/etc/custom-cloud-init
sudo: yes
il deploy: ansible e cloudinit
#cloud-config
write_files:
- path: /home/core/.docker/config.json
owner: core:core
permissions: 0644
content: |
{
"auths": {
"https://registry.abstract.it": {
"auth": "bWFjaGlu… ",
"email": "xyz@abstract.it"
}
}
}
il deploy: ansible e cloudinit
coreos:
…
units:
- name: "pullimages.service"
content: |
[Unit]
Description=Pulls all required images
After=docker.service
Requires=docker.service
[Service]
User=core
Type=oneshot
ExecStart=/usr/bin/docker pull busybox:latest
ExecStart=/usr/bin/docker pull postgres:9.4
…
il deploy: ansible e cloudinit
- name: "ploneanon02.service"
command: "start"
content: |
[Unit]
Description=Plone (Anonymous)
After=blobdata.service mysql.service postgresplone.service …
Requires=blobdata.service pullimages.service
[Service]
User=core
TimeoutStartSec=0
Restart=on-failure
ExecStartPre=-/usr/bin/docker kill ploneanon02
ExecStartPre=-/usr/bin/docker rm -v ploneanon02
ExecStart=/usr/bin/docker run --name=ploneanon02 --volumes-from=blobdata
-e … registry.abstract.it/teatroit/plone:latest
ExecStop=/usr/bin/docker stop ploneanon02
il deploy: ansible e cloudinit
- name: "backup.service"
content: |
…
[Service]
Type=oneshot
ExecStart=/usr/bin/docker run --rm -v /tmp:/tmp -e ... --
entrypoint=/usr/bin/pg_dump postgres:9.4 -f /tmp/postgresqlusers.dump -F c
…
ExecStart=/usr/bin/curl -XPUT http://localhost:9200/_snapshot/total -d
'{"type":"fs","settings":{"compress":"true","location":"/srv/webapp/var/elastic/"}}'
ExecStart=/usr/bin/bash -c "/usr/bin/curl -XPUT
http://localhost:9200/_snapshot/total/$(date +%Y%m%d%H%M%S)?wait_for_completion=true"
ExecStart=/usr/bin/docker run --rm -v ... --volumes-from=... -e … jerob/docker-
duplicity:latest bash /duplicity
il deploy: ansible e cloudinit
1. ansible fa il push della config cloudinit
2. viene eseguito il setup cloudinit
3. vengono riavviati i container
il deploy: ansible e cloudinit
- name: stop services
service:
name: "{{item}}.service"
state: stopped
with_items:
- nginx
- varnish
…
sudo: yes
- name: start services
service:
name: "{{item}}.service"
state: started
with_items:
- pullimages
- postgresusers
…
Conclusioni
● siamo volutamente partiti “bassi” (niente scheduling)
● entrare mentalmente nel “concetto” di container (stateless)
● certe cose sono difficili da mettere in un container (RDBMS)
Questions?
Thanks!
Giacomo Spettoli
giacomo.spettoli@abstract.it
Simone Deponti
simone.deponti@abstract.it

More Related Content

PPTX
Automation Night (Docker)
Giuliano Latini
 
PDF
Introduzione a Docker (parte 2 - Pratica)
Cristian Consonni
 
PDF
Vagrant e Docker a confronto;scegliere ed iniziare
Daniele Mondello
 
PPTX
Docker Fudamentals
mvetro
 
PPTX
Google cloud: Big Data + docker = kubernetes
Giuliano Latini
 
PPTX
Introduzione pratica a docker, da chi lo ha appena conosciuto
Daniele Megna
 
PDF
Introduzione a Docker (Maggio 2017) [ITA]
Valerio Radice
 
PPTX
Architetture a Microservizi con Docker Container
Roberto Messora
 
Automation Night (Docker)
Giuliano Latini
 
Introduzione a Docker (parte 2 - Pratica)
Cristian Consonni
 
Vagrant e Docker a confronto;scegliere ed iniziare
Daniele Mondello
 
Docker Fudamentals
mvetro
 
Google cloud: Big Data + docker = kubernetes
Giuliano Latini
 
Introduzione pratica a docker, da chi lo ha appena conosciuto
Daniele Megna
 
Introduzione a Docker (Maggio 2017) [ITA]
Valerio Radice
 
Architetture a Microservizi con Docker Container
Roberto Messora
 

What's hot (20)

PDF
Introduzione a docker - DockerTutorial.it
Fabio Ros
 
PPTX
Microservices webinar EMEA Aug. 2017
MongoDB
 
PPTX
Introduzione a Docker
Roberto Messora
 
PDF
Docker
Andrea Laspada
 
PDF
Open Source Day 2015 - DBaaS con Docker: un caso di studio
Par-Tec S.p.A.
 
PDF
Docker & DevOps
Gerardo Di Iorio
 
PPTX
Introduzione a docker
Antonio Liccardi
 
PDF
Git/Continuous Integration/Docker: la terna dello sviluppo moderno.
Gerardo Di Iorio
 
PPTX
La mia prima lezione di pozioni
Gianluca Padovani
 
PPTX
High specialized vm on open stack cloud
Gabriele Baldoni
 
ODP
Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa...
Natale Vinto
 
PPTX
Alfresco meetup Roma - docker
David Ciamberlano
 
PDF
Introduzione DevOps con Ansible
Matteo Magni
 
PPTX
Workshop ASP.NET Core e Angular in produzione con Docker e Kubernetes
blexin
 
PDF
Con Aruba, a lezione di cloud #lezione 30 - parte 1: 'GitLab e Cloud Server ...
Aruba S.p.A.
 
PDF
Meetup ASP.NET Core 2 e Docker
dotnetcode
 
PPTX
Usare SQL Server for Linux e Docker per semplificare i processi di testing - ...
Giulio Vian
 
PDF
Maven from dummies
firenze-gtug
 
PPTX
Apache Maven - Gestione di progetti Java e build automation
Tiziano Serritella
 
PDF
Omnis italianmeeting 2016-10-20
Romualdo Gobbo
 
Introduzione a docker - DockerTutorial.it
Fabio Ros
 
Microservices webinar EMEA Aug. 2017
MongoDB
 
Introduzione a Docker
Roberto Messora
 
Open Source Day 2015 - DBaaS con Docker: un caso di studio
Par-Tec S.p.A.
 
Docker & DevOps
Gerardo Di Iorio
 
Introduzione a docker
Antonio Liccardi
 
Git/Continuous Integration/Docker: la terna dello sviluppo moderno.
Gerardo Di Iorio
 
La mia prima lezione di pozioni
Gianluca Padovani
 
High specialized vm on open stack cloud
Gabriele Baldoni
 
Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa...
Natale Vinto
 
Alfresco meetup Roma - docker
David Ciamberlano
 
Introduzione DevOps con Ansible
Matteo Magni
 
Workshop ASP.NET Core e Angular in produzione con Docker e Kubernetes
blexin
 
Con Aruba, a lezione di cloud #lezione 30 - parte 1: 'GitLab e Cloud Server ...
Aruba S.p.A.
 
Meetup ASP.NET Core 2 e Docker
dotnetcode
 
Usare SQL Server for Linux e Docker per semplificare i processi di testing - ...
Giulio Vian
 
Maven from dummies
firenze-gtug
 
Apache Maven - Gestione di progetti Java e build automation
Tiziano Serritella
 
Omnis italianmeeting 2016-10-20
Romualdo Gobbo
 
Ad

Viewers also liked (19)

PPTX
Docker introduction
dotCloud
 
PDF
Docker 101: Introduction to Docker
Docker, Inc.
 
PPTX
containerd the universal container runtime
Docker, Inc.
 
PDF
Ap Camp 2011
Enrico Pirozzi
 
PDF
PostgreSQL : Tuning
Enrico Pirozzi
 
PDF
Continuous Delivery Pipeline with Docker and Jenkins
Camilo Ribeiro
 
PDF
Orchestration for the rest of us
Jérôme Petazzoni
 
PDF
Docker introduction
Julien Maitrehenry
 
PDF
Container Orchestration Wars (Micro Edition)
Karl Isenberg
 
PDF
CI/CD with Docker, DC/OS, and Jenkins
Karl Isenberg
 
PDF
Introduction to Docker
Aditya Konarde
 
PDF
Jenkins Docker
Alex Soto
 
PDF
DockerCon EU 2015: Continuous Integration with Jenkins, Docker and Compose
Docker, Inc.
 
PDF
A Gentle Introduction To Docker And All Things Containers
Jérôme Petazzoni
 
PDF
Docker Compose by Aanand Prasad
Docker, Inc.
 
PPTX
Docker 101 - Nov 2016
Docker, Inc.
 
PDF
containerd summit - Deep Dive into containerd
Docker, Inc.
 
PDF
containerd and CRI
Docker, Inc.
 
PDF
Driving containerd operations with gRPC
Docker, Inc.
 
Docker introduction
dotCloud
 
Docker 101: Introduction to Docker
Docker, Inc.
 
containerd the universal container runtime
Docker, Inc.
 
Ap Camp 2011
Enrico Pirozzi
 
PostgreSQL : Tuning
Enrico Pirozzi
 
Continuous Delivery Pipeline with Docker and Jenkins
Camilo Ribeiro
 
Orchestration for the rest of us
Jérôme Petazzoni
 
Docker introduction
Julien Maitrehenry
 
Container Orchestration Wars (Micro Edition)
Karl Isenberg
 
CI/CD with Docker, DC/OS, and Jenkins
Karl Isenberg
 
Introduction to Docker
Aditya Konarde
 
Jenkins Docker
Alex Soto
 
DockerCon EU 2015: Continuous Integration with Jenkins, Docker and Compose
Docker, Inc.
 
A Gentle Introduction To Docker And All Things Containers
Jérôme Petazzoni
 
Docker Compose by Aanand Prasad
Docker, Inc.
 
Docker 101 - Nov 2016
Docker, Inc.
 
containerd summit - Deep Dive into containerd
Docker, Inc.
 
containerd and CRI
Docker, Inc.
 
Driving containerd operations with gRPC
Docker, Inc.
 
Ad

Similar to Livin' with Docker - dallo sviluppo alla produzione (20)

PDF
Idp, passo dopo passo!
Claudio Marotta
 
PDF
Azure cointainer instances e sql server
Danilo Dominici
 
PDF
Distribuire una libreria Java per usarla come dipendenza gradle
Paolo Montalto
 
ODP
Personal Cloud
NaLUG
 
PPTX
Kubernetes e bello, sicuro è meglio!
Giuliano Latini
 
PPTX
VS Package @ CD2008
Mauro Servienti
 
PDF
Creazione componenti con Vue js
Gianfranco Castro
 
PDF
Docker vs Virtualizzazioni
Giuliano Latini
 
PDF
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
DrupalDay
 
PDF
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
bmeme
 
PDF
AWS CDK infrastructure is code
Enrico Pesce
 
PDF
Meetup Azure DevOps
dotnetcode
 
PDF
ASP.NET Core 2 e Docker
Luca Congiu
 
PPTX
Introduzione a Docker
Antonio Di Motta
 
PPTX
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
Gianluca Carucci
 
PDF
Come portare il profiler di symfony2 in drupal8
Luca Lusso
 
PDF
Meetup Azure DevOps
dotnetcode
 
PDF
Infrastructure as Data
Francesco Collova'
 
PPTX
Infrastructure as code: Kubernetes on ACS
Nucleode Srl
 
PDF
Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambi...
DrupalDay
 
Idp, passo dopo passo!
Claudio Marotta
 
Azure cointainer instances e sql server
Danilo Dominici
 
Distribuire una libreria Java per usarla come dipendenza gradle
Paolo Montalto
 
Personal Cloud
NaLUG
 
Kubernetes e bello, sicuro è meglio!
Giuliano Latini
 
VS Package @ CD2008
Mauro Servienti
 
Creazione componenti con Vue js
Gianfranco Castro
 
Docker vs Virtualizzazioni
Giuliano Latini
 
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
DrupalDay
 
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
bmeme
 
AWS CDK infrastructure is code
Enrico Pesce
 
Meetup Azure DevOps
dotnetcode
 
ASP.NET Core 2 e Docker
Luca Congiu
 
Introduzione a Docker
Antonio Di Motta
 
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
Gianluca Carucci
 
Come portare il profiler di symfony2 in drupal8
Luca Lusso
 
Meetup Azure DevOps
dotnetcode
 
Infrastructure as Data
Francesco Collova'
 
Infrastructure as code: Kubernetes on ACS
Nucleode Srl
 
Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambi...
DrupalDay
 

Livin' with Docker - dallo sviluppo alla produzione

  • 1. dallo sviluppo alla produzione Livin' with Docker abstract per DockerOps 2016[giacomo.spettoli, simone.deponti]@abstract.it /
  • 2. Indice (Spoiler alert!) ● Introduzione del caso di studio ● Perchè proprio docker? ● Lo sviluppo ● CI / CB / CD ● Deploy ● Produzione
  • 3. Obiettivi del progetto ● Migrazione portale del cliente verso una soluzione basata sul cms Plone ● Fornire una soluzione gestionale su misura con Odoo (aka OpenERP)
  • 4. Pecularità ● vari strati software da configurare e far interagire (nginx, elasticsearch, postgres, haproxy.) ● gruppo di lavoro distribuito e variabile per numero e componenti
  • 5. Possibili soluzioni... ● configurazione a mano! (“I’m on a highway to Hell ♫”) ● sistema di provisioning (chef, puppet, ansible, #younameit) ● sistema di virtualizzazione (vagrant + virtualbox, vmware, hyperv, ...)
  • 6. ...docker! ● più leggero e modulare di una VM ● più stabile e scalabile di un sistema di provisioning ● essendo un cambio di paradigma bisogna trovare il modo giusto di usarlo (per il contesto specifico)
  • 7. la fase di sviluppo Makefile + Ansible per il bootstrap (download pacchetti, bower & grunt) Docker-compose per l’orchestration dei containers
  • 8. il testing e le build: Jenkins 1. scarica il codice 2. fa il build delle immagini 3. esegue i test 4. fa il push sul nostro registry Bonus: Jenkins dentro ad un container docker che si connette al docker padre
  • 10. il testing e le build: Jenkins 1. scarica il codice 2. fa il build delle immagini 3. esegue i test 4. fa il push sul nostro registry Bonus: Jenkins dentro ad un container docker che si connette al docker padre
  • 12. il testing e le build: Jenkins 1. scarica il codice 2. fa il build delle immagini 3. esegue i test 4. fa il push sul nostro registry Bonus: Jenkins dentro ad un container docker che si connette al docker padre
  • 13. il testing e le build: Jenkins 1. scarica il codice 2. fa il build delle immagini 3. esegue i test 4. fa il push sul nostro registry Bonus: Jenkins dentro ad un container docker che si connette al docker padre
  • 15. il testing e le build: Jenkins 1. scarica il codice 2. fa il build delle immagini 3. esegue i test 4. fa il push sul nostro registry Bonus: Jenkins dentro ad un container docker che si connette al docker padre
  • 16. l’hosting: CoreOS ● droplet CoreOS su DO ● containers orchestrati con systemd ● config via cloudinit
  • 17. il deploy: ansible e cloudinit 1. ansible fa il push della config cloudinit 2. viene eseguito il setup cloudinit 3. vengono riavviati i container
  • 18. il deploy: ansible e cloudinit name: copy cloud-init copy: src: "cloudinit/{{inventory_hostname}}.yml" dest: /etc/custom-cloud-init owner: root sudo: yes
  • 19. il deploy: ansible e cloudinit 1. ansible fa il push della config cloudinit 2. viene eseguito il setup cloudinit 3. vengono riavviati i container
  • 20. il deploy: ansible e cloudinit name: run cloudinit shell: coreos-cloudinit -from-file=/etc/custom-cloud-init sudo: yes
  • 21. il deploy: ansible e cloudinit #cloud-config write_files: - path: /home/core/.docker/config.json owner: core:core permissions: 0644 content: | { "auths": { "https://registry.abstract.it": { "auth": "bWFjaGlu… ", "email": "[email protected]" } } }
  • 22. il deploy: ansible e cloudinit coreos: … units: - name: "pullimages.service" content: | [Unit] Description=Pulls all required images After=docker.service Requires=docker.service [Service] User=core Type=oneshot ExecStart=/usr/bin/docker pull busybox:latest ExecStart=/usr/bin/docker pull postgres:9.4 …
  • 23. il deploy: ansible e cloudinit - name: "ploneanon02.service" command: "start" content: | [Unit] Description=Plone (Anonymous) After=blobdata.service mysql.service postgresplone.service … Requires=blobdata.service pullimages.service [Service] User=core TimeoutStartSec=0 Restart=on-failure ExecStartPre=-/usr/bin/docker kill ploneanon02 ExecStartPre=-/usr/bin/docker rm -v ploneanon02 ExecStart=/usr/bin/docker run --name=ploneanon02 --volumes-from=blobdata -e … registry.abstract.it/teatroit/plone:latest ExecStop=/usr/bin/docker stop ploneanon02
  • 24. il deploy: ansible e cloudinit - name: "backup.service" content: | … [Service] Type=oneshot ExecStart=/usr/bin/docker run --rm -v /tmp:/tmp -e ... -- entrypoint=/usr/bin/pg_dump postgres:9.4 -f /tmp/postgresqlusers.dump -F c … ExecStart=/usr/bin/curl -XPUT http://localhost:9200/_snapshot/total -d '{"type":"fs","settings":{"compress":"true","location":"/srv/webapp/var/elastic/"}}' ExecStart=/usr/bin/bash -c "/usr/bin/curl -XPUT http://localhost:9200/_snapshot/total/$(date +%Y%m%d%H%M%S)?wait_for_completion=true" ExecStart=/usr/bin/docker run --rm -v ... --volumes-from=... -e … jerob/docker- duplicity:latest bash /duplicity
  • 25. il deploy: ansible e cloudinit 1. ansible fa il push della config cloudinit 2. viene eseguito il setup cloudinit 3. vengono riavviati i container
  • 26. il deploy: ansible e cloudinit - name: stop services service: name: "{{item}}.service" state: stopped with_items: - nginx - varnish … sudo: yes - name: start services service: name: "{{item}}.service" state: started with_items: - pullimages - postgresusers …
  • 27. Conclusioni ● siamo volutamente partiti “bassi” (niente scheduling) ● entrare mentalmente nel “concetto” di container (stateless) ● certe cose sono difficili da mettere in un container (RDBMS)

Editor's Notes

  • #2: presentazione speakers ringrazio organizzazione per eventi in zona FE presentazione azienda presentazione talk: no verità assolute o arcani segreti, solo la “my way” (cit. Frank Sinatra) docker come black box, no dettagli tecnici, ma il suo uso in real life
  • #4: Il caso di studio che vogliamo presentarvi si basa su un progetto sviluppato da Abstract per un sito di promozione culturale sulle opere teatrali. L’obiettivo del progetto era aggiornare il portale attuale del cliente ad una diversa tecnologia, nello specifico una migrazione verso il cms Plone. Si tratta, per chi non lo conoscesse, di un cms opensource, scritto principalmente in python e che ha ormai 14anni di onorato servizio. Come tutti i pezzi di software non banali che raggiungono un certo grado di anzianità, anche Plone ha le sue peculiarità e best practice per funzionare correttamente. A tal proposito vedremo in seguito cos’è il buildout, strumento simile ad Ant per java.
  • #5: Per un progetto articolato come quello in questione, il solo cms non era sufficiente, perchè serviva anche l’aiuto di elasticsearch per la ricerca geolocalizzata degli eventi teatrali. Servivano anche haproxy per il bilanciamento del cluster applicativo, ovviamente nginx per il reverse proxing. Successivamente, siccome l’appetito si sa vien mangiando, al progetto si è unito anche un gestionale, sviluppato con Odoo. Quindi alla lista dei componenti coinvolti si aggiungevano odoo e postgres per la base dati. A questo punto siamo arrivati a ben 6 diversi componenti software, ogniuno dei quali va installato e configurato correttamente per interagire fra di loro. Ora non saranno i numeri che si possono raggiungere con i microcomponenti, ma è comunque un bel numero da gestire. Fare presente che il gruppo di lavoro era disomogeneo per quanto riguarda il sistema di sviluppo: alcuni su Mac, altri su Ubuntu, uno su Fedora<
  • #7: perchè è più leggero e agile di vagrant, puoi infatti prendere dal registry parti di software già containerizzati e comporre così l’environment più “sicuro” di un sistema di provisioning, anche se alla fine un sistema di provisioning lo usiamo lo stesso