Con una piat­ta­for­ma di con­te­ni­to­ri Docker potete ripartire nel network ap­pli­ca­zio­ni sotto forma di task in modo veloce, semplice e con notevole risparmio di risorse. Tutto quello di cui avete bisogno è il cluster manager Swarm, che dalla versione di Docker 1.12.0 è parte nativa di Docker Engine come “Swarm-mode” e con­se­guen­te­men­te il software centrale della piat­ta­for­ma di con­te­ni­to­ri.

Docker Swarm vi permette di scalare le ap­pli­ca­zio­ni in con­te­ni­to­ri, ese­guen­do­le in un numero qualsiasi di istanze su qualsiasi numero di nodi del vostro network. Se al contrario volete eseguire un’ap­pli­ca­zio­ne multi-con­te­ni­to­re in un cluster (ope­ra­zio­ne chiamata “stack” in Docker), potete ricorrere a Compose, un tool di Docker. Vi spie­ghia­mo ora i concetti basilari dell’or­che­stra­zio­ne Docker con Swarm e Compose mo­stran­do­vi con­cre­ta­men­te le im­ple­men­ta­zio­ni sulla base di esempi di codice.

Docker Swarm

Swarm, nato dagli stessi svi­lup­pa­to­ri di Docker, raggruppa un qualsiasi numero di host docker in un unico cluster, per­met­ten­do la gestione cen­tra­liz­za­ta dei cluster e l’or­che­stra­zio­ne dei con­te­ni­to­ri. Fino alla versione di Docker 1.11, Swarm doveva essere im­ple­men­ta­to come tool separato, mentre le versioni più recenti della piat­ta­for­ma di con­te­ni­to­ri sup­por­ta­no uno swarm mode nativo: così qualunque utente di Docker può usufruire del cluster manager in­stal­lan­do Docker Engine.

Docker Swarm si basa su un’ar­chi­tet­tu­ra master-slave. Ogni cluster di Docker (lo sciame) consta di almeno un nodo manager e di una quantità a piacere di nodi la­vo­ra­to­ri (worker). Mentre lo swarm manager è re­spon­sa­bi­le per l’am­mi­ni­stra­zio­ne del cluster e la de­le­ga­zio­ne di compiti, gli swarm worker prendono in carico l’ese­cu­zio­ne di unità la­vo­ra­ti­ve (“tasks”). Inoltre le ap­pli­ca­zio­ni del con­te­ni­to­re vengono suddivise come co­sid­det­ti servizi (“services”) in un numero qualunque di account Docker.

Nella ter­mi­no­lo­gia di Docker il concetto di “servizio” indica una struttura astratta mediante la quale potete definire compiti che devono essere eseguiti nel cluster. Ogni servizio consta di un set di task singoli, che vengono elaborati ciascuno nel proprio con­te­ni­to­re su uno dei nodi del cluster. Quando create un servizio de­ter­mi­na­te su quale immagine di con­te­ni­to­re si basa e quindi quali comandi verranno eseguiti nel con­te­ni­to­re, dato che i comandi vengono eseguiti in base all’immagine. Docker Swarm supporta due modalità nelle quali sono definiti i servizi Swarm: servizi replicati e globali.

  • Servizi replicati: un servizio replicato è un task che viene eseguito in un numero di repliche definite dall’utente. Ogni replicato è un’istanza del con­te­ni­to­re di Docker definito nel servizio. I servizi replicati vengono scalati man mano che gli utenti creano più repliche. Un server web come NGINX si può ad esempio impostare a una sola riga di comando a 2, 4 o 100 istanze a seconda delle esigenze.
  • Servizi globali: eseguendo un servizio in modalità globale, ogni nodo di­spo­ni­bi­le nel cluster inizia un task per il relativo servizio. Se ag­giun­ge­te un nuovo nodo al cluster, lo swarm manager gli assegna im­me­dia­ta­men­te un’attività del service globale. I service globali si prestano ad esempio ad ap­pli­ca­zio­ni di mo­ni­to­rag­gio o programmi antivirus.

Un campo centrale di ap­pli­ca­zio­ne di Docker Swarm è la ri­par­ti­zio­ne del carico. Nella modalità swarm, Docker dispone di funzioni integrate di load balancing: se per esempio eseguite un server web NGINX con 4 istanze, Docker di­stri­bui­sce in modo in­tel­li­gen­te le richieste in arrivo alle istanze dei server di­spo­ni­bi­li.

