Utilizzo di Docker
Docker è una piattaforma open source provvista di una documentazione esauriente da leggere con attenzione.
Perché Docker?
Docker è una piattaforma basata su container che consente di sviluppare, distribuire ed eseguire applicazioni all'interno di un container. L'applicazione e tutte le dipendenze che richiede, ad esempio file binari, librerie e informazioni di configurazione, risiedono all'interno del container. È possibile distribuire più container, che vengono tutti eseguiti in Docker e nel sistema operativo.
Utilizzando Docker è possibile ridimensionare le applicazioni in verticale, vale a dire che in un server possono esistere più istanze del server di sessione e che ognuna di essere fornirà esattamente le stesse prestazioni di quando è stata creata e testata.
Quali sono i vantaggi?
L'utilizzo dei container offre diversi vantaggi:
-
Prestazioni
Le macchine virtuali rappresentano un'alternativa ai container tuttavia, a differenza di esse, i container non includono un sistema operativo. Questo significa che i container sono più veloci da creare e avviare e hanno un footprint molto inferiore.
-
Flessibilità
Poiché i container sono più portabili e forniscono prestazioni superiori, è possibile sfruttare procedure di sviluppo più flessibili e reattive.
-
Isolamento
I container di Docker sono indipendenti l'uno dall'altro. Questo aspetto è importante perché un container di Docker che include un'applicazione, comprese le necessarie versioni di eventuale software di supporto, non interferisce con un altro container della stessa applicazione che richiede l'uso di software di supporto differente. È possibile avere la totale certezza che in ogni fase di sviluppo e distribuzione l'immagine creata sarà in grado di fornire esattamente le prestazioni previste.
-
Scalabilità
Creare nuovi container è un'operazione rapida e semplice. Nella documentazione di Docker sono disponibili informazioni su come gestire più container.
Terminologia
Esistono termini di base con cui è necessario avere familiarità quando si utilizza Docker. Per ulteriori informazioni, vedere il sito della documentazione di Docker.
Container
Un'istanza runtime di un'immagine. Un container è in genere completamente isolato dall'ambiente host ed è grado di accedere alle porte e i file dell'host solo se è stato configurato per eseguire questa operazione. Per eseguire un'immagine in un container viene utilizzato il comando Run di Docker.
Hub di Docker
Una risorsa per la comunità basata sul cloud per l'utilizzo di Docker. L'hub di Docker viene generalmente utilizzato per l'hosting delle immagini, ma può essere utilizzato anche per l'autenticazione dell'utente e l'automatizzazione delle operazioni di creazione delle immagini. Qualsiasi utente può pubblicare le immagini nell'hub di Docker.
Docker Compose
Compose è uno strumento che utilizza file YAML per configurare i servizi dell'applicazione, nonché per definire ed eseguire applicazioni Docker con più container. Per ulteriori informazioni, visitare la pagina della documentazione di Docker Compose.
Dockerfile
Un documento di testo che contiene i comandi necessari per creare un'immagine Docker. È possibile specificare comandi complessi (ad esempio un'immagine esistente da utilizzare come base) o semplici (come la copia dei file da una directory a un'altra). Per creare un'immagine da un Dockerfile, è necessario utilizzare il comando Build di Docker.
Immagine
Un pacchetto eseguibile autonomo che viene eseguito in un container. Un'immagine Docker è un file binario che include tutto il necessario per eseguire un singolo container di Docker, inclusi i relativi metadati. È possibile creare immagini personali, mediante un Dockerfile, oppure utilizzare le immagini generate da altri utenti che sono state rese disponibili in un registro (ad esempio l'hub di Docker). Per creare un'immagine da un Dockerfile, è necessario utilizzare il comando Build di Docker. Per eseguire un'immagine in un container viene utilizzato il comando Run di Docker.
Introduzione a Docker e a Host Access for the Cloud
Durante l'installazione di HACloud, se si sceglie di utilizzare Docker, il pacchetto di installazione contiene un Dockerfile iniziale e il relativo file jar dell'applicazione per iniziare a utilizzare il server di sessione nei container. Questi file sono disponibili prima dell'installazione.
!!! nota: Accertarsi che siano in esecuzione le versioni più recenti di Docker e Docker Compose.
Alcuni esempi sono disponibili nella cartella docker/samples
. Per istruzioni, vedere la sezione Esempi.
La creazione di un'immagine di base richiede il completamento di quattro passaggi:
-
Installare Docker. Seguire le istruzioni disponibili sul sito Web di Docker.
-
Estrarre il file del pacchetto di download e individuare
Dockerfile,entrypoint.sh
esessionserver.jar
nella cartella Docker. Il fileentrypoint.sh
deve avere il bit eseguibile impostato. -
Creare l'immagine Docker.
-
Eseguire l'immagine Docker.
Creare l'immagine Docker
Supponendo di aver seguito il primo e il secondo passaggio; installato Docker ed estratto e localizzato Dockerfile e sessionserver.jar, il passaggio successivo è quello di creare l'immagine Docker di base del server di sessione.
-
Eseguire questo comando dalla cartella contenente il Dockerfile:
docker build -t hacloud/sessionserver:<versione> .
Sostituire
<versione>
con la versione del server di sessione. Se non è disponibile una versione, il tag di default(-t)
èlatest
. -
Verificare che l'immagine sia stata creata correttamente. Eseguire:
docker images
L'output deve contenere le informazioni sull'immagine appena generata.
Esecuzione dell'immagine
Prima di poter eseguire l'immagine del server di sessione in un container di Docker, è necessario completare i seguenti passaggi:
-
Specificare l''indirizzo del server MSS
Per specificare l'ubicazione del server MSS, passare in una variabile di ambiente al server di sessione mediante il Docker. Ad esempio,
--env MSS_SERVER=mss.server.com
-
Specificare la password di registro dei servizi
Per specificare la password di registro dei servizi, passare in una variabile di ambiente al server di sessione mediante il Docker. Ad esempio,
--env SERVICE_REGISTRY_PASSWORD=<immettere password> .
È possibile recuperare la password dalla proprietà
service.registry.password
situata in/mss/server/conf/container.properties
sul server MSS. Utilizzare la proprietàservice.registry.password
per intero. -
Indicare a MSS l'attendibilità del certificato di identità del server di sessione
È possibile eseguire questa operazione utilizzando Administrative Console > Configure Settings (Configura impostazioni) > Trusted Certificates (Certificati attendibili). Vedere la documentazione di MSS Administrative Console, Trusted Certificates (Certificati attendibili). Il certificato del server di sessione è disponibile nella directory sessionserver/etc/.
-
Specificare l'archivio chiavi contenente il certificato di identità del server di sessione
Il server di sessione si identifica utilizzando un certificato. Il certificato dovrebbe essere presente nell'archivio chiavi Java
/sessionserver/etc/keystore.bcfks
situato nel container. La voce della coppia di chiavi servlet-engine deve contenere la catena di certificati completa. -
Fornire l'archivio attendibilità contenente il certificato MSS
Quando il server di sessione effettua le connessioni TLS in uscita, verifica l'attendibilità dei server remoti, ad esempio MSS, mediante certificati nell'archivio attendibilità. I certificati presenti nell'archivio chiavi Java
/sessionserver/etc/trustcerts.bcfks
situato nel container saranno considerati attendibili. -
Mappatura degli archivi chiavi e attendibilità a quelli del container
Sono disponibili due opzioni che consentono di fornire tali archivi chiavi nel container:
-
Utilizzare un montaggio di volume
oppure
-
Estendere un'immagine Docker esistente
Utilizzare un montaggio di volume
Un montaggio di volume consente di inserire un file o una directory presente nel computer host in un container. Al file o alla directory verrà fatto riferimento mediante il relativo percorso completo o relativo presente nel computer host.
Questo volume inserisce i file dell'archivio chiavi e dell'archivio attendibilità presenti sull'host nel container di Docker.
Estendere un'immagine Docker esistentedocker run -d \ --env MSS_SERVER=<nome_server_mss> \ --env SERVICE_REGISTRY_PASSWORD=<immettere qui la password> \ --env MANAGEMENT_SERVER_URL=https://<nome_server_mss>:<porta>/mss \ --env HOST_NAME=<nome DNA server docker> \ --volume ~/demo_keystore.bcfks:/sessionserver/etc/keystore.bcfks \ --volume ~/demo_truststore.bcfks:/sessionserver/etc/trustcerts.bcfks \ --publish 7443:7443 \ sessionserver
Con questo metodo viene creato un nuovo Dockerfile per copiare i file necessari nell'immagine Docker. In questo modo è più portatile l'immagine di Docker.
-
Per prima cosa, è necessario creare un Dockerfile che venga esteso dall'immagine Docker
hacloud/sessionserver
. -
FROM hacloud/sessionserver:
<ad esempio hacloud/sessionserver:latest o hacloud/sessionserver:version>
-
COPY
<percorso>/keystore.bcfks /sessionserver/etc/keystore.bcfks
-
COPY
<percorso>/truststore.bcfks /sessionserver/etc/trustcerts.bcfks
-
Successivamente, creare l'immagine estesa Docker e assegnarle il nome demo.
docker build -t demo .
-
Infine, eseguire l'immagine demo.
docker run -d \ --env MSS_SERVER=<nome_server_mss> \ --env SERVICE_REGISTRY_PASSWORD=<immettere qui la password> \ --env MANAGEMENT_SERVER_URL=https://<nome_server_mss>:<porta>/mss \ --env HOST_NAME=<nome DNA server docker> \ --publish 7443:7443 \ demo
-
-
Specificare il nome e la porta dell'host di Docker
Il server di sessione deve trasmettere il nome host di MSS per trovarlo. Dato che Docker genera un nome univoco casuale che non è raggiungibile all'esterno del container, è necessario specificare il nome dell'host di Docker per MSS. È inoltre necessario indicare al server di sessione la porta che si sta pubblicando sull'host di Docker. I client che accedono al server di sessione finiscono per colpire
<nome_host_docker>:<porta_pubblicata_docker>
.--env HOST_NAME=docker_host_name --env SERVER_PORT=docker_published_port
Esempi
Gli esempi, disponibili nella cartella docker/samples, illustrano quattro scenari in cui è utilizzato Docker Compose. Compose è uno strumento che utilizza un file YAML per configurare ed eseguire le applicazioni con un singolo comando.
Prerequisiti
Per eseguire gli esempi:
-
Installare Docker Compose. Consultare la documentazione di Docker su Docker Compose prima di proseguire.
-
Un server MSS in esecuzione
-
Un file dell'archivio chiavi per proteggere le connessioni TLS al server di sessione considerato attendibile da MSS.
-
Un file dell'archivio attendibilità contenente il certificato del server MSS in uso
-
Per creare l'immagine Docker del server di sessione
Gli esempi includono:
-
Base - Un esempio di base che fornisce file dimostrativi dell'archivio chiavi e dell'archivio attendibilità in cui è possibile importare un certificato del server MSS.
-
Ibrido - Un esempio ibrido che presuppone l'esistenza di un'installazione Host Access for the Cloud locale e monta file dell'archivio chiavi e dell'archivio attendibilità esistenti su disco nel container di Docker.
-
Estensione - Un esempio di estensione che illustra come eseguire l'aggiornamento, la modifica e la personalizzazione del client Web.
-
Bilanciamento del carico - Un esempio con un sistema di bilanciamento del carico che illustra come bilanciare il carico tra container collegati.
Esempio di base
In questo esempio di base viene illustrato come eseguire l'immagine Docker del server di sessione in Docker Compose. In questo esempio è necessario importare il certificato del server MSS nell'esempio fornito./certs/demo_truststore.bcfks
utilizzando un elemento come KeyStore Explorer. Il certificato MSS, per default, si trova in /mss/server/etc/<nome-computer>.cer
. Vedere Importazione di un certificato nell'archivio attendibilità del server di sessione.
Prima di eseguire l'esempio, aggiornare i valori MSS_SERVER, HOST_NAME e SERVICE_REGISTRY_PASSWORD in docker-compose.yml
.
-
Per avviare il servizio del server di sessione:
docker-compose up
-
Per eseguire il servizio in un daemon (modalità disconnessa):
docker-compose up -d
-
Per esaminare i container in esecuzione, utilizzare il comando:
docker ps
Esempio ibrido
In questo esempio è presente un'installazione locale di Host Access for the Cloud, con file dell'archivio chiavi e dell'archivio attendibilità su disco. Questi file verranno montati, ossia copiati, nel container di Docker.
Prima di eseguire l'esempio, aggiornare i valori MSS_SERVER, HOST_NAME, SERVER_PORT e SERVICE_REGISTRY_PASSWORD nel file .env.
Per avviare il servizio del server di sessione:
-
Copia
.env
edocker-compose.yml
insessionserver/microservices/sessionserver/
. -
Da questa directory, eseguire:
docker-compose up-d
Estensioni
Utilizzando le estensioni e il proprio codice HTML, CSS o JavaScript, è possibile aggiornare, modificare e personalizzare l'aspetto del client Web all'interno del browser. Per ulteriori informazioni, vedere Estensione del client Web.
In questo esempio SPRING_PROFILES_ACTIVE viene impostato su extensions-enabled e l'ubicazione delle estensioni viene mappata in docker-compose.yml
.
Prima di eseguire l'esempio, aggiornare i valori MSS_SERVER, HOST_NAME e SERVICE_REGISTRY_PASSWORD nel file .env.
Per avviare il servizio del server di sessione:
docker-compose up -d
È anche possibile scegliere di estendere l'immagine di base di Docker hacloud/sessionserver e copiare i file di estensione nel container Docker:
-
Creare il Dockerfile che si estende dall'immagine di Docker hacloud/sessionserver.
FROM hacloud/sessionserver COPY ./certs/keystore.bcfks //sessionserver/etc/keystore.bcfks COPY ./certs/trustcerts.bcfks //sessionserver/etc/trustcerts.bcfks COPY ./extensions /sessionserver/extensions/
-
Creare l'immagine estesa Docker e assegnare il nome extensions.
docker build -t extensions .
-
Aggiornare
docker compose.yml
affinché utilizzi la nuova immagine extensionsversion: '3' services: sessionserver: image: extensions environment: - LOGGING_FILE_NAME=./logs/sessionserver.log - LOGGING_FILE_MAXSIZE=10MB - LOGGING_FILE_MAXHISTORY=10 - MSS_SERVER=${MSS_SERVER} - SERVICE_REGISTRY_PASSWORD=${SERVICE_REGISTRY_PASSWORD} - SPRING_PROFILES_ACTIVE=extensions-enabled ports: - ${SERVER_PORT}:7443
Bilanciamento del carico
HAProxy è un sistema di bilanciamento del carico. Ulteriori informazioni su HAProxy sono disponibili sul relativo sito Web.
In questo esempio, un servizio haproxy è incluso nel file docker-compose.yml
. L'esempio utilizza un'immagine haproxy per bilanciare i container collegati. In questo esempio, per collegare i container, viene utilizzato il bridging SSL
Per garantire una comunicazione sicura tra il client e il sistema di bilanciamento del carico, è necessario aggiornare la proprietà LOAD_BALANCER_CERT
nel file .env
con l'ubicazione del certificato del sistema di bilanciamento del carico.
Per fare una prova, è possibile generare un certificato firmato da se stessi:
-
Generare una chiave privata univoca (KEY):
sudo openssl genrsa -out mydomain.key 2048
-
Generare una richiesta di firma del certificato (CRS):
sudo openssl req -new -key mydomain.key -out mydomain.csr
-
Creare un certificato autofirmato (CRT):
sudo openssl x509 -req -days 365 -in mydomain.csr -signkey mydomain.key -out mydomain.crt
-
Aggiungere KEY e CERT a loadbalancer.pem:
sudo cat mydomain.key mydomain.crt >./certs/loadbalancer.pem
Per avviare il server di sessione e i servizi haproxy, utilizzare il comando:
docker-compose up -d
oppure
docker-compose up --scale sessionserver=n -d
In cui n è il numero delle istanze del server di sessione.
È possibile modificare il numero di istanze del server di sessione dopo l'avvio dei servizi:
docker-compose scale sessionserver=n
Per accedere alla pagina delle statistiche del server di sessione e HAProxy:
-
https://server:7443
-
http://server:1936/haproxy?stats
Utilizzo:
-
utente: amministratore
-
password: password