In termini molto pratici, l'intelligenza artificiale è una funzione complessa, di "algoritmi", ovvero il prodotto di "software" che risiede su dei supporti “hardware”, funziona su dei sistemi operativi diversi, quindi su macchine differenti, che possono comunicare tra loro, scambiando informazioni, elaborando dati in ingresso e fornendo altri dati in uscita.
Uno dei sistemi migliori, che permette un "ambiente protetto" per questi software, è quello di incapsualare questi "organismi informatici", all'interno di contenitori: "i container".
Docker è una piattaforma aperta per lo sviluppo, la spedizione e l'esecuzione di applicazioni di ogni tipo.
Docker consente di separare le applicazioni dalla infrastruttura che le ospita, in modo da poter fornire rapidamente il software specifico.
Con Docker, si può quindi gestire l'infrastruttura nello stesso modo in cui si gestiscono le applicazioni, sfruttando rapidamente le metodologie di questa piattaforma, per la spedizione, il test e la distribuzione del codice, è possibile ridurre significativamente il ritardo tra scrittura del codice ed esecuzione in produzione.
Docker fornisce dunque, la possibilità di impacchettare ed eseguire un'applicazione in un ambiente isolato chiamato contenitore "CONTAINER".
L'isolamento e la sicurezza consentono di eseguire molti contenitori contemporaneamente su un determinato host ("MACCHINA"). I contenitori si possono considerare "leggeri", in quanto specifici per far girare quella applicazione e quindi non è necessario fare affidamento su ciò che è attualmente installato sull'host.
I contenitori si possono facilmente condividere, e danno la garanzia di funzionare allo stesso modo, a parità di sistema operativo ospitante. Il contenitore diventa quindi “l'unità atomica”, per la distribuzione e il test dell'applicazione. I contenitori Docker possono essere eseguiti sul laptop locale di uno sviluppatore, su macchine fisiche o virtuali in un data center, sui fornitori di cloud o in una miscela di ambienti.
Questa metodologia di sviluppo, fornisce un'alternativa praticabile ed economica alle macchine virtuali basate su hypervisor, in modo da poter utilizzare più capacità del server per raggiungere gli obiettivi aziendali. Docker è perfetto sia per ambienti ad alta densità che per implementazioni di piccole e medie dimensioni in cui è necessario fare di più con meno risorse.
Docker utilizza un'architettura client-server. In particolare, un client Docker è
"Docker Compose", che consente di lavorare con applicazioni costituite da un insieme di contenitori. Per sintetizzare a livello visivo, potremmo concepire Docker, in questo modo:
Elementi specifici di Docker
Docker daemon:
Docker Daemon (Dockkerd) ascolta le richieste dell'API Docker e gestisce oggetti Docker come immagini, contenitori, reti e volumi. Un demone può anche comunicare con altri demoni per gestire i servizi Docker.
The Docker client:
Docker Client (Docker) è il modo principale in cui molti utenti Docker interagiscono con Docker. Quando si utilizzano comandi come Docker RUN, il client invia questi comandi a Dockerd, che li esegue. Il comando Docker utilizza l'API Docker. Il client Docker può comunicare con più di un demone.
Docker Desktop:
Docker Desktop è un'applicazione facile da installare per l'ambiente MAC, Windows o Linux che consente di creare e condividere applicazioni e microservizi containerizzati.
Docker Desktop include Docker Daemon (Dockkerd), Docker Client (Docker), Docker Compose, Docker Content Trust, Kubernetes e Helper credenziali.
Docker registries:
Un registro Docker memorizza immagini Docker. Docker Hub è un registro pubblico che chiunque può utilizzare e Docker è configurato per cercare immagini su Docker Hub per impostazione predefinita. si può persino gestire un registro personale privato. Quando si utilizzano i comandi "Docker Pull" o "Docker Run", le immagini richieste vengono estratte dal registro configurato. Quando si utilizza il comando "Push Docker", l'immagine viene inviata al registro configurato.
Docker objects:
Quando si usa Docker, si possono generare e utilizzare immagini, contenitori, reti, volumi, plugin e altri oggetti.
Images:
Un'immagine è un modello di sola lettura con istruzioni per la creazione di un contenitore Docker. Spesso, un'immagine si basa su un'altra immagine, con una personalizzazione aggiuntiva. Ad esempio, è possibile creare un'immagine basata sull'immagine Ubuntu, ma installa il server Web Apache e l'applicazione specifica, comprensiva di configurazione necessaria per l'utilizzo.
Si possono generare immagini o usare solo quelle create da altri e pubblicate in un registro.
Per creare una immagine, si utilizza un file Docker con una semplice sintassi per definire i passaggi necessari per creare l'immagine ed eseguirla. Ogni istruzione in un fikerfile crea un livello nell'immagine. Quando si cambia il Dockerfile e si ricostruisce l'immagine, vengono ricostruiti solo quegli strati che sono cambiati, in questo modo si rendono le immagini così leggere, piccole e veloci, rispetto ad altre tecnologie di virtualizzazione.
Containers:
Un contenitore è un'istanza eseguibile di un'immagine. È possibile creare, avviare, fermare, spostare o eliminare un contenitore utilizzando l'API Docker o la CLI. È possibile collegare un contenitore a una o più reti, allegare l'archiviazione ad esso o persino creare una nuova immagine in base al suo stato attuale. Per impostazione predefinita, un contenitore è relativamente ben isolato da altri contenitori e dalla sua macchina host.
È possibile controllare come la rete di un contenitore, l'archiviazione o altri sottosistemi sottostanti sono isolati da altri contenitori o dalla macchina host.
Un contenitore è definito dalla sua immagine e da qualsiasi opzione di configurazione che viene fornita quando si crea o lo si avvia. Quando un contenitore viene rimosso, eventuali modifiche al suo stato che non sono conservate in modo persistente scompaiono.
Oltre ai moduli specifici della lingua, la documentazione di Docker fornisce anche linee guida per costruire e gestire in modo efficiente l'ambiente di sviluppo.
Si possono trovare informazioni sulle migliori pratiche per la scrittura di file di docker, costruire e gestire le immagini in modo efficiente, guadagnando miglioramenti delle prestazioni costruendo immagini usando buildkit, ecc.
Si possono anche trovare istruzioni specifiche su come mantenere piccole le immagini e come persistere i dati delle applicazioni, come utilizzare build multi-stage, ecc.
Volumes
Un volume di container permette di mantenere inalterati i file anche quando si eliminano i container Docker. I volumi rappresentano inoltre una possibilità pratica per scambiare dati tra l’host e il container. Collegare un volume di un container Docker rappresenta una buona soluzione per eseguire le seguenti operazioni:
Trasmettere dati in un container Docker
Salvare dati da un container Docker
Scambiare dati tra container Docker
I volumi di Docker esistono al di fuori dello union file system grazie all’accesso di sola lettura e al livello descrivibile.Il volume è una cartella condivisa tra il container e il computer host. È possibile anche condividere volumi tra container.
Un volume di un container “vive” al di fuori del container in questione sul computer host, il volume si comporta come una cartella in cui salvare file o da cui recuperare dati.
Si tratta del cosiddetto “mount point” (punto di montaggio) in una directory dell’host.
Linguaggi software supportati dai DOCKER IA :
JavaScript
E’ uno dei linguaggi di programmazione più popolari al mondo. Oggi alimenta milioni di siti web e ha attratto frotte di sviluppatori e designer per creare funzioni per il web. Se siete alle prime armi con la programmazione, sappiate che JavaScript è probabilmente uno dei migliori linguaggi di programmazione da apprendere.
Node.js è un ambiente runtime single-threaded, open-source e multipiattaforma per la creazione di applicazioni server-side e di networking veloci e scalabili. Gira sul motore di runtime JavaScript V8 e usa un’architettura I/O event-driven e non bloccante, il che lo rende efficiente e adatto ad applicazioni real-time.
Python
Python è un linguaggio di programmazione di "alto livello", orientato a oggetti, adatto, tra gli altri usi, a sviluppare applicazioni distribuite, scripting, computazione numerica e system testing. Ideato da Guido van Rossum all'inizio degli anni novanta, è spesso paragonato a Ruby, Tcl, Perl, JavaScript, Visual Basic o Scheme. Il nome fu scelto per la passione dello stesso inventore verso i Monty Python e per la loro serie televisiva Monty Python's Flying Circus. Spesso viene anche studiato tra i primi linguaggi per la sua somiglianza a uno pseudo-codice e di frequente viene usato per simulare la creazione di software grazie alla flessibilità di sperimentazione consentita da Python, che permette al programmatore di organizzare le idee durante lo sviluppo, come per esempio il creare un gioco tramite Pygame oppure il back-end di un sito web tramite Flask o Django.
Python dispone anche di una sezione grafica, il modulo Python Turtle Graphics, che permette di applicare le righe di codici alla grafica.
Java
Java è un linguaggio di programmazione ad alto livello, orientato agli oggetti e a tipizzazione statica, che si appoggia sull'omonima piattaforma software di esecuzione, specificamente progettato per essere il più possibile indipendente dalla piattaforma hardware di esecuzione (tramite compilazione in bytecode prima e interpretazione poi da parte di una JVM) (sebbene questa caratteristica comporti prestazioni in termini di computazione inferiori a quelle di linguaggi direttamente compilati come C e C++ ovvero dunque perfettamente adattati alla piattaforma hardware).
Go
E’ un linguaggio di programmazione open source sviluppato da Google.
Il lavoro su Go nacque nel settembre 2007 da Robert Griesemer, Rob Pike e Ken Thompson basandosi su un precedente lavoro correlato con il sistema operativo Inferno. Secondo gli autori, l'esigenza di creare un nuovo linguaggio di programmazione nasce dal fatto che non esiste un linguaggio di programmazione che soddisfi le esigenze di una compilazione efficiente, di un'esecuzione veloce e di una facilità di programmazione. Go viene annunciato ufficialmente nel novembre 2009.
C#
Il C# (sharp), come l'espressione see sharp, "vedere nitidamente") è un linguaggio di programmazione multi-paradigma che supporta tutti i concetti della programmazione orientata agli oggetti. Esso è stato sviluppato da Microsoft all'interno dell'iniziativa .NET, e successivamente approvato come standard dalla ECMA (ECMA-334) e ISO (norma ISO/IEC 23270). La sintassi e struttura del C# prendono spunto da vari linguaggi nati precedentemente, in particolare Delphi, C++, Java e Visual Basic.
Cenni sull'installazione. Come installare DOCKER?
Docker Desktop
Docker Desktop è un'applicazione one-click-install per l'ambiente MAC, Linux o Windows che consente di creare e condividere applicazioni e microservizi containerizzati.
Fornisce una GUI semplice (interfaccia utente grafica) che consente di gestire i contenitori, le applicazioni e le immagini, direttamente dalla macchina.
Docker Desktop può essere utilizzato da solo o come strumento complementare alla CLI.
Docker Desktop riduce il tempo trascorso su configurazioni complesse in modo da potersi concentrare sulla scrittura del codice.
Questa GUI, si occupa delle mappature delle porte, delle preoccupazioni del file system e di altre impostazioni predefinite e viene regolarmente aggiornato con correzioni di bug e aggiornamenti di sicurezza.
Docker engine:
Docker Engine è una tecnologia di containerizzazione open source per la costruzione e il containerizzazione delle applicazioni. Il motore Docker funge da applicazione client-server con:
Un server con un processo demone Dockerd.
API che specificano le interfacce
Un Docker client CLI (Command Line Interface).
La CLI utilizza le API Docker per controllare il demone Docker t
Molte altre applicazioni Docker utilizzano l'API e la CLI sottostanti.
Il demone crea e gestisce oggetti Docker, come immagini, contenitori, reti e volumi.
In altre parole, "il core" spartano a linea di comando che solitamente contraddistingue il nerd che lavora su linux. Tuttavia Docker Engine è disponibile su una varietà di piattaforme Linux, MacOS e Windows 10 tramite Docker Desktop e come installazione binaria statica
Docker Build:
Docker Build è una delle funzionalità più utilizzate di Docker Engine. Ogni volta che sista creando un'immagine, si utilizza Docker Build. Build è una parte fondamentale del ciclo per lo sviluppo del software che consente di impacchettare e raggruppare il codice e spedirlo ovunque. Il motore Docker utilizza un'architettura client-server ed è composto da più componenti e strumenti. Il metodo più comune per l'esecuzione di una build è emettere un comando build Docker. La CLI invia la richiesta al motore Docker che, a sua volta, esegue la build dell'immagine. Docker Build è più di un semplice comando build e non si tratta solo di imballaggio del codice. È un intero ecosistema di strumenti e funzionalità che supportano non solo le attività comuni del flusso di lavoro, ma fornisce anche supporto per scenari più complessi e avanzati.
Docker Compose:
Compose è uno strumento per definire e eseguire applicazioni Docker multi-container.
Con COMPOSE, si utilizza un file YAML per configurare i servizi dell'applicazione, quindi, con un singolo comando, si crea e si avviano tutti i servizi dalla configurazione.
Compose opera in tutti gli ambienti: produzione, stadiazione, sviluppo, test e flussi di lavoro CI ed è dotato anche comandi per la gestione dell'intero ciclo di vita della applicazione:
Iniziare, fermare e ricostruire i servizi
Visualizzare lo stato dei servizi in esecuzione
Trasmettere in streaming l'output del registro dei servizi in esecuzione
Eseguire un comando unico su un servizio
Le caratteristiche chiave di COMPOSER che lo rendono efficace sono:
Avere più ambienti isolati su un singolo host
Preservare i dati del volume quando vengono creati i contenitori
Rigenerare contenitori che sono cambiati
Supportare le variabili e spostare i container tra gli ambienti
Docker Hub:
Docker Hub è un servizio fornito da Docker per la ricerca e la condivisione di immagini di container. È il più grande repository al mondo di immagini di container con una serie di fonti di contenuto tra cui sviluppatori di comunità di container, progetti open source e fornitori di software indipendenti (ISV) che costruiscono e distribuiscono il loro codice in contenitori.
Gli utenti ottengono accesso a repository pubblici gratuiti per la memorizzazione e la condivisione di immagini o possono scegliere un piano di abbonamento per repository privati. Docker Hub fornisce le seguenti caratteristiche principali:
Repository: pubblicare e scaricare le immagini del contenitore.
Team e organizzazioni: gestire l'accesso a repository privati di immagini container.
Immagini ufficiali di Docker: scaricare e usare immagini contenitori di alta qualità fornite da Docker.
Docker Verified Publisher : scaricare e utilizzare immagini di contenitori di alta qualità fornite da venditori esterni.
Build: costruire automaticamente le immagini del contenitore da GitHub e Bitbucket e pubblicarle a Docker Hub.
WebHooks: attivare azioni dopo una pubblicazio riuscita a un repository per integrare Docker Hub con altri servizi.
Docker fornisce uno strumento CLI Docker Hub (attualmente sperimentale) e un'API che consente di interagire con Docker Hub. Fare riferimento alla documentazione API Docker Hub per esplorare gli endpoint supportati.
Un percorso pratico per una installazione:
https://docs.docker.com/get-docker/
https://docs.docker.com/desktop/install/linux-install/
https://docs.docker.com/desktop/install/ubuntu/
https://docs.docker.com/compose/
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/gettingstarted/
https://docs.docker.com/language/python/develop/
Le metodologie di installazione, in qualche modo differiscono da un sistema operativo all'altro.
Un esempio pratico con DOCKER
Una volta che si è installato docker engine e docker compose, o docker desktop, si potrebbe ad esempio utilizzare il terminale per verificare la versione dei componenti installati:
oppure visualizzare la lista delle immagini scaricate:
O, ancora, visualizzare le istruzioni inerenti la piattaforma, con la classica istruzione CLI:
A cui seguiranno le linee indicative dei comandi e delle opzioni a disposizione per i due servizi.
In particolare, voglio sottolineare qualche semplice comando:
docker push
Usa Docker Image Push per condividere le immagini nel registro Docker Hub o con una self-hosted one. Fare riferimento al riferimento del tag dell'immagine Docker per ulteriori informazioni su nomi di immagini e tag validi. Terminare il processo di pubblicazione dell'immagine Docker, ad esempio premendo CTRL-C mentre è in esecuzione in un terminale, termina l'operazione di pubblicazione.
Le barre di avanzamento durante, che mostrano lo stato del processo Docker nella dimensione non compressa. La quantità effettiva di dati trasferiti, verrà compressa prima di inviare, quindi la dimensione caricata non verrà riflessa dalla barra di avanzamento.
docker pull
La maggior parte delle tue immagini verrà creata sopra un'immagine di base dal registro Docker Hub. Docker Hub contiene molte immagini pre-costruite che puoi scaricare e provare senza dover definire e configurare le proprie. Questo è il comando che serve per scaricare una particolare immagine o un set di immagini (ovvero un repository).
docker run
Il comando Docker Run prima crea un livello di contenitore scrivibile sull'immagine specificata, quindi inizia usando il comando specificato.
Cioè, Docker Run è equivalente all'API/Container/Crea quindi/Container/(ID)/Start.
Un contenitore arrestato può essere riavviato con tutte le sue precedenti modifiche intatte usando Docker Start. Vedi Docker PS -A per visualizzare un elenco di tutti i contenitori.
Per informazioni sulla connessione di un contenitore a una rete, consultare la "Panoramica della rete Docker". Si può fare riferimento alla sezione Esempi seguenti, nella pagina https://docs.docker.com/engine/reference/commandline/run/
Quindi, per semplificare, quando si fa girare una immagine, si genera un “container” visibile con l’istruzione:
Un Volume di Esempio per Docker container
Nella seguente immagine viene rappresentato il contenuto di un volume di esempio, per utilizzo in locale, prima di una pubblicazione “git”.
Il Docker-compose.yml
Innanzitutto bisogna specificare che, i file con l'estensione “.yml” possono essere lanciati solo da alcune applicazioni. Questo tipo di file sono da considerarsi “file dati” piuttosto che documenti, il che significa che non sono stati concepiti per essere visualizzati dai software, (sono comunque file testuali), ma utilizzati, ad esempio come basi di dettagli di configurazione.
Il linguaggio “ YAML”, (Yet Another Markup Language), sfrutta concetti di altri linguaggi come il C, il Perl e il Python e dal formato XML ma anche dal formato per la posta elettronica (RFC2822).
Questi file vengono salvati in formato testo normale (con estensione .yml), YAML è un linguaggio di serializzazione dei dati leggibile dall'uomo, proprio come XML e JSON.
La serializzazione è un processo in cui un'applicazione o un servizio che dispone di strutture di dati diverse ed è scritta in una diversa serie di tecnologie può trasferire dati in un'altra applicazione utilizzando un formato standard. In altre parole, la serializzazione riguarda la traduzione, la conversione e la conclusione di una struttura di dati in un altro formato.
I dati nel nuovo formato possono essere archiviati in un file o trasmessi a un'altra applicazione o servizio su una rete. YAML è dunque un formato ampiamente usato per la scrittura di file di configurazione per diversi strumenti, programmi e applicazioni DevOps a causa della sua sintassi leggibile dall'uomo e intuitiva.
In questo caso il “Docker compose file” definisce servizi, reti e volumi per un'applicazione Docker. La versione più recente e consigliata del formato di file di composizione è definita dalla specifica compose. La specifica compose unisce le versioni Legacy 2.x e 3.x, aggregando le proprietà tra questi formati ed è implementata mediante COMPOSE 1.27.0+.
Le specifiche riportate nel file, consentono di definire un'applicazione basata su contenitori prefissati.
In questo esempio il file si presenta così:
In particolare si può notare che l’immagine di riferimento è Stable diffusion:
Stable Diffusion, tra l’altro, propone un modello di diffusione “text-a-immagine” latente in grado di generare immagini foto-realistiche, dato qualsiasi input di testo, (prompt), coltiva la libertà autonoma di produrre immagini incredibili, rendendo accessibile ad una moltitudine di persone di creare arte straordinaria in pochi secondi.
In questo caso, lanciando un server web con il comando
“jupyter lab --ip=0.0.0.0 --port=8888 –allow-root”
Si noti inoltre che viene richiesta la disponibilità, in locale, di una macchina dotata di “GPU”.
GPU, identifica L'unità di elaborazione grafica (o processore grafico, in inglese graphics processing unit) è un circuito elettronico progettato per accelerare la creazione di immagini in un frame buffer, destinato all'output su un dispositivo di visualizzazione.
Le GPU vengono utilizzate in sistemi embedded come telefoni cellulari, personal computer e console di gioco.
In un personal computer una GPU può essere presente su scheda video o incorporata sulla scheda madre.Il termine GPU è stato reso popolare da NVIDIA nel 1999, che ha commercializzato la GeForce 256 come "la prima GPU al mondo".
Le GPU moderne, sebbene operino a frequenze più basse delle CPU, sono molto più veloci di esse nell'eseguire i compiti in cui sono specializzate.
Le GPU sono efficaci nell'intelligenza artificiale perché utilizzano il calcolo parallelo per scomporre un problema complesso in calcoli più piccoli e simultanei.
Questi calcoli sono distribuiti tra un vasto numero di core del processore e sono adatti per l'apprendimento automatico e la “big analytics”!.
Il DockerFile
Un Dockerfile è l’elemento costitutivo dell’ecosistema Docker, che descrive i passaggi per creare un’immagine Docker. Il flusso di informazioni segue un modello centrale:
Dockerfile > immagine Docker > container Docker.
Si parte dal presupposto che tutto inizia con un’immagine di base esistente.
L’immagine appena creata si riferisce all’immagine di base e vi sono anche una serie di cambiamenti specifici che, possono ad esempio essere riferite all’ecosistema su cui deve essere implementata.
Il Dockerfile contiene una serie di istruzioni, ciascuna su una riga separata.
Le istruzioni vengono eseguite una dopo l’altra per creare un’immagine Docker.
In questo caso:
Un Dockerfile è un semplice file di testo chiamato “Dockerfile”. Si noti che, la prima lettera deve essere maiuscola. Il file contiene una voce per riga.
I commenti contengono informazioni destinate principalmente agli esseri umani.
Ad esempio, su Python, Perl e Ruby, i commenti di un Dockerfile iniziano con il segno cancelletto (#). Le righe di commento vengono rimosse durante il processo di costruzione prima di ulteriori elaborazioni. Le istruzioni costituiscono la maggior parte del contenuto del Dockerfile, descrivono la struttura specifica di un’immagine Docker e vengono eseguite una dopo l’altra.
Così come i comandi sulla riga di comando, le istruzioni accettano argomenti, alcune istruzioni sono direttamente paragonabili a specifici comandi della riga di comando.
Per quanto riguarda gli argomenti, è necessario fare una distinzione tra parti a codifica fissa e parti variabili. Docker segue la metodologia della “twelve-factor app” e usa variabili d’ambiente per configurare i container. L’istruzione ENV è usata per definire le variabili d’ambiente in un Dockerfile.
Le principali istruzioni di un DockerFile:
Il file “LICENCE”
Una licenza è un documento legale che concede specifici diritti all'utilizzatore relativamente al ri-uso e alla ri-distribuzione, a certe condizioni di un determinato materiale.
Una licenza informatica (o licenza d'uso), in informatica, è il contratto con il quale il titolare dei diritti di sfruttamento economico sul software (programma informatico) definisce il regime giuridico di circolazione e le limitazioni nell'utilizzo e nella cessione dell'opera (che sia un'opera creativa, o un software, inteso come programma).
Il file “README”
Un file README (dall'inglese read me, "leggimi") è un file che contiene informazione riguardo ai file contenuti in un archivio o in una directory ed è comunemente incluso nei pacchetti software. Il file può avere diverse estensioni: dal semplice file .txt a estensioni di fantasia come README.1ST, READ.ME o semplicemente senza estensione README e nei sistemi Windows come README.WRI o README.RTF o README.DOC.
In questo caso, la bozza README.md si presenta in questo modo:
GitHub è un servizio web e cloud-based che aiuta gli sviluppatori ad archiviare e gestire il loro codice e a tracciare e controllare le modifiche.
Per capire esattamente cos’è GitHub, è necessario introdurre due principi collegati:
Controllo versioni
Git
Git è uno specifico sistema di controllo versioni open-source creato da Linus Torvalds nel 2005. In particolare, Git è un sistema di controllo versioni distribuito, il che significa che l’intero codice base e la cronologia sono disponibili sul computer di ogni sviluppatore, il che permette di creare facilmente ramificazioni e fusioni.
GitHub è un’azienda a scopo di lucro che offre un servizio di hosting di repository Git basato su cloud. In sostanza, rende molto più facile per individui e team utilizzare Git per il controllo delle versioni e la collaborazione.
Fondamentalmente, la directory presente sull’host locale, può essere trasferita al cloud e da quella posizione, pubblicata nelle sue varianti (branch version)… (master)…
il file .dockerignore
Un file .dockerignore è un file di configurazione che descrive file e directory che si desidera escludere quando si crea un'immagine Docker.
Di solito, il Dockerfile si colloca nella directory principale del tuo progetto, ma potrebbero esserci molti file nella directory principale che non sono correlati all'immagine Docker o che non si desidera includere. .dockerignore viene utilizzato per specificare tali file indesiderati e non includerli nell'immagine Docker. Il file .dockerignore è utile per evitare di inviare inavvertitamente file o directory che sono grandi o contengono file sensibili al demone o evita di aggiungerli all'immagine utilizzando i comandi ADD o COPY.
L’importanza di ridurre le dimensioni dell'immagine Docker ha i seguenti vantaggi, questi vantaggi sono importanti perché più istanze di un servizio ci sono, come i microservizi, più si devono scambiare immagini Docker.
In sintesi:
Velocità nell’esecuzione del comando Docker Pull/Push.
Velocità quando si costruiscono immagini Docker.
Se un file di immagini Docker contiene informazioni sensibili come le credenziali, diventa un problema di sicurezza. Ad esempio, se il caricamento di un'immagine Docker contenente file con informazioni sulle credenziali come .AWS o .env a un repository Docker come il Dockerhub pubblico ,dockerignore, farà il compromesso sulla pubblicazione di tali informazioni sulle credenziali ecc.
La directoty /project
In questo caso, si fa riferimento a queste istruzioni:
RUN mkdir project
WORKDIR /project
del DockerFile, ed anche a:
volumes:
- ./project:/project
del file DockerCompose. che in pratica identificano la Directory di lavoro dell’applicazione.
In particolare , per questo esempio, si fa riferimento ad un file python, inerente la specifica applicazione per StableDiffusion.
Questo file python costituisce il “core” dell’applicazione che potrà essere lanciata da uno dei file con estensione “.ipynb”.
Un file IPYNB è un documento di quaderno utilizzato da “Jupyter Notebook”, un ambiente di calcolo interattivo progettato per aiutare gli scienziati a lavorare con il linguaggio Python e i loro dati.
Jupyter Notebook è un’applicazione Web open source che permette di creare e condividere documenti testuali interattivi, contenenti oggetti quali equazioni, grafici e codice sorgente eseguibile.
Jupyter è diventato uno standard de-facto per data scientist perché offre la possibilità di realizzare, documentare e condividere analisi di dati all’interno di un framework che supporta:
operazioni di data cleaning & trasformation,
simulazioni numeriche,
modellazione statistica,
machine learning deep learning e altro;
l’esecuzione di applicazioni Scala e Python su piattaforme big data,
integrazione con Apache Spark.
In particolare, nella prima riga di codice, si può notare che, per utilizzare questa applicazione, è necessario verificare una autorizzazione che fa riferimento al “hugginface_token.token”.
I file TOKEN sono un tipo di Sandcastle Help File Builder Token File, sviluppato per Microsoft Sandcastle da Microspot. Un token viene utilizzato come tag sostituibile all'interno di un argomento ed è rappresentato usando un elemento “gettone”.
La configurazione del token di autenticazione presentato, garantisce che l’utilizzatore sia riconosciuto e possa utilizzare la sua sessione interattiva. Il file .token contiene dunque un codice alfanumerico identificativo.
!nvidia-smi
serve per verificare la presenza del driver per la GPU, che viene richiesta dal file DockerFile.
in caso positivo, apparirà, in fase di esecuzione, qualcosa del genere:
Nelle seguenti righe del notebook troveremo questo semplice codice.
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
torch.cuda.is_available()
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "a photo of green alien"
pipe.enable_attention_slicing()
image = pipe(prompt).images[0]
In particolare, verrà richiesto tramite un “prompt”,di generare una immagine partendo da un testo appositamente inserito. L’esecuzione di questa parte di codice, prevede lo scaricamento di molti dati software e può richiedere molto tempo.
Infine salveremo l'Immagine generata:
image.save("prompt.png")
image.show()
L’immagine, in questo test, verrà salvata nella directory di lavoro e verrà mostrata a video.
Questo potrebbe essere un risultato possibile:
Per generare questa immagine, ci sono voluti i seguenti comandi:
docker compose up
Dato nella directory principale dell’applicazione, mediate il terminale.
Verrà di seguito lanciato il web server, da terminale all’indirizzo opportuno.
Dal browser si accederà al desktop attivo:
verrà lanciato dato il comando di start :
La prima volta, potrebbe impiegarci parecchio tempo, ma alla fine, se tutto va a buon fine, viene riportato in uscita un risultato simile a quello sopra riportato.
Per terminare il test, bisogna utilizzare ancora il terminare, uscendo dalla modalità attiva (ctrl+c), e scrivendo il comando <docker compose down> che terminerà le attività del container attivo.
Grazie per la lettura.
Romeo Ceccato.
Comments