Docker Compose

Docker Compose vi permette di definire ap­pli­ca­zio­ni multi-con­te­ni­to­re – le co­sid­det­te “stacks” o pile – e volendo di eseguirle su un unico nodo Docker o nel cluster; inoltre il tool fornisce righe di comando con le quali potete gestire l’intero ciclo vitale delle vostre ap­pli­ca­zio­ni.

Docker definisce gli stack come gruppi di servizi collegati che con­di­vi­do­no di­pen­den­ze software e che sono or­che­stra­ti e scalati. Uno stack di Docker vi permette di definire diverse fun­zio­na­li­tà di un’ap­pli­ca­zio­ne in un file centrale (il docker-compose.yml) e di iniziare da qui ad eseguirle insieme in un runtime en­vi­ron­ment isolato am­mi­ni­stran­do­le in modo cen­tra­liz­za­to.

Con alcuni sistemi operativi Compose va in­stal­la­to se­pa­ra­ta­men­te: se uti­liz­za­te la piat­ta­for­ma di con­te­ni­to­ri Docker nell’ambito delle in­stal­la­zio­ni desktop Docker per il Mac o Docker per Windows, Docker Compose è già contenuto nelle funzioni e lo stesso vale per Docker Toolbox, che è di­spo­ni­bi­le per i vecchi sistemi Mac o Windows; se invece uti­liz­za­te Docker con Linux o con Windows Server 2016, è ne­ces­sa­ria un’in­stal­la­zio­ne manuale del tool.

In­stal­la­zio­ni di Compose con Linux

Per scaricare i file binari di Compose dal re­po­si­to­ry di GitHub, aprite il terminale ed eseguite il seguente comando:

sudo curl -L https://github.com/docker/compose/releases/download/1.18  
.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Date a tutti gli utenti il permesso di eseguire i file binari:

sudo chmod +x /usr/local/bin/docker-compose

Con il comando seguente potete con­trol­la­re se il tool è stato in­stal­la­to cor­ret­ta­men­te:

docker-compose -version

Se l’in­stal­la­zio­ne è stata ef­fet­tua­ta con successo, avrete come output del terminale il numero di versione del tool.

In­stal­la­zio­ne di Compose con Windows Server 2016 (solo Docker EE per Windows)

Avviate il Po­wer­Shell come am­mi­ni­stra­to­re e date il seguente comando per avviare il download dei file binari di Compose dal re­po­si­to­ry di GitHub:

Invoke-WebRequest 
"https://github.com/docker/compose/releases/download/1.18.0/docker-compose-
Windows-x86_64.exe" -UseBasicParsing -OutFile
$Env:ProgramFiles\docker\docker-compose.exe

Avviate i file ese­gui­bi­li per in­stal­la­re Docker Compose.

N.B.

Potete trovare maggiori in­for­ma­zio­ni sui tool di Docker come Swarm e Compose nel nostro articolo sull’eco­si­ste­ma Docker.

Tutorial: Docker Swarm e Compose nell’ap­pli­ca­zio­ne

Per poter gestire app multi-con­te­ni­to­re con Docker nel cluster, avete bisogno di uno sciame (swarm), cioè di un cluster di Docker Engine in modalità swarm, nonché di Compose, tool di Docker.

Nella prima parte del nostro tutorial potete vedere come giungere in pochi passi al vostro sciame con Docker. La pro­du­zio­ne di app multi-con­te­ni­to­re con Docker Compose e il de­ploy­ment nel cluster saranno invece tema della seconda parte.

Consiglio

Nel nostro articolo sui fon­da­men­ti della piat­ta­for­ma di con­te­ni­to­ri trovate un’in­tro­du­zio­ne a Docker e una guida passo per passo all’in­stal­la­zio­ne di Docker Engine con Linux.

Parte prima: Docker in modalità swarm

Per “sciame” si intende un numero a piacere di Docker Engine in modalità swarm. Ogni Docker Engine funziona su un nodo separato e lo lega nel cluster.

La pro­du­zio­ne di cluster Docker richiede tre passaggi:

  1. Preparare gli host Docker
  2. Ini­zia­liz­za­re swarm
  3. Collegare gli host Docker nello sciame
