2. Chi Sono
Gerardo Di Iorio
Programmatore presso
Organizzatore DevDay AV
Linux dal 1992 ( potevo utilizzare UNIX su x86)
3. Recap del talk precedente
Git - gestione del sorgente
● Uso di git
● Branch,Merge,Rebase,Cherry-pick
● Collaborazione con altri sviluppatori
● Pull,Push Fetch
Continuous Integration
● Effettua la Build e i Test
Accenno a Docker
4. DevOps
In informatica DevOps (dalla contrazione inglese di development, "sviluppo", e operations, qui simile a "messa in produzione" o
"deployment") è una metodologia di sviluppo del software che punta alla comunicazione, collaborazione e integrazione tra sviluppatori
e addetti alle operations dell'information technology (IT).[1]
DevOps vuole rispondere all'interdipendenza tra sviluppo software e IT
operations, puntando ad aiutare un'organizzazione a sviluppare in modo più rapido ed efficiente prodotti e servizi software.[2][3][4][5]
5. DevOps
L'integrazione continua è un metodo di sviluppo software in cui gli sviluppatori aggiungono
regolarmente modifiche al codice in un repository centralizzato, quindi la creazione di build e i test
vengono eseguiti automaticamente.
Distribuzione Continua è un metodo di sviluppo software in cui le modifiche al codice vengono
applicate a una build, testate e preparate per il rilascio in produzione in modo automatico.
Architettura di microservizi è un approccio alla progettazione in cui un'applicazione si basa su un
gruppo di servizi di minori dimensioni. Ogni servizio esegue il proprio processo e comunica con gli
altri servizi tramite un' interfaccia predefinita.
Infrastruttura Come Codice è una prassi secondo cui provisioning e gestione dell'infrastruttura
avvengono tramite metodologie di sviluppo di software e codice quali il controllo di versione e
l'integrazione continua.
6. Sviluppiamo un progetto in C
#include <stdio.h>
int main()
{
// printf() displays the string inside
quotation
printf("Hello, World!");
return 0;
}
Strumenti Necessari
Sviluppo
● Editor (Vim,Emacs,Visual Studio Code,Eclispe,etc)
● VCS (git,mercurial,bazar,etc)
● Compilatore (gcc,MVSC,etc)
● Header e Librerie per la compilazione
Debug & Run
● Librerie per il debug
● Librerie per il runtime
HelloWorld.c
Build
# gcc -o helloword helloword.c
Dipendenze
# ldd helloword
linux-vdso.so.1 (0x00007ffd5e5e3000)
libc.so.6 => /usr/lib/libc.so.6
(0x00007f02f1d10000)
/lib/ld-linux-x86-64.so.2 (0x00007f02f22d0000)
7. Setup ambiente : Progetto in C
Sviluppo
● Editor (Vim,Emacs,Visual Studio Code,Eclispe,etc)
● VCS (git,mercurial,bazar,etc)
● Compilatore (gcc,MVSC,etc)
● Header e Librerie per la compilazione
Debug & Run
● Librerie per il debug
● Librerie per il runtime
# sudo apt-get install vim
# sudo apt-get install git
# sudo apt-get install git
# sudo apt-get install gcc-4.6-base cpp-4.6
libgomp1 libquadmath0
# sudo apt-get install libc6-dev
# sudo apt-get install libc6-dbg
Solo le stesse librerie dinamiche che usa il
mio OS
Cosa devo installare sul mio pc ?
8. Progetto in C : static build
#include <stdio.h>
int main()
{
// printf() displays the string inside
quotation
printf("Hello, World!");
return 0;
}
Strumenti Necessari
Sviluppo
● Editor (Vim,Emacs,Visual Studio Code,Eclispe,etc)
● VCS (git,mercurial,bazar,etc)
● Compilatore (gcc,MVSC,etc)
● Header e Librerie per la compilazione
Debug & Run
● Nulla
HelloWorld.c
Build
# gcc -static -o helloword helloword.c
Nessuna Dipendenza
# ldd helloword
non e’ un eseguibile dinamico
9. Enviroment differenti : Build Android
Android Distribuzione consigliata:
Ubuntu 14.04
Ma io ho Fedora 27 !!!
10. Soluzione : Virtual Machine vs Container
● cosa serve ad un exe per essere eseguito ?
● Posso creare un ambiente isolato con tutte le corrette dipendenze ?
● Posso eseguire un comando in questo ambiente isolato ?
● Soluzione VM oppure Container
11. Container Vantaggi
● Replica dell’ambiente di produzione.
● Modulare
● Scalabile
● Separazione tra i servizi
● Portabile
● Personalizzabile
● Utilizzo solo le risorse necessarie
● Nessun Hypervisor
● Kernel condiviso
12. Container: Vantaggi DevOps
● Deployment semplificato: impacchettando un’applicazione in un
singolo immagine distribuibile e configurabile. Docker semplifica il
deployment di qualsiasi applicazione.
● Disponibilità istantanea: “virtualizzando” solo le componenti
necessarie all’esecuzione dell’applicazione il container si avvia in
un ventesimo di secondo, rispetto ai tempi di avvio di una VM
● Controllo granulare: i container consentono agli operatori e agli
sviluppatori di suddividere le risorse computazionali in microservizi,
garantendo così un controllo superiore sull’eseguibilità delle
applicazioni e un miglioramento delle prestazioni dell’intero sistema.
● Deploy semplificato: l’amministrazione dei cicli di rilascio delle
applicazioni è semplificato: basta pubblicare la nuova immagine
docker e ricaricare il container per avere tutto aggiornato
● Testing: le attività di testing traggono un beneficio,infatti il testing
avviene solo su container, che è la stessa situazione in ambiente di
produzione, isolato dagli altri ambienti.
13. ● 1979: Unix V7 Viene introdotta la system call chroot : cambia la root directory di un processo figlio in una nuova
posizione del filesystem. Permette l’isolazione del processo all’accesso del file-system
● 2000: FreeBSD Jails consente agli amministratori di suddividere un sistema in diversi sistemi indipendenti più
piccoli, denominati "jail", con la possibilità di assegnare un indirizzo IP per ogni sistema e configurazione.
● 2001: Linux VServer e’ un meccanismo in cui e’ possibile partizionare le risorse (filesystem,indirizi di
memoria,indirizzi di rete)
● 2004: Oracle Containers Solaris permette di gestire le risorse del sistema e la separazione fra zone, le quali erano
in grado di sfruttare le funzionalità di snapshot di ZFS.
● 2005: Open VZ (Open Virtuzzo) Tecnologia di virtualizzazione a livello di sistema operativo per Linux, che utilizza il
kernel linux con una patch per la virtualizzazione, isolamento, gestione delle risorse etc.
● 2006: Process Container è stato progettato per limitare, contabilizzare e isolare l'utilizzo delle risorse (CPU,
memoria, I / O del disco, rete) di una raccolta di processi. È stato rinominato "Control Groups (cgroups)" un anno
dopo e infine unito al kernel Linux 2.6.24.
● 2008: LXC stata la prima implementazione più completa di Linux container manager. È stato implementato nel 2008
utilizzando cgroup e spazi dei nomi Linux(namespaces) e funziona su un singolo kernel Linux senza richiedere
alcuna patch.
● 2011: Warden CloudFoundry ha avviato Warden nel 2011, utilizzando LXC nella fase iniziale e in seguito
sostituendolo con una propria implementazione.Warden include un servizio per gestire cgroup, spazi dei nomi e il
ciclo di vita del processo.
● 2013 : LMCTFY è stato lanciato nel 2013 come una versione open source dello stack container di Google, fornendo
contenitori per applicazioni Linux.
● 2013: Docker e il futuro Come ha fatto Warden, Docker ha utilizzato anche LXC nelle fasi iniziali e
successivamente ha sostituito quel gestore di container con la propria libreria, libcontainer.
Storia di Docker
14. Docker : Installazione
● L’installazione di Docker dipende dal sistema operativo
● Windows 10 ha bisogno di HyperV (Windows 10 Professional)
● Sistemi Windows senza HyperV (virtualbox image)
● Quando possibile seguire le instruzioni riportati sul sito di Docker:
○ Il processo di installazione è trasparente e standard : apt-get or yum
○ Tutte le dipendenze vengono automaticamente risolte
○ I file di configurazioni sono impostati correttamente
○ Gli aggiornmanti sono automatici
Get Docker https://www.docker.com/get-docker
15. Docker : Architettura
● Cosa è Docker?
● Docker è una piattaforma per sviluppatori e sysadmin per “ develop, ship, and run
applications”, basata su containers
● Docker è open-source, scritta in Go e originariamente basata su libvirt e LXC -
dopo rimpiazzata dalla libreria libcontainer, scritta in Go.
● Docker semplifica e standardizza la creazione e la manutenzione di containers,
eespone delle API semplici ed elegenti per effetuare query e azioni
● Architettura Client -- Server
● Docker Engine (Server) ha bisogno di un kernel 64bit e di essere avviata come root
● Docker cli (client) da qualsiasi device/piattaforma , si connette al Docker Engine via
Rest Api
16. Docker : Quale Versione ?
● Docker-EE
● Docker-CE Edge / Relase Channel
● Moby
17. Vocabolario Docker
Images Rappresenta la base di un Docker container, contiene l'intera applicazione.
Container L’unità standard nella quale vive e viene eseguita un comando
HUB servizio cloud o locale, dove si registrano e redistribuiscono le immagini di docker
Volumi E' un file system esterno al file system del container
Network tipologie di networking per comunicare tra container e host
18. Docker: Image
● Le immagini sono costruite sui cambiamenti del file system, generalmente da un'immagine di partenza, ed
arricchite da metadati.
● Ogni modifica è contenuta in un “layer”, identificata da un ID
● La costruzione di un'immagine è un'operazione incrementale
● Aggiornamento da/al docker hub non dovrò ricaricare tutta l'immagine ma solo le modifiche.
19. Docker: Container
● Il container è l'istanza di un'immagine.
● Il suo stato può essere salvato, tuttavia per il corretto
disaccoppiamento tra ambiente e persistenza dei dati è
opportuno creare dei volumi dedicati.
● Inizialmente il container è la copia di un'immagine, fino
alla prima modifica, successivamente l'immagine verrà
copiata e resa disponibile all'istanza di quel container,
lasciando inalterata l'immagine.
● Proprio per la natura effimera del container è opportuno
non salvare nulla all'interno di esso, si adotta il principio
di Separation of Concerns.
20. Docker: HUB
● è un repository pubblico dove vengono caricate le immagine.
● Immagini dei più diffusi software e di sviluppo web,database,etc
● Immagini Ufficiali
● Immagini pubbliche degli utenti
● Le immagini sono taggate versione,etc
● Possono essere caricate (cli,CI,travis,...)
● Possono essere scaricate
● Possiamo creare la nostra immagine e condividerla
● L’Hub puo’ creare/aggiornare autonomamente attraverso un Dockerfile
21. Docker: Volumi
I container possono essere cancellati e ricreati… Dove Salvo i Dati ?
Come faccio ad avere la persistenza dei dati ?
● Volume
● Bind Mounts (link container path con host folder)
File di configurazione,data storage, log etc...
22. Docker: Volumi
Se devo fare il sync del
backup verso S3 ?
Creo un container con il
comando S3, con il
volume backup!
23. Docker : Networking
● bridge quando sono necessari più contenitori per comunicare sullo stesso host Docker.
● host quando lo stack di rete non deve essere isolato dall'host Docker, ma si desidera isolare altri aspetti del
contenitore.
● overlay quando hai bisogno di contenitori in esecuzione su diversi host Docker per comunicare o quando più
applicazioni lavorano insieme utilizzando i servizi di sciame.
● Macvlan quando si esegue la migrazione da un'installazione di VM o si richiede che i contenitori sembrano host
fisici sulla rete, ognuno con un indirizzo MAC univoco.
● I plug-in di rete di terze parti consentono di integrare Docker con stack di rete specializzati.
24. Docker : Networking
● Con docker e’ possibile isolare i container utilizzando reti virtuali dedicate.
● La rete di default per docker e’ il bridge (docker0)
● I container possono collegarsi o collegarsi ad una rete in qualsiasi
momento
● E’ possibili effettuare un port mapping tra le porte del container e quella
dell’host
25. Docker Comandi
I comandi di docker sono strutturati
docker <comandoPrincipale> <comandoSecondario> [parametri]
Lista dei comandi
docker
La versione di docker installata sul sistema
docker version
Informazioni sull'installazione di docker del sistema
docker info
26. Docker Image
Lista delle immagini in cache locale
# docker image ls
Per scaricare un'immagine dall’ hub
# docker pull <nomeImmagine>
Per eliminare un' immagine
# docker rmi <nomeImmagine>
Per rimuovere le immagini non usate:
# docker image prune
Storia di un'immagine
# docker image history <nomeImmagine>
Per visualizzare contenuto/configurazione di un'immagine
# docker image inspect <nomeImmagine>
Per creare un immagine da tar
# docker image import <file|url> <nomeImmagine:[tag]>
27. Docker Container
Lista di tutti i container
# docker ps -a
Container attivi
# docker ps
Creare un container da un immagine
# docker run <nomeImmagine>
Crea una immagine da un container
# docker commit
Avviare un comando nel container in modo interattivo
# docker exec -it <nomeContainer|idContainer> <command>
Per visualizzare contenuto/configurazione di un'container
# docker inspect <nomeContainer>
Cancellare un container
# docker rm <nomeContainer>
28. Docker Container -> Image
Partendo da un immagine base la modifichiamo per creare una nostra immagine
# docker create --name web -p 8080:80 nginx:alpine
7e3daf8129b286c5b8febe4675408fa3dcdc12b3b30a035370dfd1847dbf2385
# docker cp index.html web:/usr/share/nginx/html/
# docker start web
web
# curl localhost:8080
Adesso vogliamo creare la nostra immagine da questo container
# docker ps -a (Ho il commit dello stato del container)
# docker commit -m”Web + html” -a “DevDayBN” <commit> devdaybnweb
29. Docker Volume
Crea un volume
# docker volume create
Elenco dei volumi
# docker volume ls
Eliminare i volumi non usati
# docker volume prune
Eliminare un volume
# docker volume rm
Per visualizzare contenuto/configurazione di un volume
# docker inspect <nomeVolume>
Per dare un nome al volume
# docker volume create -d <nomeVolume>
30. Variabili di Ambiente
# curl -I HEAD -i localhost:8080
# docker exec -it web date
La Data e’ sbagliata, devo configurare /etc/localtime correttamente
● devo montare il container settare la timezone
● ma se devo simulare un server che si trova in America ?
● ma se devo simulare un server che si trova in Cina ?
# docker exec -it web env TZ=Europe/Rome date
31. Dockerfile
Il Dockerfile è un file ben preciso che ci permette di creare
un'immagine,
eseguendo una serie di comandi ben precisi
specificando eventualmente delle opzioni,
che risulterebbero scomode da scrivere su una sola riga in console.
Per creare un immagine da un Dockerfile
# docker image build -t nodewebapp .
# docker run -p 8080:8080 nodewebapp
# curl localhost:8080
FROM node:carbon
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND
package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=production
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
32. Docker Container : Progetto in C
Cli
# docker run --rm --user="$(id -u):$(id -g)" --net=none -v "$PWD":/tmp
frolvlad/alpine-gcc gcc /tmp/helloworld.c -o /tmp/helloworld -static
Dockerfile
FROM frolvlad/alpine-gcc
RUN mkdir -p /app
WORKDIR /app
COPY helloworld.c .
RUN gcc -static -o helloworld helloworld.c
FROM scratch
COPY --from=0 /app/helloworld /helloworld
CMD ["/helloworld"]
33. Docker Container : Build Arduino
Docker image per compilare Firmaware per
Arduino
https://github.com/opsxcq/docker-dev-arduino
34. Docker compose
Il docker-compose.yml è un file ben preciso, scritto in yaml, che ci permette di
creare un ambiente a partire da uno o più container.
Permette il settaggio di:
● variabili
● variabili d'ambiente
● porte
● referenze ad altri container
● volumi
● reti
35. Docker compose WordPress
version: '2'
services:
wordpress:
image: wordpress:latest # https://hub.docker.com/_/wordpress/
ports:
- 127.0.0.1:80:80 # change ip if required
volumes:
- ./config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- ./wp-app:/var/www/html # Full wordpress project
#- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name # Plugin development
#- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name # Theme development
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
depends_on:
- db
networks:
- wordpress-network
db:
image: mysql:latest # https://hub.docker.com/_/mysql/ - or mariadb https://hub.docker.com/_/mariadb
ports:
- 127.0.0.1:3306:3306 # change ip if required
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: password
networks:
- wordpress-network
networks:
wordpress-network:
driver: bridge
https://github.com/nezhar/wordpress-docker-compose
36. Docker & DevOps
Con i container posso ricreare l’ambiente per la build e di test
Con i container posso ricreare l’ambiente di produzione
Posso gestire in modo semplice i microservizi
Infrastruttura Come Codice