Un container usa lo stesso kernel del SO principale cosi' come le librerie e la memoria e questo genera un risparmio sensibile di risorse delle macchina
In generale un Container utilizza un solo applicativo (Web Server, Sql Server) ed come regola generale i dati non sono contenuti nel container; da cio' deriva che non e' necessario delle immagini disco (con poi la necessita' di espanderle) e i Container hanno dimensioni di qualche decina di Mb e non delle centinaia di Mb come accade per le immagini
Un problema serio e' pero' il grado di isolamento. Se viene compromesso un servizio di una macchina virtuale la macchina host risulta salva. Vi sono invece notizie di compromissioni d container che permettono di attaccare il sistema operativo host
Queste sono le regole auree riportate da Red Hat
1) Don’t store data in containers
2) Don’t ship your application in two pieces
3) Don’t create large images
4) Don’t use a single layer image
5) Don’t create images from running containers (questo vuol dire di non usare i commit ma i dockerfile per creare un nuovo container)
6) Don’t use only the “latest” tag
7) Don’t run more than one process in a single container
8) Don’t store credentials in the image. Use environment variables
9) Don’t run processes as a root user
10) Don’t rely on IP addresses
per installare Docker su Centos 7 si inizia aggiungendo il repository
yum-config-manager \ --add-repo \ https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo
e si installa la docker engine
yum -y install docker-engine makecache fast
si avvia quindi il servizio
si avvia quindi il servizio
service docker start
una volta installata la engine si inizia ad installare i container.
In generale un container si puo' installare mediante il comando pull ma se si lancia il comando run ed il container non e' installato allora sara' automaticamente installato
Per vedere che tutto funzioni la base e' installare questi due container
docker run hello-world
docker run docker/whalesay cowsay boo
il secondo mostra semplicemente il logo di Docker
dei container gia' pronti con le applicazioni piu' comuni si possono scaricare da Docker Storela lista dei container si ottiene mediante
docker images
mentre il carico di lavoro mediante
docker ps
per entrare in shell sulla container si usa
docker run -i -t [nome_container] /bin/bash
i container si stoppano con
docker stop [nome_container]
per aggiornare un container, visto che i dati risiedono nel file system normale dell'host, e' sufficiente stoppare il container, distruggerlo ed effettuare il pull della nuova immagine
Due esempi di comandi per lanciare dei servizi container
Apache (container httpd:alpine docker pull httpd:alpine)
docker run -d -p 8080:80 --name apache -v /home/linnocenti/docker/:/usr/local/apache2/htdocs/ httpd:alpine
La prima cosa da notare e' il forwarding della porta 80 del container verso la porta 8080 dell'host (per questo il container e' raggiungibile su http://localhost:8080)
La seconda e' che i file html statici sono depositati nel filesystem dell'host (/home/linnocenti/docker)
MySql (container mysql docker pull mysql)
Nel caso in cui si dovesse fare una installazione LAMP il container Httpd deve riuscire ad interagire con Mysql..questo e' effettuato mediante lo switch link
per aggiornare un container, visto che i dati risiedono nel file system normale dell'host, e' sufficiente stoppare il container, distruggerlo ed effettuare il pull della nuova immagine
Due esempi di comandi per lanciare dei servizi container
Apache (container httpd:alpine docker pull httpd:alpine)
docker run -d -p 8080:80 --name apache -v /home/linnocenti/docker/:/usr/local/apache2/htdocs/ httpd:alpine
La prima cosa da notare e' il forwarding della porta 80 del container verso la porta 8080 dell'host (per questo il container e' raggiungibile su http://localhost:8080)
La seconda e' che i file html statici sono depositati nel filesystem dell'host (/home/linnocenti/docker)
MySql (container mysql docker pull mysql)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run --name lamp --link some-mysql -d httpd:alpine