N.B.

In al­ter­na­ti­va si può trasporre in swarm mode (sciamare) un singolo Docker Engine in un ambiente di sviluppo locale. In questi casi si parla di un single-node swarm.

Passo 1: Preparare gli host Docker

Per la pre­pa­ra­zio­ne di nodi Docker si consiglia di ricorrere al tool di pro­vi­sio­ning Docker Machine, che facilita l’im­ple­men­ta­zio­ne degli host Docker (chiamati anche “doc­ke­ri­zed hosts”, host virtuali inclusivi di Docker Engine). Con Docker Machine si possono di­stri­bui­re gli account per il vostro sciame su qualsiasi in­fra­strut­tu­ra e gestirli da remoto. I plug-in del driver Docker Machine sono forniti da diverse piat­ta­for­me cloud. Ciò riduce lo sforzo di pro­vi­sio­ning di host Docker a fornitori come Amazon Web Services (AWS) o Digital Ocean a un’unica riga di codice. Per creare un host Docker (qui: docker-sandbox) nell’in­fra­strut­tu­ra di Digital Ocean, uti­liz­za­te il seguente codice:

$ docker-machine create --driver digitalocean --digitalocean-access-token xxxxx docker-sandbox

Per AWS potete creare un host Docker (qui: aws-sandbox) con il seguente comando:

$ docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T93C******* aws-sandbox
N.B.

I caratteri xxxxx e ****** fungono da me­ta­ca­rat­te­re per token di accesso o chiavi che potete generare at­tra­ver­so il vostro account cliente presso i ri­spet­ti­vi fornitori.

Passo 2: ini­zia­liz­za­re Swarm

Dopo aver preparato il numero de­si­de­ra­to di host virtuali per il vostro sciame, potete am­mi­ni­strar­li at­tra­ver­so Docker Machine e rag­grup­par­li in un cluster con Docker Swarm. In­nan­zi­tut­to accedete al nodo che volete uti­liz­za­re come “swarm manager”. Docker Machine offre il seguente comando per costruire una con­nes­sio­ne criptata SSH all’host Docker:

docker-machine ssh MACHINE-NAME
N.B.

So­sti­tui­te il me­ta­ca­rat­te­re MACHINE-NAME con il nome dell’host Docker a cui volete accedere.

Una volta ef­fet­tua­ta la con­nes­sio­ne al nodo de­si­de­ra­to, uti­liz­za­te il seguente comando per ini­zia­liz­za­re uno sciame:

docker swarm init [OPTIONS]

A seconda dell’opzione scelta (vedi do­cu­men­ta­zio­ne), il comando docker swarm init definisce il nodo at­tual­men­te scelto come swarm manager e genera due token casuali: un token manager e un token worker.

Swarm initialized: current node (1ia0jlt0ylmnfofyfj2n71w0z) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377
Per aggiungere un manager a questo swarm, invece, date il comando
docker swarm join-token manager 
e seguite le istruzioni.

Il comando docker swarm init genera inoltre un output di terminale che comprende tutte le in­for­ma­zio­ni di cui avete bisogno per ag­giun­ge­re altri account al vostro sciame.

N.B.

Nor­mal­men­te docker swarm init viene uti­liz­za­to con il flag --advertise-addr, che indica quale indirizzo IP debba essere uti­liz­za­to per gli accessi API e per l’overlay net­wor­king. Se l’indirizzo IP non dovesse essere indicato espli­ci­ta­men­te, Docker con­trol­le­rà au­to­ma­ti­ca­men­te a quale indirizzo IP è rag­giun­gi­bi­le il sistema scelto se­le­zio­nan­do­lo di­ret­ta­men­te. Se un nodo ha più di un indirizzo IP, occorre mettere il flag cor­ri­spon­den­te. Salvo diversa in­di­ca­zio­ne, Docker utilizza la porta 2377.

Passo 3: collegare gli host Docker nello sciame

Dopo che avete ini­zia­liz­za­to il vostro sciame con il nodo scelto come swarm manager, potete ag­giun­ge­re una quantità di nodi manager o worker a piacere, uti­liz­zan­do il comando docker swarm join in com­bi­na­zio­ne con il token cor­ri­spon­den­te.

