venerdì 27 gennaio 2017

Docker su Centos 7

Ho provato a dare un'occhiata ai Container per un eventuale utilizzo parallelo a sostitutivo di alcune macchine virtuale. Quali sono le principali differenze:




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

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 Store

la 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)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

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




docker run --name lamp --link some-mysql -d httpd:alpine