Livin' with Docker - dallo sviluppo alla produzione

29
dallo sviluppo alla produzione Livin' with Docker abstract per DockerOps 2016 [giacomo.spettoli, simone.deponti]@abstract.it /

Transcript of Livin' with Docker - dallo sviluppo alla produzione

Page 1: Livin' with Docker - dallo sviluppo alla produzione

dallo sviluppo alla produzione

Livin' with Docker

abstract per DockerOps 2016 [giacomo.spettoli, simone.deponti]@abstract.it/

Page 2: Livin' with Docker - dallo sviluppo alla produzione

Indice (Spoiler alert!)

● Introduzione del caso di studio

● Perchè proprio docker?

● Lo sviluppo

● CI / CB / CD

● Deploy

● Produzione

Page 3: Livin' with Docker - dallo sviluppo alla 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)

Page 4: Livin' with Docker - dallo sviluppo alla produzione

Pecularità● vari strati software da configurare e

far interagire (nginx, elasticsearch,

postgres, haproxy.)

● gruppo di lavoro distribuito e

variabile per numero e componenti

Page 5: Livin' with Docker - dallo sviluppo alla produzione

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, ...)

Page 6: Livin' with Docker - dallo sviluppo alla produzione

...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)

Page 7: Livin' with Docker - dallo sviluppo alla produzione

la fase di sviluppo

Makefile + Ansible per il bootstrap

(download pacchetti, bower & grunt)

Docker-compose per l’orchestration dei

containers

Page 8: 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

Page 9: Livin' with Docker - dallo sviluppo alla produzione
Page 10: 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

Page 11: Livin' with Docker - dallo sviluppo alla produzione
Page 12: 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

Page 13: 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

Page 14: Livin' with Docker - dallo sviluppo alla produzione
Page 15: 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

Page 16: Livin' with Docker - dallo sviluppo alla produzione

l’hosting: CoreOS

● droplet CoreOS su DO

● containers orchestrati con systemd

● config via cloudinit

Page 17: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinit

1. ansible fa il push della config

cloudinit

2. viene eseguito il setup cloudinit

3. vengono riavviati i container

Page 18: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinitname: copy cloud-init

copy:

src: "cloudinit/{{inventory_hostname}}.yml"

dest: /etc/custom-cloud-init

owner: root

sudo: yes

Page 19: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinit

1. ansible fa il push della config

cloudinit

2. viene eseguito il setup cloudinit

3. vengono riavviati i container

Page 20: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinit

name: run cloudinit

shell: coreos-cloudinit -from-file=/etc/custom-cloud-

init

sudo: yes

Page 21: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinit#cloud-configwrite_files:

- path: /home/core/.docker/config.json owner: core:core permissions: 0644 content: | { "auths": { "https://registry.abstract.it": { "auth": "bWFjaGlu… ", "email": "[email protected]" } } }

Page 22: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinitcoreos: … 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 …

Page 23: Livin' with Docker - dallo sviluppo alla produzione

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

Page 24: Livin' with Docker - dallo sviluppo alla produzione

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

Page 25: Livin' with Docker - dallo sviluppo alla produzione

il deploy: ansible e cloudinit

1. ansible fa il push della config

cloudinit

2. viene eseguito il setup cloudinit

3. vengono riavviati i container

Page 26: Livin' with Docker - dallo sviluppo alla produzione

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 …

Page 27: Livin' with Docker - dallo sviluppo alla produzione

Conclusioni

● siamo volutamente partiti “bassi” (niente scheduling)

● entrare mentalmente nel “concetto” di container (stateless)

● certe cose sono difficili da mettere in un container (RDBMS)

Page 28: Livin' with Docker - dallo sviluppo alla produzione

Questions?

Thanks!

Page 29: Livin' with Docker - dallo sviluppo alla produzione

Giacomo [email protected]

Simone [email protected]