L’evoluzione dei metodi di sviluppo di un’applicazione verso il mondo cloud sono la forza motrice che spinge alla creazione di servizi di nuova generazione incapsulati in strutture software denominate container.

Come trattato nel precedente articolo, Photon, Docker e i container rappresentano gli oggetti architetturali frutto di una rivoluzione nel modo di progettare applicazioni cloud-native.  Analizzata in breve la questione dal punto di vista dei sistemi, giunge ora il momento di approfondire il tema in ottica “devops”, partendo cioè dalla costruzione delle immagini dei container fino ad arrivare alla loro esecuzione.

Sviluppare nel "Datacenter-in-a-box"

Riprendendo quanto illustrato in precedenza, l’ambiente di lavoro formato dal container engine di Docker, che gira all’interno di un sistema Photon diventano la piattaforma di sviluppo o di servizio a seconda dell’infrastruttura hardware e virtuale che viene messa a disposizione. In fase di sviluppo è sufficiente avere un’istanza di Photon che gira nella propria workstation mediante un sistema di virtualizzazione; in quest’ultimo ambito VMware, oltre ai classici prodotti Workstation e Fusion mette a disposizione degli sviluppatori Mac, una versione del suo motore di virtualizzazione privo di interfaccia grafica, ma gratuito: App Catalyst (https://www.vmware.com/cloudnative/appcatalyst-download).

Seppur minimale, AppCatalyst riserva delle potenzialità in fatto di gestione e automazione. In un post del blog di William Lam viene illustrato un esempio di utilizzo mediante Vagrant. Ovviamente questa integrazione transita da un plugin per Vagrant, sviluppato da Fabio Rapposelli, membro del CNA team di VMware (https://github.com/vmware/vagrant-vmware-appcatalyst).

Dall'immagine al container

E’ giunto quindi il momento di costruire l’immagine del primo container, cioè la ricetta che consente di definire gli elementi costituivi dell’ambiente finale come:

  1. Il sistema operativo
  2. Le librerie ed eventuali “tools” di integrazione
  3. L’applicazione stessa.
  4. Le modalità di esecuzione.
FROM ubuntu:trusty
MAINTAINER Lino Telera Linoproject.net <Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.>

# Install base packages
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get -yq install \
python \
python-pip python-dev build-essential \
openssh-server \
libffi-dev libssl-dev \
git

RUN pip install --upgrade pip
RUN pip install --upgrade virtualenv
RUN pip install requests[security]
RUN pip install pyopenssl ndg-httpsclient pyasn1

## Working directory
RUN mkdir /opt/services

WORKDIR /opt/services/
RUN easy_install web.py

EXPOSE 443

ADD ws.py /opt/services/ws.py

CMD ["python", "/opt/services/ws.py","80"]

Definire un Dockerfile è un’operazione semplice, in quanto rispecchia similmente le azioni che si compiono durante la configurazione di un sistema operativo. Dopo aver scelto l’immagine base (definita nella sintassi FROM), in questo caso l’immagine di Ubuntu-14.04, è sufficiente inserire le componenti applicative necessarie al funzionamento del servizio (definite mediante il comando RUN). In aggiunta è possibile specificare alcune configurazioni tipiche del container, come la cartella di lavoro (WORKSPACE) e le porte di comunicazione con il mondo esterno (EXPOSE).

L’applicazione vera e propria verrà posizionata nella stessa directory in cui è presente il Dockerfile e mediante l’istruzione ADD è possibile inserire file locali direttamente all’interno dell’immagine stessa; in alternativa è possibile utilizzare sistemi come “git” o “curl” per aggiungere applicazioni sviluppate all’interno di una repository personale o provenienti da terze parti. Esiste infine un modo largamente utilizzato dagli sviluppatori che prevede la possibilità di condividere una directory di Photon con una all’interno del container permettendo così di sviluppare direttamente nel container in esecuzione, senza dover ripetere le operazioni di costruzione dell’immagine.  Per ulteriori informazioni sulla sintassi dell’immagine docker, riferirsi alla guida ufficiale di Docker, alla sezione Dockerfile Reference (https://docs.docker.com/engine/reference/builder/).

Parlando dell’applicazione, l’esempio sopra citato prevede l’inserimento di un file python, che, attraverso le opportune librerie, genera un “webservice” in grado di rispondere con la scritta “hello from container” alla chiamata sulla porta 80:

#!/usr/bin/env python
import web


urls = (
'/say_hello', 'say_hello'
)

app = web.application(urls, globals())

class say_hello:
def GET(self):
return "hello from container"

if __name__ == "__main__":
app.run()

Build and Run

01 docker commands 1

Con pochi semplici comandi è possibile eseguire il build dell’immagine, l’elenco delle immagini presenti nel sistema locale e finalmente la messa in esecuzione del primo container:

02 browser ws

Questo modo di operare, apparentemente oneroso al mondo degli sviluppatori, permette di svincolare l’applicazione dal sistema sottostante rendendo specifico l’ambiente di esecuzione ma incrementandone drasticamente la portabilità. Di fatto:

L’eliminazione delle dipendenze infrastrutturali costituisce il valore aggiunto dello sviluppo mediante i container.

A questo si aggiunge la possibilità di istituire un modello scalabile: a parità di immagine si può ottenere uno o più container simili per logica di business che rende l’applicazione reattiva al carico di lavoro da svolgere. Attraverso interazione manuali o automatiche con il container engine è possibile riservare o liberare risorse computazionali in maniera dinamica semplicemente avviando o fermando i container.

Un’altra peculiarità delle immagini di Docker e dei container in generale, è l’approccio “fork”, cioè la possibilità di derivare nuove immagini partendo da quelle precedentemente presenti localmente o all’interno di “hub” pubblico o privato. Di fatto se un gruppo di applicazioni diverse necessita del medesimo ambiente di esecuzione, è possibile utilizzare un’immagine precedentemente costruita, apportando solo minime modifiche e derivando altre immagini.

Infine per distribuire le immagini di Docker, quindi le applicazioni, oltre al celeberrimo GitHub è possibile utilizzare il Docker Hub (https://hub.docker.com) o, in alternativa, Hub privati o di terze parti.  Per inciso, l’esempio sopra proposto è disponibile presso Docker Hub, all’indirizzo (https://hub.docker.com/r/linoproject/ws1/); quindi senza ripetere le fasi di costruzione dell’immagine, dalla propria istanza di Photon è possibile eseguire il container denominato “linoproject\ws1” utilizzando il solo comando di “run”:

docker run -d -p 80:80 --name ws1 linoproject/ws1

Il sistema locale, non trovando l’immagine, provvederà al download direttamente dal Docker Hub.

Controllo dei Container

Docker, come le altre piattaforme che gestiscono Container, è un sistema che prevede la possibilità di interazione remota mediante la propria “command line interface” o tramite tool di terze parti: p er permettere l’interazione remota occorre modificare il file di configurazione come segue:

# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS="-D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.106.130:2376"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"

La modifica prevede il riavvio del docker-engine, quindi lo spegnimento delle istanze.

A seguire

Si è visto come una semplice workstation si trasformi in un piccolo datacenter in grado di sviluppare e eseguire applicazioni cloud-native. Nel prossimo articolo verrà approfondita la questione dal punto di vista infrastrutturale, toccando temi come Photon Controller e la release di vSphere orientata alle cloud native application denominata vSphere Integrated Container.

L'autore

Lino Telera

Appassionato di informatica fin dalla tenera età di 11 anni, sviluppatore e system integrator dal 2001, sysadmin e system designer dal 2008. Pioniere della programmazione Ajax già nel 2007 è un utente Linux da più di 13 anni. Specializzato in software defined datacenter, network e desktop svolge attività di consulente su prodotti cloud presso un service provider italiano. E' stato presidente del Linux Users Group Cremona dal 2005 al 2007 ed è membro del board di VMware Users Group Italia dal 2015.
Blogger su www.linoproject.net, vExpert 2015, certificato VCP4, VCP5, VCP-Cloud, VCP5-DT.

banner5

fb icon evo twitter icon evo

Parola del giorno

L'acronimo SoC  (System on a Chip) nasce per descrivere quei circuiti integrati che, all'interno di un singolo chip fisico, contengono un...

>

YAML è un formato utilizzato per serializzare (ovvero salvare oggetti su supporti di memoria ad accesso seriale) dati, in modo...

>

Il termine Edge Computing descrive, all'interno di infrastrutture cloud-based, l'insieme di dispositivi e di tecnologie che permettono l'elaborazione dei dati ai...

>

L'acronimo FPGA  (Field Programmable Gate Array), descrive quei dispositivi hardware formati da un circuito integrato e con funzionalità programmabili tramite...

>

Il termine Agentless (computing) descrive operazioni dove non è necessaria la presenza e l'esecuzione di un servizio software (demone o...

>
Leggi anche le altre...

Download del giorno

Fiddler

Fiddler è un server proxy che può girare in locale per consentire il debug delle applicazioni e il...

>

Adapter Watch

Adapter Watch è uno strumento che permette di visualizzare un riepilogo completo e dettagliato delle informazioni riguardanti una determinata...

>

DNS DataView

DNS Lookup  è un tool a interfaccia grafica per effettuare il lookup DNS dal proprio PC, sfruttando i...

>

SolarWinds Traceroute NG

SolarWinds Traceroute NG è un tool a linea di comando per effettuare traceroute avanzati in ambiente Windows...

>

Network Inventory Advisor

Network Inventory Advisor  è uno strumento che permette di scansionare la rete e acquisire informazioni riguardanti tutti i...

>
Tutti i Download del giorno...

Archivio numeri

  • GURU advisor: numero 21 - maggio 2019

    GURU advisor: numero 21 - maggio 2019

  • GURU advisor: numero 20 - dicembre 2018

    GURU advisor: numero 20 - dicembre 2018

  • GURU advisor: numero 19 - luglio 2018

    GURU advisor: numero 19 - luglio 2018

  • GURU advisor: numero 18 - aprile 2018

    GURU advisor: numero 18 - aprile 2018

  • GURU advisor: numero 17 - gennaio 2018

    GURU advisor: numero 17 - gennaio 2018

  • GURU advisor: numero 16 - ottobre 2017

    GURU advisor: numero 16 - ottobre 2017

  • GURU advisor: numero 15 - luglio 2017

    GURU advisor: numero 15 - luglio 2017

  • GURU advisor: numero 14 - maggio 2017

    GURU advisor: numero 14 - maggio 2017

  • 1
  • 2
  • 3
  • Teslacrypt: rilasciata la chiave

    Gli sviluppatori del temuto ransomware TeslaCrypt hanno deciso di terminare il progetto di diffusione e sviluppo e consegnare al pubblico la chiave universale per decifrare i file. Read More
  • Proxmox 4.1 sfida vSphere

    Proxmox VE (da qui in avanti semplicemente Proxmox) è basato sul sistema operativo Debian e porta con sé vantaggi e svantaggi di questa nota distribuzione Linux: un sistema operativo stabile, sicuro, diffuso e ben collaudato. Read More
  • Malware: risvolti legali

    tutti i virus e in particolare i più recenti Ransomware, che rubano i vostri dati e vi chiedono un riscatto, violano la legge. Vediamo insieme come comportarsi, per capire anche se e quando bisogna sporgere denuncia. Read More
  • 1