3.1 Come ag­giun­ge­re un nodo worker: se volete ag­giun­ge­re al vostro sciame un nodo worker, accedete at­tra­ver­so docker-machine al nodo cor­ri­spon­den­te ed eseguite il seguente comando:

docker swarm join [OPTIONS] HOST:PORT

Parte ob­bli­ga­to­ria del comando docker swarm join è il flag --token, che contiene il token per l’accesso al cluster.

docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377

Nell’esempio citato il comando contiene il token worker generato pre­ce­den­te­men­te nonché l’indirizzo IP presso il quale è di­spo­ni­bi­le lo swarm manager.

Se non avete sottomano il token cor­ri­spon­den­te, lo potete in­di­vi­dua­re at­tra­ver­so docker swarm join-token worker.

3.2 Come ag­giun­ge­re un nodo master: se de­si­de­ra­te ag­giun­ge­re al vostro sciame un ulteriore nodo manager, ac­cer­ta­te­vi in­nan­zi­tut­to del token manager. Eseguite inoltre il comando docker swarm join-token manager sull’account manager dove avete ini­zia­liz­za­to lo sciame e seguite le in­di­ca­zio­ni sul terminale.

Docker genera un token manager che può essere eseguito in com­bi­na­zio­ne con il comando docker swarm join e con l’indirizzo IP da voi definito su un host Docker a scelta, in modo da unirlo allo sciame in qualità di manager.

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-ed2ct6pg5rc6vp8bj46t08d0i \
10.0.2.15:2377

3.3 Pa­no­ra­mi­ca di tutti i nodi nello sciame: potete ottenere una pa­no­ra­mi­ca su tutti i nodi collegati al vostro sciame eseguendo il comando di ma­na­ge­ment docker node ls su uno dei vostri nodi manager.

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER
jhy7ur9hvzvwd4o1pl8veqms3    worker2   Ready   Active
jukrzzii3azdnub9jia04onc5    worker1   Ready   Active
1ia0jlt0ylmnfofyfj2n71w0z *  osboxes   Ready   Active        Leader

I nodi manager sono indicati nella pa­no­ra­mi­ca come Leader.

N.B.

Se volete eliminare un nodo dal vostro sciame, potete loggarvi nell’host cor­ri­spon­den­te ed eseguire il comando docker swarm leave. Se il nodo è uno swarm manager, dovete forzare l’at­tua­zio­ne del comando con il flag --force.

Parte seconda: eseguire app multi-con­te­ni­to­re nel cluster

Nella prima parte del nostro tutorial avete imparato come preparare gli host Docker con Docker Machine e come riunirli in modalità swarm sotto forma di cluster. Ora vi mo­stre­re­mo come uti­liz­za­re Docker Compose per definire i diversi servizi come app multi-con­te­ni­to­re compatte ed eseguirle nel cluster.

La pre­pa­ra­zio­ne di app multi-con­te­ni­to­re nel cluster consta di cinque passi:

  1. Creare un Docker Registry locale.
  2. Definire l’app multi-con­te­ni­to­re come stack.
  3. Testare l’app multi-con­te­ni­to­re con Compose.
  4. Caricare l’immagine nel Registry.
  5. Eseguire lo stack nel cluster.

Passo 1: avviare un Docker Registry locale come servizio

Poiché uno sciame Docker consiste di un numero a piacere di Docker Engines, le ap­pli­ca­zio­ni si possono gestire nel cluster soltanto se tutti i Docker Engines che par­te­ci­pa­no hanno accesso all’immagine dell’ap­pli­ca­zio­ne. Per questo serve un Registry, ovvero un servizio centrale che vi permetta di am­mi­ni­stra­re le images e di metterle a di­spo­si­zio­ne nel cluster.

N.B.

Una “image” è un’immagine compatta ed ese­gui­bi­le di un’ap­pli­ca­zio­ne e contiene, oltre al codice di ap­pli­ca­zio­ne, tutte le di­pen­den­ze (ambiente runtime, librerie, variabili di ambiente e file di con­fi­gu­ra­zio­ne) di cui Docker necessita per eseguire le ri­spet­ti­ve ap­pli­ca­zio­ni come con­te­ni­to­re. In questo modo ogni con­te­ni­to­re è un’istanza di runtime di un’immagine.

