Livin' with Docker - dallo sviluppo alla produzione

G
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
1 de 29

Recomendados

Automation Night (Docker) por
Automation Night (Docker)Automation Night (Docker)
Automation Night (Docker)Giuliano Latini
1.1K vistas31 diapositivas
Introduzione a Docker (parte 2 - Pratica) por
Introduzione a Docker (parte 2 - Pratica)Introduzione a Docker (parte 2 - Pratica)
Introduzione a Docker (parte 2 - Pratica)Cristian Consonni
1.4K vistas22 diapositivas
Vagrant e Docker a confronto;scegliere ed iniziare por
Vagrant e  Docker a confronto;scegliere ed iniziareVagrant e  Docker a confronto;scegliere ed iniziare
Vagrant e Docker a confronto;scegliere ed iniziareDaniele Mondello
1.2K vistas18 diapositivas
Docker Fudamentals por
Docker FudamentalsDocker Fudamentals
Docker Fudamentalsmvetro
1.3K vistas22 diapositivas
Google cloud: Big Data + docker = kubernetes por
Google cloud: Big Data + docker = kubernetesGoogle cloud: Big Data + docker = kubernetes
Google cloud: Big Data + docker = kubernetesGiuliano Latini
971 vistas34 diapositivas
Introduzione pratica a docker, da chi lo ha appena conosciuto por
Introduzione pratica a docker, da chi lo ha appena conosciutoIntroduzione pratica a docker, da chi lo ha appena conosciuto
Introduzione pratica a docker, da chi lo ha appena conosciutoDaniele Megna
613 vistas26 diapositivas

Más contenido relacionado

La actualidad más candente

Introduzione a docker - DockerTutorial.it por
Introduzione a docker - DockerTutorial.itIntroduzione a docker - DockerTutorial.it
Introduzione a docker - DockerTutorial.itFabio Ros
167 vistas36 diapositivas
Microservices webinar EMEA Aug. 2017 por
Microservices webinar EMEA Aug. 2017Microservices webinar EMEA Aug. 2017
Microservices webinar EMEA Aug. 2017MongoDB
487 vistas59 diapositivas
Introduzione a Docker por
Introduzione a DockerIntroduzione a Docker
Introduzione a DockerRoberto Messora
448 vistas24 diapositivas
Docker por
Docker Docker
Docker Andrea Laspada
1.1K vistas11 diapositivas
Open Source Day 2015 - DBaaS con Docker: un caso di studio por
Open Source Day 2015 - DBaaS con Docker: un caso di studioOpen Source Day 2015 - DBaaS con Docker: un caso di studio
Open Source Day 2015 - DBaaS con Docker: un caso di studioPar-Tec S.p.A.
367 vistas24 diapositivas
Docker & DevOps por
Docker  & DevOpsDocker  & DevOps
Docker & DevOpsGerardo Di Iorio
590 vistas38 diapositivas

La actualidad más candente(20)

