Post on 21-Jun-2020
transcript
Architettura dei Sistemi
Software
Luca Cabibbo
Luca Cabibbo ASWLuca Cabibbo ASW
Composizione e orchestrazione di
contenitori Dockerdispensa asw895
marzo 2019
Composizione e orchestrazione di contenitori Docker1
You can't play a symphony alone, it takes an orchestra to play it.
Navjot Singh Sidhu
Luca Cabibbo ASW
- Fonti
Docker
https://docs.docker.com/
Docker Compose
https://docs.docker.com/compose/
Docker – Swarm mode overview
https://docs.docker.com/engine/swarm/
Composizione e orchestrazione di contenitori Docker2
Luca Cabibbo ASW
- Obiettivi e argomenti
Obiettivi
introdurre ed esemplificare la composizione e l’orchestrazione di contenitori nel contesto di Docker
Argomenti
introduzione
composizione di contenitori
composizione con Docker Compose
orchestrazione con uno swarm Docker
discussione
Composizione e orchestrazione di contenitori Docker3
Luca Cabibbo ASW
* Introduzione
Un contenitore Docker ha in genere lo scopo di incapsulare ed eseguire una singola istanza di un servizio software individuale
tuttavia, un sistema software distribuito è composto da molti servizi software
inoltre, per motivi di scalabilità e disponibilità, questi servizi sono in genere anche replicati
la composizione e l’orchestrazione di contenitori riguardano la gestione e l’esecuzione di sistemi distribuiti complessi, scalabili e disponibili, realizzati con la tecnologia dei contenitori
Composizione e orchestrazione di contenitori Docker4
Luca Cabibbo ASW
Composizione e orchestrazione di contenitori
La composizione e l’orchestrazione di contenitori riguardano la gestione e l’esecuzione di sistemi distribuiti, scalabili e disponibili, realizzati con la tecnologia dei contenitori
la composizione di contenitori è la possibilità di definire ed eseguire applicazioni multi-servizi e multi-contenitore
ciascun contenitore viene utilizzato per eseguire un diverso servizio – l’intera applicazione è definita dalla composizione di questi servizi, tra loro distribuiti
inoltre, l’orchestrazione di contenitori riguarda l’esecuzione di applicazioni multi-servizi e multi-contenitore su più (molti) nodi
le funzionalità di base di Docker Engine esaminate finora consentono di gestire le forme più semplici di composizione
le applicazioni multi-contenitore e distribuite su più nodi possono essere gestite mediante funzionalità aggiuntive di Docker Engine e/o altri strumenti dell’ecosistema di Docker
Composizione e orchestrazione di contenitori Docker5
Luca Cabibbo ASW
* Composizione di contenitori
La composizione di contenitori è la possibilità di definire ed eseguire applicazioni multi-contenitore
come esempio, consideriamo di nuovo il servizio sentence per generare frasi in modo casuale – come presentata nella dispensa su Spring Cloud – che utilizza degli ulteriori servizi per generare parole di tipo diverso (subject, verb e object), nonché un servizio di discovery eureka e un gateway zuul
Composizione e orchestrazione di contenitori Docker6
subject
verb
object
sentencezuul
eureka
8080
Luca Cabibbo ASW
- Composizione con Docker
Le funzionalità di base di Docker consentono di gestire i casi di composizione più semplici – in cui ci sono diversi tipi di contenitori (servizi), ciascuno con un numero prefissato di istanze
vediamo come realizzare il servizio sentence per generare frasi usando le funzionalità di base di Docker
Composizione e orchestrazione di contenitori Docker7
subject
verb
object
sentencezuul
eureka
8080
Luca Cabibbo ASW
Un’applicazione per frasi casuali
Per realizzare il servizio sentence per generare frasi casuali –insieme ai servizi aggiuntivi subject, verb, object, eureka e zuul –possiamo utilizzare
immagini diverse per i servizi sentence, word, eureka e zuul
uno o più contenitori per il servizio sentence – per affidabilità e scalabilità
uno o più contenitori per ciascuno dei servizi subject, verb e object – tutti basati sull’immagine per il servizio word
ulteriori contenitori per eureka e zuul
il collegamento in rete tramite una rete definita dall’utente sentence-net
in particolare, questa rete consente ai diversi contenitori di vedere il servizio eureka su un nodo di nome eureka
inoltre la porta 8080 di zuul va esposta sull’host
Composizione e orchestrazione di contenitori Docker8
Luca Cabibbo ASW
Modifiche alle applicazioni
Rispetto a quanto visto nella dispensa su Spring Cloud, bisogna modificare le configurazioni dei nostri servizi come segue
configurazione dei servizi sentence e word (file application.properties)
eureka.client.serviceUrl.defaultZone deve puntare a eureka:8761/eureka/ – anziché a localhost:8761/eureka/
server.port deve valere 8080
configurazione del servizio zuul (file application.properties)
eureka.client.serviceUrl.defaultZone deve puntare a eureka:8761/eureka/ – anziché a localhost:8761/eureka/
Composizione e orchestrazione di contenitori Docker9
Luca Cabibbo ASW
Dockerfile
Per ciascuno dei servizi bisogna definire un Dockerfile
come esempio, questo è il Dockerfile per il servizio sentence
l’applicazione Spring per il servizio sentence viene associata ad una porta nota (del contenitore, non dell’host) – ad es., 8080
i Dockerfile per gli altri servizi sono simili
Composizione e orchestrazione di contenitori Docker10
# Dockerfile per il servizio sentence
FROM openjdk:8-jdk
ADD build/libs/sentence.jar sentence.jar
EXPOSE 8080
ENTRYPOINT ["/usr/bin/java", "-Xmx128m", "-Xms128m", "-jar", "sentence.jar"]
Luca Cabibbo ASW
Immagini dei contenitori
Questo è lo script di creazione delle immagini Docker per l’applicazione sentence
per evitare un errore comune
dopo aver modificato (il codice sorgente di) una delle applicazioni, ricordarsi (sempre!) di effettuare (o ripetere) sia la build (Java) delle applicazioni che la build (Docker) delle immagini Docker!
Composizione e orchestrazione di contenitori Docker11
#!/bin/bash
docker build --rm -t eureka-img ./eureka-server docker build --rm -t word-img ./word-service docker build --rm -t sentence-img ./sentence-service docker build --rm -t zuul-img ./zuul-gateway
Luca Cabibbo ASW
Avvio dei contenitori
Questo è lo script per la creazione e l’avvio dei contenitori per l’intera applicazione – nonché per la creazione di una rete privata
Composizione e orchestrazione di contenitori Docker12
#!/bin/bash
docker network create sentence-net
docker run -d --network= sentence-net --name=eureka eureka-img
docker run -d --network= sentence-net -e "SPRING_PROFILES_ACTIVE=subject" --name=subject word-img
docker run -d --network= sentence-net-e "SPRING_PROFILES_ACTIVE=verb" --name=verb word-img
docker run -d --network= sentence-net-e "SPRING_PROFILES_ACTIVE=object" --name=object word-img
docker run -d --network= sentence-net --name=sentence-1 sentence-imgdocker run -d --network= sentence-net --name=sentence-2 sentence-img
docker run -d --network= sentence-net -p 8080:8080 --name=zuul zuul-img
Luca Cabibbo ASW
* Composizione con Docker Compose
Docker Compose è uno strumento per definire ed eseguire applicazioni Docker composte da più contenitori
Docker Compose è basato sull’utilizzo di un file di configurazione docker-compose.yml per specificare i diversi servizi che compongono un’applicazione
dopo di che, le immagini per i contenitori dell’applicazione si possono costruire con un singolo comando
docker-compose build
poi si può avviare l’applicazione (creando e avviando i suoi contenitori) con un singolo comando
docker-compose up
infine, l’applicazione può essere arrestata con un singolo comando
docker-compose down
Composizione e orchestrazione di contenitori Docker13
Luca Cabibbo ASW
Servizi
In Docker Compose, un’applicazione è composta da uno o più servizi
un servizio (in Docker Compose) corrisponde intuitivamente ad un contenitore dedicato all’esecuzione di un servizio applicativo – ad es., un microservizio in un’applicazione a microservizi
per ciascun servizio, nel file docker-compose.yml vanno specificati
l’immagine per il contenitore
il comando da eseguire nel contenitore (se diverso da quello di default)
ulteriori informazioni e vincoli aggiuntivi
Composizione e orchestrazione di contenitori Docker14
Luca Cabibbo ASW
Esempio
Ecco la struttura (parziale) delle cartelle per l’applicazione di esempio sentence per generare frasi in modo casuale
Composizione e orchestrazione di contenitori Docker15
|+--- docker-compose.yml+--- eureka-server/ | +--- Dockerfile| +--- build.gradle| +--- src/ | | +--- ... | \--- build/ | +--- ... +--- sentence-service/ | +--- ... +--- word-service/ | +--- ... \--- zuul-gateway/
+--- ...
Luca Cabibbo ASW
Esempio
Ecco il file docker-compose.yml per l’applicazione di esempio sentence per generare frasi in modo casuale
Composizione e orchestrazione di contenitori Docker16
version: '2'
services:eureka:
build:context: ./eureka-server
container_name: eureka
subject:build:
context: ./word-serviceenvironment:
- SPRING_PROFILES_ACTIVE=subject
verb: ... simile a subject ...
object: ... simile a subject ...
... segue ...
Luca Cabibbo ASW
Esempio
Ecco il file docker-compose.yml per l’applicazione di esempio sentence per generare frasi in modo casuale
Composizione e orchestrazione di contenitori Docker17
sentence:build:
context: ./sentence-service
zuul:build:
context: ./zuul-gatewaycontainer_name: zuulports:- "8080:8080"
Luca Cabibbo ASW
Ulteriori osservazioni
Alcune ulteriori osservazioni su Docker Compose
Docker Compose definisce automaticamente una rete dedicata all’applicazione – tutti i suoi servizi/contenitori sono collegati a questa rete, e possono comunicare tramite il loro nome
è anche possibile definire altre reti e topologie di rete complesse
in questo modo, un host può ospitare più ambienti isolati, ciascuno dedicato ad una diversa applicazione – è anche possibile avere più copie di una stessa applicazione (in ambienti separati e isolati)
Composizione e orchestrazione di contenitori Docker18
Luca Cabibbo ASW
Ulteriori osservazioni
Alcune ulteriori osservazioni su Docker Compose
Docker Compose supporta anche la gestione di volumi
l’operazione di build evita di ripetere la creazione di immagini già create ed aggiornate
consente anche di definire più configurazioni di una stessa applicazione – mediante meccanismi di estensione dei file di configurazione e l’uso di variabili
Docker Compose può essere usato soprattutto per supportare lo sviluppo e il test di applicazioni multi-servizi – nel computer dello sviluppatore o in un server CI
Composizione e orchestrazione di contenitori Docker19
Luca Cabibbo ASW
* Orchestrazione con uno swarm Docker
L’orchestrazione di contenitori riguarda la definizione e l’esecuzione di applicazioni multi-contenitore su più (molti) nodi
l’orchestrazione di contenitori è necessaria per eseguire un’applicazione multi-contenitore in un cluster, in modo scalabile ed affidabile – il che è di solito richiesto per rilasciare le applicazioni in produzione
Composizione e orchestrazione di contenitori Docker20
Luca Cabibbo ASW
- Docker in modalità swarm
Docker può essere utilizzato, in produzione, nella cosiddetta modalità “swarm” (letteralmente, “sciame”) – uno swarm è un cluster di nodi Docker (ovvero, di host che eseguono Docker Engine)
la modalità swarm fornisce l’orchestrazione di contenitori –consente di specificare applicazioni multi-servizi e multi-contenitore e di eseguirle su più nodi
Docker può essere utilizzato, dalla linea di comando, per creare e configurare uno swarm, rilasciare applicazioni nello swarm e gestire il comportamento dello swarm
in pratica, i diversi contenitori necessari per un’applicazione vengono rilasciati ed eseguiti in nodi diversi dello swarm
Docker Engine fornisce la modalità swarm in modo nativo da luglio 2016 (versione 1.12) – in precedenza veniva utilizzato uno strumento (separato) chiamato Docker Swarm
Composizione e orchestrazione di contenitori Docker21
Luca Cabibbo ASW
Docker in modalità swarm
Caratteristiche principali della modalità swarm
la gestione di un cluster swarm è integrata con Docker Engine, e può essere utilizzato lo stesso client (CLI o REST)
utilizzo di un modello dichiarativo per i servizi, che estende quello di Docker Compose – ad es., supporta la scalabilità dei servizi, sulla base della specifica di quante repliche (contenitori) vanno allocati per ciascun servizio
gestione dell’affidabilità – il cluster swarm effettua il monitoraggio continuo dei nodi e dei servizi, con la possibilità di ricreare automaticamente le repliche dei servizi che falliscono
rete multi-host e sicurezza – comunicazione tra contenitori nello swarm, mediante un’overlay network per i servizi
servizi di supporto per service discovery e load balancing (sia interno che esterno)
supporto per l’aggiornamento incrementale dei servizi
Composizione e orchestrazione di contenitori Docker22
Luca Cabibbo ASW
Concetti della modalità swarm
I concetti principali della modalità swarm
uno swarm è un cluster di nodi Docker Engine (basato su SwarmKit), dove è possibile rilasciare e orchestrare servizi
un nodo è un’istanza di Docker Engine che partecipa a uno swarm – i nodi swarm possono essere distribuiti su più macchine fisiche, virtuali o sul cloud
Composizione e orchestrazione di contenitori Docker23
Luca Cabibbo ASW
Concetti della modalità swarm
I concetti principali della modalità swarm
un servizio (service) è la definizione di un “compito” da eseguire nello swarm
i servizi costituiscono la nozione centrale usata dagli utenti (amministratori) per interagire con lo swarm
ciascun servizio viene specificato in termini di un’immagine di contenitore e dei comandi da eseguire nei relativi contenitori
un task (“compito”) è un contenitore (ovvero, un’istanza di contenitore) per un servizio
l’esecuzione di un servizio è basata sull’esecuzione di un certo numero di task per quel servizio – tanti quante sono le repliche desiderate del servizio (discusse più avanti)
i task costituiscono l’unità atomica di schedulazione nello swarm
Composizione e orchestrazione di contenitori Docker24
Luca Cabibbo ASW
Concetti della modalità swarm
I concetti principali della modalità swarm
ci sono due tipi di nodi
i nodi manager ricevono (dagli utenti) richieste di rilascio di servizi – che gestiscono schedulando task ai nodi worker
i nodi worker ricevono (dai nodi manager) richieste di task e li eseguono
in un cluster ci possono essere
più nodi worker (per disponibilità e scalabilità)
più nodi manager (per disponibilità) – di cui un leader (con una rielezione automatica, in caso di un suo fallimento)
inoltre i nodi manager
si occupano della gestione del cluster e dei suoi nodi
per default, in uno swarm i nodi manager svolgono anche il ruolo di worker – anche se è possibile configurarli perché agiscano esclusivamente come manager
Composizione e orchestrazione di contenitori Docker25
Luca Cabibbo ASW
Concetti della modalità swarm
I concetti principali della modalità swarm
ci sono due tipi di servizi
servizi replicati – per cui lo swarm deve allocare un numero configurabile di repliche del task corrispondente
servizi globali – con un task per ciascun nodo
le responsabilità di orchestrazione dei nodi manager comprendono la gestione dello stato desiderato dei servizi –per fare in modo che nello swarm venga eseguito il numero desiderato di task per ciascun servizio, anche a seguito dell’eventuale fallimento di contenitori e nodi
i nodi manager effettuano il monitoraggio dei contenitori e dei nodi, e se serve rischedulano i task falliti su altri nodi
Composizione e orchestrazione di contenitori Docker26
Luca Cabibbo ASW
Concetti della modalità swarm
I concetti principali della modalità swarm
bilanciamento del carico
è possibile (e semplice) esporre all’esterno di uno swarm le porte per i servizi in esecuzione nello swarm
ogni nodo dello swarm è infatti in grado di accettare richieste sulle porte pubblicate per ciascuno dei servizi dello swarm(“ingress routing mesh”) – anche se quel nodo non ha task (contenitori) corrispondenti a quel servizio
quando un client fa una richiesta per un servizio (a un qualunque nodo dello swarm), il load balancer dello swarmgira la richiesta a una replica attiva per quel servizio
in questo modo, qualunque componente esterno (come ad es., un load balancer per il cloud) può accedere ai servizi dello swarm, sulle loro porte pubblicate, a partire da qualunque nodo dello swarm
Composizione e orchestrazione di contenitori Docker27
Luca Cabibbo ASW
- Servizi in uno swarm
Prima di discutere come avviene in pratica l’orchestrazione di contenitori, discutiamo la creazione e l’esecuzione di un servizio in uno swarm
per prima cosa, è necessario inizializzare lo swarm (se non è stato già fatto in precedenza)
per semplicità, usiamo uno swarm costituito da un singolo nodo
eseguire su quel nodo il comando docker swarm init
nella creazione di un servizio in uno swarm, bisogna far riferimento a delle immagini Docker in un registry (che deve essere accessibile da tutti i nodi dello swarm)
non è invece possibile far riferimento ad immagini nella cache oppure a dei Dockerfile (come in Docker Compose)
Composizione e orchestrazione di contenitori Docker28
Luca Cabibbo ASW
Uso di Docker Hub
Per salvare un’immagine su Docker Hub, si proceda come segue
effettuare il login su Docker Hub (se necessario)
eseguire il comando docker login – in questa dispensa viene usato l’utente aswroma3 – ciascuno deve utilizzare il proprio account e le proprie credenziali
creare l’immagine
il comando docker build --rm -t aswroma3/hello . crea l’immagine (però localmente)
effettuare il push dell’immagine su Docker Hub
con il comando docker push aswroma3/hello
si noti che, se si vuole semplicemente utilizzare un’immagine presente su Docker Hub, non è necessario effettuare il login
Composizione e orchestrazione di contenitori Docker29
Luca Cabibbo ASW
Servizi in uno swarm
In uno swarm, le applicazioni più semplici, mono servizio, possono essere gestite mediante il comando docker service
docker service create avvia un servizio nello swarm
ad es., avvio di un servizio hello (di immagine aswroma3/hello)
docker service create --name hello --publish 8080:8080 --mode replicated --replicas 2 aswroma3/hello
i contenitori per i task associati al servizio vengono schedulati ed eseguiti nei diversi nodi dello swarm
in pratica, il servizio hello può essere acceduto alla porta 8080 di ciascun nodo dello swarm
è anche possibile scalare dinamicamente i servizi
ad es., docker service scale hello=3
il servizio può essere arrestato con docker service rm hello
Composizione e orchestrazione di contenitori Docker30
Luca Cabibbo ASW
- Orchestrazione in uno swarm
La specifica della composizione di un’applicazione in uno swarm è simile alla specifica della composizione con Docker Compose –ma ci sono alcune differenze
la composizione di un’applicazione può essere espressa come uno stack, che è l’insieme dei servizi che costituisce un’applicazione
la specifica di uno stack va descritta in un file YAML – ad es., ancora di nome docker-compose.yml
la sintassi da utilizzare però è un po’ diversa da quella di Docker Compose – poiché ciascuna sintassi ha delle caratteristiche esclusive
in effetti, è possibile “mischiare” le due sintassi – ciascuno dei due strumenti prenderà in considerazione solo gli elementi di proprio interesse (ed ignorerà gli altri)
Composizione e orchestrazione di contenitori Docker31
Luca Cabibbo ASW
Un’applicazione per frasi casuali
Consideriamo ancora la nostra applicazione per la generazione di frasi casuali
come servizio di service discovery, decidiamo di utilizzare quello fornito dallo swarm – anziché Eureka
continuiamo invece ad utilizzare i servizi sentence, subject, verb, object e zuul
Composizione e orchestrazione di contenitori Docker32
Luca Cabibbo ASW
Modifiche alle applicazioni
Rispetto alla versione per Docker Compose, bisogna modificare i nostri servizi come segue
in tutte le applicazioni
rimuovere la dipendenza starter per Eureka Client (che non viene più usato)
dalla configurazione (file application.properties) rimuovere la sezione per Eureka
inoltre, nel servizio sentence, i client Feign devono specificare la locazione dei servizi per i diversi tipi di parole (poiché non vengono più acceduti mediante Eureka) – ad esempio
Composizione e orchestrazione di contenitori Docker33
@FeignClient(name="subject", url="subject:8080")public interface SubjectClient { ... }
Luca Cabibbo ASW
Modifiche alle applicazioni
Rispetto alla versione per Docker Compose, bisogna modificare i nostri servizi come segue
va anche modificata la configurazione di Zuul del servizio zuul(file application.yml) – anche quella faceva riferimento a Eureka
Composizione e orchestrazione di contenitori Docker34
zuul:routes:
sentence:path: /sentence/**url: http://sentence:8080
subject:path: /subject/**url: http://subject:8080
verb:path: /verb/**url: http://verb:8080
object:path: /object/**url: http://object:8080
Luca Cabibbo ASW
Composizione con uno stack
Ecco il file docker-compose.yml per l’applicazione di esempio
si noti l’uso della versione 3 (anziché 2)
Composizione e orchestrazione di contenitori Docker35
version: '3'
services:subject:
image: aswroma3/word-swarmbuild: ./word-serviceenvironment:
- SPRING_PROFILES_ACTIVE=subjectdeploy:
mode: replicatedreplicas: 2
verb: ... simile a subject ...
object: ... simile a subject ...
... segue ...
Luca Cabibbo ASW
Composizione con uno stack
Ecco il file docker-compose.yml per l’applicazione di esempio
Composizione e orchestrazione di contenitori Docker36
sentence:image: aswroma3/sentence-swarmbuild: ./sentence-servicedeploy:
mode: replicatedreplicas: 2
zuul:image: aswroma3/sentence-zuul-swarmbuild: ./zuul-gatewayports:- "8080:8080"
Luca Cabibbo ASW
Push delle immagini su Docker Hub
Per creare e salvare le immagini su Docker Hub (se necessario), si proceda come segue
effettuare il login su Docker Hub
creare le immagini con il comando docker-compose build – che crea tutte le immagini localmente
effettuare il push delle immagini su Docker Hub con il comando docker-compose push
in pratica, Docker Compose prende in considerazione sia l’opzione build (per la locazione del contesto e del Dockerfile) che l’opzione image (con il nome dell’immagine)
l’opzione build viene invece ignorata dal comando dockerstack deploy (dello swarm)
Composizione e orchestrazione di contenitori Docker37
Luca Cabibbo ASW
Composizione con uno stack
L’applicazione sentence può essere poi avviata con il comando
docker stack deploy--compose-file docker-compose.yml sentence
è anche possibile monitorare lo stato dell’applicazione e dei servizi che la compongono
docker stack ps sentence
docker stack services sentence
docker service ps sentence_subject
è anche possibile scalare dinamicamente i servizi che compongono lo stack
docker service scale sentence_subject=3
infine, per arrestare lo stack
docker stack rm sentence
Composizione e orchestrazione di contenitori Docker38
Luca Cabibbo ASW
- Aggiornamento incrementale di servizi
Docker, in modalità swarm, supporta l’aggiornamento incrementale (rolling update) dei servizi in esecuzione
è possibile chiedere l’aggiornamento di un servizio in esecuzione nello swarm specificando la nuova immagine su cui deve essere basato il servizio
l’aggiornamento viene effettuato aggiornando, uno alla volta e in sequenza, i task (contenitori) per il servizio – per ciascuno dei task, il task viene arrestato, aggiornato e poi riavviato
in caso di problemi, è possibile effettuare il rollback ad una versione precedente
ad esempio, avvio di un servizio
docker service create --replicas 3 --name redis redis:3.0.6
aggiornamento del servizio
docker service update --image redis:3.0.7 redis
Composizione e orchestrazione di contenitori Docker39
Luca Cabibbo ASW
- Altri strumenti di orchestrazione
Oltre agli strumenti nativi per Docker, esistono altri strumenti per l’orchestrazione di contenitori Docker – tra cui
Amazon EC2 Container Service (Amazon ECS) is a highly scalable, fast, container management service that makes it easy to run, stop, and manage Docker containers on a cluster of Amazon EC2 instances
Google Container Engine is a powerful cluster manager and orchestration system for running your Docker containers
Kubernetes (by Google) is an open-source system for automating deployment, scaling, and management of containerized applications
Apache Mesos provides applications (e.g., Hadoop, Spark, Kafka, Elasticsearch, and Docker) with API’s for resource management and scheduling across entire datacenter and cloud environments
Composizione e orchestrazione di contenitori Docker40
Luca Cabibbo ASW
* Discussione
La composizione e, soprattutto, l’orchestrazione di contenitori sono funzionalità fondamentali per poter rilasciare in produzione le applicazioni multi-servizi e multi-contenitore – in un singolo nodo oppure in un cluster di nodi – on premises oppure sul cloud
la composizione e l’orchestrazione di contenitori sostengono infatti la disponibilità e la scalabilità delle applicazioni di questo tipo – e consentono di sfruttare l’elasticità delle piattaforme virtualizzate e sul cloud
per questo, i contenitori sono diventati una tecnologia abilitante per le applicazioni altamente scalabili – di solito realizzate come applicazioni a microservizi
anche per questo, la piattaforma Docker si è imposta molto rapidamente come tecnologia di riferimento per i contenitori
Composizione e orchestrazione di contenitori Docker41