1.1   Avviare Registry come service nel cluster: Per avviare un Registry Server locale come servizio nel cluster, uti­liz­za­te il comando docker service create:

docker service create --name registry --publish 5000:5000 registry:2

Il comando assegna a Docker il compito di avviare un servizio con il nome registry che ascolta alla porta 5000. Il primo valore dopo il flag --publish indica la porta host, il secondo la porta del con­te­ni­to­re. Il servizio è basato sull’image registry:2, che contiene un’im­ple­men­ta­zio­ne del Docker Registry http API V2 e può essere ottenuto li­be­ra­men­te tramite il Docker Hub.

1.2 Ve­ri­fi­ca­re lo status del Registry Service: Per esaminare lo status del Registry Service appena avviato, uti­liz­za­te il comando docker service ls

$ sudo docker service ls
ID            NAME      MODE        REPLICAS  IMAGE          PORTS
K2hq2ivnwuq4  registry  replicated  1/1       registry:2     *:5000->5000/tcp

Il comando docker service ls vi fornisce una lista di tutti i servizi in corso nel vostro cluster Docker.

1.3 Ve­ri­fi­ca­re la con­nes­sio­ne al Registry con cURL: As­si­cu­ra­te­vi di poter accedere al vostro Registry via cURL. Per farlo, eseguite il seguente comando:

$ curl http://localhost:5000/v2/

Se il vostro Registry funziona come previsto, il cURL dovrebbe fornire il seguente output:

{}
N.B.

Il cURL è un’in­ter­fac­cia a riga di comando con la quale si possono ri­chia­ma­re indirizzi web e caricare o scaricare file. Sul sito del software open source potete trovare maggiori in­for­ma­zio­ni sul cURL: curl.haxx.se

Passo 2: creare app multi-con­te­ni­to­re e definirle come stack

Nel passo suc­ces­si­vo create tutti i file che sono necessari per il de­ploy­ment di uno stack nel cluster di Docker e po­si­zio­na­te­li in una directory di progetto comune.

2.1 Creare una cartella di progetto: Create una directory di progetto con un nome qualunque, come ad esempio stackdemo.

$ mkdir stackdemo

Navigate nella directory del vostro progetto.

$ cd stackdemo

La vostra directory di progetto funge da cartella di raccolta per tutti i file necessari per eseguire la vostra app multi-con­te­ni­to­re; questi includono un file con il codice sorgente del­l'ap­pli­ca­zio­ne, ossia un file di testo in cui si definisce il software ne­ces­sa­rio per il fun­zio­na­men­to del­l'ap­pli­ca­zio­ne, così come un file Docker e un file Compose.

2.2 Creare la app: Create un’ap­pli­ca­zio­ne Python con il seguente contenuto e po­si­zio­na­te­la sotto il nome app.py nella directory di progetto.

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

L’ap­pli­ca­zio­ne di esempio app.py è una semplice ap­pli­ca­zio­ne web con una pagina iniziale che dice “Hello World!” e include un’in­di­ca­zio­ne su quante volte l’app è stata ri­chia­ma­ta. La base è il framework web open source Flask e il database open source in-memory Redis. 2.3 Definire i requisiti: Create un file di testo re­qui­re­men­ts.txt con il contenuto seguente e col­lo­ca­te­lo nella directory del progetto.

flask
redis

In re­qui­re­men­ts.txt definite su quale software si basa la vostra ap­pli­ca­zio­ne.

2.4 Creare un file Docker: Create un altro file di testo con il nome Doc­ker­fi­le, inserite il seguente contenuto e collocate anche questo file nella cartella di progetto.

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Il Doc­ker­fi­le contiene tutte le istru­zio­ni ne­ces­sa­rie per creare un’immagine di ap­pli­ca­zio­ne. Per esempio il Doc­ker­fi­le fa ri­fe­ri­men­to a re­qui­re­men­ts.txt, sta­bi­len­do in questo modo quale software in­stal­la­re per la gestione dell’ap­pli­ca­zio­ne.

Il Doc­ker­fi­le dell’esempio permette di creare un’immagine dell’ap­pli­ca­zio­ne web app.py in­clu­den­do tutti i requisiti (Flask e Redis).