Introduzione a docker - DockerTutorial.it por Fabio Ros
Introduzione a docker - DockerTutorial.itIntroduzione a docker - DockerTutorial.it
Introduzione a docker - DockerTutorial.it
Fabio Ros167 vistas
Microservices webinar EMEA Aug. 2017 por MongoDB
Microservices webinar EMEA Aug. 2017Microservices webinar EMEA Aug. 2017
Microservices webinar EMEA Aug. 2017
MongoDB487 vistas
Open Source Day 2015 - DBaaS con Docker: un caso di studio por Par-Tec S.p.A.
Open Source Day 2015 - DBaaS con Docker: un caso di studioOpen Source Day 2015 - DBaaS con Docker: un caso di studio
Open Source Day 2015 - DBaaS con Docker: un caso di studio
Par-Tec S.p.A.367 vistas
Git/Continuous Integration/Docker: la terna dello sviluppo moderno. por Gerardo Di Iorio
Git/Continuous Integration/Docker: la terna dello sviluppo moderno.Git/Continuous Integration/Docker: la terna dello sviluppo moderno.
Git/Continuous Integration/Docker: la terna dello sviluppo moderno.
Gerardo Di Iorio339 vistas
High specialized vm on open stack cloud por Gabriele Baldoni
High specialized vm on open stack cloudHigh specialized vm on open stack cloud
High specialized vm on open stack cloud
Gabriele Baldoni93 vistas
Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa... por Natale Vinto
Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa...Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa...
Un'Infrastruttura di Sviluppo Web Enterprise Distribuita Basata su Modelli Pa...
Natale Vinto1.4K vistas
Introduzione DevOps con Ansible por Matteo Magni
Introduzione DevOps con AnsibleIntroduzione DevOps con Ansible
Introduzione DevOps con Ansible
Matteo Magni699 vistas
Workshop ASP.NET Core e Angular in produzione con Docker e Kubernetes por blexin
Workshop ASP.NET Core e Angular in produzione con Docker e KubernetesWorkshop ASP.NET Core e Angular in produzione con Docker e Kubernetes
Workshop ASP.NET Core e Angular in produzione con Docker e Kubernetes
blexin31 vistas
Con Aruba, a lezione di cloud #lezione 30 - parte 1: 'GitLab e Cloud Server ... por Aruba S.p.A.
Con Aruba, a lezione di cloud  #lezione 30 - parte 1: 'GitLab e Cloud Server ...Con Aruba, a lezione di cloud  #lezione 30 - parte 1: 'GitLab e Cloud Server ...
Con Aruba, a lezione di cloud #lezione 30 - parte 1: 'GitLab e Cloud Server ...
Aruba S.p.A.1.9K vistas
Meetup ASP.NET Core 2 e Docker por dotnetcode
Meetup ASP.NET Core 2 e Docker Meetup ASP.NET Core 2 e Docker
Meetup ASP.NET Core 2 e Docker
dotnetcode215 vistas
Usare SQL Server for Linux e Docker per semplificare i processi di testing - ... por Giulio Vian
Usare SQL Server for Linux e Docker per semplificare i processi di testing - ...Usare SQL Server for Linux e Docker per semplificare i processi di testing - ...
Usare SQL Server for Linux e Docker per semplificare i processi di testing - ...
Giulio Vian120 vistas
Apache Maven - Gestione di progetti Java e build automation por Tiziano Serritella
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
Tiziano Serritella2.1K vistas
Omnis italianmeeting 2016-10-20 por Romualdo Gobbo
Omnis italianmeeting 2016-10-20Omnis italianmeeting 2016-10-20
Omnis italianmeeting 2016-10-20
Romualdo Gobbo135 vistas

Destacado

Docker introduction por
Docker introductionDocker introduction
Docker introductiondotCloud
455.8K vistas29 diapositivas
Docker 101: Introduction to Docker por
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker, Inc.
71.2K vistas30 diapositivas
containerd the universal container runtime por
containerd the universal container runtimecontainerd the universal container runtime
containerd the universal container runtimeDocker, Inc.
11.2K vistas35 diapositivas
Ap Camp 2011 por
Ap Camp 2011Ap Camp 2011
Ap Camp 2011Enrico Pirozzi
1.6K vistas37 diapositivas
PostgreSQL : Tuning por
PostgreSQL : TuningPostgreSQL : Tuning
PostgreSQL : TuningEnrico Pirozzi
874 vistas24 diapositivas
Continuous Delivery Pipeline with Docker and Jenkins por
Continuous Delivery Pipeline with Docker and JenkinsContinuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and JenkinsCamilo Ribeiro
1.4K vistas59 diapositivas

Destacado(19)

Docker introduction por dotCloud
Docker introductionDocker introduction
Docker introduction
dotCloud455.8K vistas
Docker 101: Introduction to Docker por Docker, Inc.
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to Docker
Docker, Inc.71.2K vistas
containerd the universal container runtime por Docker, Inc.
containerd the universal container runtimecontainerd the universal container runtime
containerd the universal container runtime
Docker, Inc.11.2K vistas
Continuous Delivery Pipeline with Docker and Jenkins por Camilo Ribeiro
Continuous Delivery Pipeline with Docker and JenkinsContinuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and Jenkins
Camilo Ribeiro1.4K vistas
Container Orchestration Wars (Micro Edition) por Karl Isenberg
Container Orchestration Wars (Micro Edition)Container Orchestration Wars (Micro Edition)
Container Orchestration Wars (Micro Edition)
Karl Isenberg2.2K vistas
CI/CD with Docker, DC/OS, and Jenkins por Karl Isenberg
CI/CD with Docker, DC/OS, and JenkinsCI/CD with Docker, DC/OS, and Jenkins
CI/CD with Docker, DC/OS, and Jenkins
Karl Isenberg4.3K vistas
Jenkins Docker por Alex Soto
Jenkins DockerJenkins Docker
Jenkins Docker
Alex Soto65.3K vistas
DockerCon EU 2015: Continuous Integration with Jenkins, Docker and Compose por Docker, Inc.
DockerCon EU 2015: Continuous Integration with Jenkins, Docker and ComposeDockerCon EU 2015: Continuous Integration with Jenkins, Docker and Compose
DockerCon EU 2015: Continuous Integration with Jenkins, Docker and Compose
Docker, Inc.33.6K vistas
A Gentle Introduction To Docker And All Things Containers por Jérôme Petazzoni
A Gentle Introduction To Docker And All Things ContainersA Gentle Introduction To Docker And All Things Containers
A Gentle Introduction To Docker And All Things Containers
Jérôme Petazzoni60.6K vistas
Docker Compose by Aanand Prasad por Docker, Inc.
Docker Compose by Aanand Prasad Docker Compose by Aanand Prasad
Docker Compose by Aanand Prasad
Docker, Inc.33.4K vistas
Docker 101 - Nov 2016 por Docker, Inc.
Docker 101 - Nov 2016Docker 101 - Nov 2016
Docker 101 - Nov 2016
Docker, Inc.7.3K vistas
containerd summit - Deep Dive into containerd por Docker, Inc.
containerd summit - Deep Dive into containerdcontainerd summit - Deep Dive into containerd
containerd summit - Deep Dive into containerd
Docker, Inc.9.8K vistas
containerd and CRI por Docker, Inc.
containerd and CRIcontainerd and CRI
containerd and CRI
Docker, Inc.8.7K vistas
Driving containerd operations with gRPC por Docker, Inc.
Driving containerd operations with gRPCDriving containerd operations with gRPC
Driving containerd operations with gRPC
Docker, Inc.10.7K vistas