2.5 Creare un file Compose: create un file di con­fi­gu­ra­zio­ne con il seguente contenuto e salvatelo come docker-compose.yml.

version: '3'
services:
    web:
        image: 127.0.0.1:5000/stackdemo
        build: .
        ports:
            - "8000:8000"
    redis:
        image: redis:alpine

Il docker-compose.yml permette di collegare tra di loro diversi servizi e di eseguirli insieme come unità, am­mi­ni­stran­do­li in modo centrale.

N.B.

Il file Compose è scritto in YAML, un lin­guag­gio di markup sem­pli­fi­ca­to uti­liz­za­to per rap­pre­sen­ta­re i dati strut­tu­ra­ti e uti­liz­za­to prin­ci­pal­men­te nei file di con­fi­gu­ra­zio­ne. Docker utilizza docker-compose.yml per con­fi­gu­ra­re cen­tral­men­te i servizi di un’ap­pli­ca­zio­ne multi-con­te­ni­to­re.

Nell’esempio preso in con­si­de­ra­zio­ne definiamo due servizi: un servizio web e uno Redis.

  • Servizio web: Il fon­da­men­to del “web service” è un’immagine che viene prodotta sulla base del Doc­ker­fi­le che avete creato nella directory stackdemo.
  • Servizio Redis: Per i servizi Redis non uti­liz­zia­mo immagini proprie: at­tin­gia­mo invece ad una Redis Image di­spo­ni­bi­le pub­bli­ca­men­te (redis:alpine) e re­pe­ri­bi­le at­tra­ver­so il Docker Hub.

Passo 3: testare l’app multi-con­te­ni­to­re con Compose

Per prima cosa testate lo­cal­men­te l’app multi-con­te­ni­to­re ese­guen­do­la sul vostro nodo manager.

3.1 Avviare la app: Per avviare il vostro stack uti­liz­za­te il comando docker-compose up in com­bi­na­zio­ne con il flag -d. Il flag attiva il “detached mode”, at­tra­ver­so il quale tutti i con­te­ni­to­ri vengono eseguiti in back­ground. In questo modo il vostro terminale è pronto a ricevere altri comandi.

$ sudo docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use the bundle feature of the Docker experimental build.
More info:
https://docs.docker.com/compose/bundles
Creating network "stackdemo_default" with the default driver
Creating stackdemo_web_1
Creating stackdemo_redis_1

3.2 Con­trol­la­re lo stato dello stack: Per ve­ri­fi­ca­re lo status del vostro stack eseguite il comando docker-compose ps. Vi­sua­liz­ze­re­te un output di terminale simile al seguente esempio:

$ sudo docker-compose ps
    Name         Command         State          Ports     
-------------------------------------------------------------------------
stackdemo_redis_   docker-        Up             6379/tcp       
1            entrypoint.sh                            
             redis ...                                
stackdemo_web_1    python app.py    Up             0.0.0.0:8000->80 
                                       00/tcp

Il comando docker-compose ps vi fornisce una pa­no­ra­mi­ca di tutti i con­te­ni­to­ri che sono stati avviati nel contesto della vostra ap­pli­ca­zio­ne multi-con­te­ni­to­re: nell’esempio riportato la lista comprende due con­te­ni­to­ri (uno per i servizi Redis e uno per quelli web).

3.3 Testare lo stack con cURL: Testate il vostro stack eseguendo l’in­ter­fac­cia a riga di comando cURL con l’indirizzo host locale (localhost o 127.0.0.1).

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

Al­ter­na­ti­va­men­te si può ri­chia­ma­re l’ap­pli­ca­zio­ne web nel browser.

3.4 Di­sat­ti­va­re un’app: Se de­si­de­ra­te di­sat­ti­va­re lo stack, eseguite il comando docker-compose down con il flag --volumes.

$ sudo docker-compose down --volumes
Stopping stackdemo_redis_1 ... done
Stopping stackdemo_web_1 ... done
Removing stackdemo_redis_1 ... done
Removing stackdemo_web_1 ... done
Removing network stackdemo_default

Passo 4: caricare un’immagine nel Registry

Prima di poter eseguire la vostra app multi-con­te­ni­to­re come ap­pli­ca­zio­ne ripartita nel cluster, dovete preparare tutte le immagini ne­ces­sa­rie at­tra­ver­so il Registry Service. Nell’esempio il­lu­stra­to si tratta solamente delle immagini create au­to­no­ma­men­te del web service (l’immagine Redis è a di­spo­si­zio­ne grazie a un Registry pubblico nel Docker Hub).

In Docker l’upload di immagini create lo­cal­men­te in un Registry centrale è chiamato “push”. A tal fine Docker Compose mette a di­spo­si­zio­ne il comando docker-compose push: ese­gui­te­lo nella vostra directory di progetto.

Tutte le immagini elencate all’interno di docker-compose.yml che sono state create lo­cal­men­te vengono caricate sul Registry.

$ sudo docker-compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

Nell’esempio in con­si­de­ra­zio­ne docker-compose push carica l’immagine dello stack stackdemo con il tag latest nel Registry locale sotto 127.0.0.1:5000.

Passo 5: eseguire uno stack nel cluster.

Se l’immagine del vostro stack è a di­spo­si­zio­ne at­tra­ver­so il Registry Service locale, l’ap­pli­ca­zio­ne multipla può essere eseguita nel cluster.

5.1 Eseguire stack nel cluster: anche nel cluster potete eseguire degli stack con una semplice riga di comando. A questo scopo la piat­ta­for­ma di con­te­ni­to­re pre­di­spo­ne il seguente comando:

docker stack deploy [OPTIONS] STACK
N.B.

Al posto del me­ta­ca­rat­te­re STACK mettete il nome dell’immagine stack che volete eseguire.

Eseguite il comando docker stack deploy su uno dei nodi manager del vostro sciame:

$ sudo docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build
Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

Il flag --compose-file indica il percorso del file Compose.

5.2 Ri­chia­ma­re lo status dello stack: Per ri­chia­ma­re lo status del vostro stack, uti­liz­za­te il seguente comando:

docker stack services [OPTIONS] STACK

Docker vi fornisce gli ID, i nomi, le modalità, le repliche, le immagini e le porte di tutti i servizi eseguiti all’interno del vostro stack.

$ sudo docker stack services stackdemo
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
cxyp7srukffy        stackdemo_web       replicated          1/1                 127.0.0.1:5000/stackdemo:latest   *:8000->8000/tcp
z0i2rtjbrj9s        stackdemo_redis     replicated          1/1                 redis:alpine

5.3 Testare l’app con cURL: Per testare un’app multi-con­te­ni­to­re, ri­chia­ma­te­la at­tra­ver­so l’indirizzo host locale alla porta 8000.

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

In al­ter­na­ti­va al cURL si può ri­chia­ma­re l’app at­tra­ver­so il browser. Per farlo, uti­liz­za­te un indirizzo host locale o l’indirizzo di un nodo a piacere. Grazie alla rete interna di routing potete accedere a ogni nodo del vostro sciame alla porta 8000 per poi essere ri­con­dot­ti alla vostra app.

5.4 Di­sat­ti­va­re uno stack: Se volete di­sat­ti­va­re il vostro stack, uti­liz­za­te il comando docker stack rm in com­bi­na­zio­ne con il nome dello stack.

$ docker stack rm stackdemo
Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

5.5 Di­sat­ti­va­re il Registry-Service: Se de­si­de­ra­te di­sat­ti­va­re il Registry Service, uti­liz­za­te il comando docker service rm con il nome del servizio (qui: registry).

$ docker service rm registry
In sintesi

Docker Swarm e Compose estendono le fun­zio­na­li­tà prin­ci­pa­li della piat­ta­for­ma di con­te­ni­to­ri con dei tool che vi per­met­to­no di gestire con il minimo sforzo ap­pli­ca­zio­ni complesse in sistemi di­stri­bui­ti. Il leader di mercato nella vir­tua­liz­za­zio­ne di con­te­ni­to­ri offre agli utenti una soluzione completa per l’or­che­stra­zio­ne dei con­te­ni­to­ri da un’unica fonte. Entrambi i tool sono dotati di una buona do­cu­men­ta­zio­ne e ag­gior­na­ti re­go­lar­men­te. Swarm e Compose si attestano come un’al­ter­na­ti­va valida a strumenti con­so­li­da­ti di terze parti come Ku­ber­ne­tes o Paramax.

Vai al menu prin­ci­pa­le