Similar a Livin' with Docker - dallo sviluppo alla produzione

Idp, passo dopo passo! por
Idp, passo dopo passo!Idp, passo dopo passo!
Idp, passo dopo passo!Claudio Marotta
248 vistas45 diapositivas
Azure cointainer instances e sql server por
Azure cointainer instances e sql serverAzure cointainer instances e sql server
Azure cointainer instances e sql serverDanilo Dominici
77 vistas35 diapositivas
Distribuire una libreria Java per usarla come dipendenza gradle por
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradlePaolo Montalto
1.3K vistas51 diapositivas
Personal Cloud por
Personal CloudPersonal Cloud
Personal CloudNaLUG
26 vistas36 diapositivas
Kubernetes e bello, sicuro è meglio! por
Kubernetes e bello, sicuro è meglio!Kubernetes e bello, sicuro è meglio!
Kubernetes e bello, sicuro è meglio!Giuliano Latini
68 vistas26 diapositivas
VS Package @ CD2008 por
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008Mauro Servienti
641 vistas49 diapositivas

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

Azure cointainer instances e sql server por Danilo Dominici
Azure cointainer instances e sql serverAzure cointainer instances e sql server
Azure cointainer instances e sql server
Danilo Dominici77 vistas
Distribuire una libreria Java per usarla come dipendenza gradle por Paolo Montalto
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradle
Paolo Montalto1.3K vistas
Personal Cloud por NaLUG
Personal CloudPersonal Cloud
Personal Cloud
NaLUG26 vistas
Kubernetes e bello, sicuro è meglio! por Giuliano Latini
Kubernetes e bello, sicuro è meglio!Kubernetes e bello, sicuro è meglio!
Kubernetes e bello, sicuro è meglio!
Giuliano Latini68 vistas
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8 por DrupalDay
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
DrupalDay235 vistas
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8 por bmeme
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
bmeme196 vistas
AWS CDK infrastructure is code por Enrico Pesce
AWS CDK infrastructure is codeAWS CDK infrastructure is code
AWS CDK infrastructure is code
Enrico Pesce107 vistas
Meetup Azure DevOps por dotnetcode
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
dotnetcode233 vistas
ASP.NET Core 2 e Docker por Luca Congiu
ASP.NET Core 2 e DockerASP.NET Core 2 e Docker
ASP.NET Core 2 e Docker
Luca Congiu83 vistas
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S... por Gianluca Carucci
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
Gianluca Carucci1.1K vistas
Come portare il profiler di symfony2 in drupal8 por Luca Lusso
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
Luca Lusso1K vistas
Meetup Azure DevOps por dotnetcode
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
dotnetcode52 vistas
Infrastructure as code: Kubernetes on ACS por Nucleode Srl
Infrastructure as code: Kubernetes on ACSInfrastructure as code: Kubernetes on ACS
Infrastructure as code: Kubernetes on ACS
Nucleode Srl325 vistas
Drupal 8 - dal download del core alla pubblicazione in produzione por sparkfabrik
Drupal 8 - dal download del core alla pubblicazione in produzioneDrupal 8 - dal download del core alla pubblicazione in produzione
Drupal 8 - dal download del core alla pubblicazione in produzione
sparkfabrik667 vistas

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": "xyz@abstract.it" } } }
  • 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)

Notas del editor

  1. 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
  2. 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.
  3. 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<
  4. 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