JavaRush /Java Blog /Random-IT /Prima conoscenza con Docker
Viacheslav
Livello 3

Prima conoscenza con Docker

Pubblicato nel gruppo Random-IT
La containerizzazione è un meccanismo spesso utilizzato nella pratica. Ad esempio, quando cerchi headhunter, troverai 477 posti vacanti ad oggi che menzionano Docker. Pertanto, non sarebbe una cattiva idea familiarizzare con di cosa si tratta. Spero che questa breve recensione possa aiutare a farsi una prima idea. Bene, lo supporterà con materiali aggiuntivi, come i corsi su Udemy. Prima introduzione a Docker - 1

introduzione

In questa breve recensione vorrei toccare un argomento come la containerizzazione. Ed è necessario iniziare comprendendo cos’è effettivamente la containerizzazione. Secondo Wikipedia, la “ containerizzazione ” è la virtualizzazione a livello di sistema operativo (ovvero NON hardware) in cui il kernel del sistema operativo mantiene più istanze isolate dello spazio utente invece di una sola. Lo " spazio utente " è lo spazio degli indirizzi della memoria virtuale del sistema operativo riservato ai programmi utente. Le istanze dello spazio utente (comunemente chiamate contenitori) sono completamente identiche a una singola istanza del sistema operativo dal punto di vista dell'utente. Il kernel garantisce l'isolamento completo del contenitore, quindi i programmi di contenitori diversi non possono influenzarsi a vicenda. Si scopre che la containerizzazione è la virtualizzazione del software, ovvero la virtualizzazione a livello del sistema operativo, di cui è responsabile il kernel del sistema operativo. Uno degli aspetti caratteristici di questo approccio è che tutti i contenitori utilizzano un kernel comune, lo stesso del sistema operativo host (cioè quello su cui si trovano i contenitori). Ciò consente di eliminare il sovraccarico derivante dall'emulazione dell'hardware virtuale e dall'avvio di un'istanza completa del sistema operativo. Possiamo dire che si tratta di una virtualizzazione “leggera”. Il kernel è la parte centrale del sistema operativo che fornisce alle applicazioni un accesso coordinato alle risorse del computer, come tempo del processore, memoria, hardware esterno e dispositivi di input e output esterni. Il kernel fornisce in genere anche servizi di file system e protocolli di rete. In generale, questo è il cuore dell'intero sistema. Per ulteriori informazioni può essere utile consultare il materiale “ Informazioni generali sui contenitori ”. E ancora qualche parola per completare l'introduzione. Ora sappiamo che un sistema operativo ha un kernel. Fornisce l'isolamento per le istanze dello spazio utente. In questo contesto potresti imbatterti nel termine " cgroups ". Questo è il nome dello stesso meccanismo del kernel Linux che ti consente di raggiungere questo obiettivo. Possiamo quindi dire che il percorso della containerizzazione è iniziato con i sistemi Linux. Tuttavia, a partire da Windows 10, è apparso anche il supporto alla containerizzazione. Per lavorare con la virtualizzazione, devi configurare il supporto della virtualizzazione nel BIOS del tuo computer. Come farlo dipende dal computer. Ad esempio, potrebbe assomigliare a questo:
Prima introduzione a Docker - 2
Su Windows puoi verificarlo in diversi modi. Ad esempio, puoi scaricare un'utilità speciale dal sito Web Microsoft: Strumento di rilevamento della virtualizzazione assistito da hardware . Bene, vale la pena menzionare un altro concetto importante: Hypervisor. Hypervisor è un monitor di macchina virtuale, un programma per garantire l'esecuzione parallela di più sistemi operativi sullo stesso computer. L'hypervisor garantisce che i sistemi operativi siano isolati gli uni dagli altri e condivida le risorse tra i sistemi operativi in ​​esecuzione. Uno di questi hypervisor è Oracle VirtualBox .
Prima introduzione a Docker - 3

Docker

Quindi, cosa sia la virtualizzazione è chiaro. Ma come usarlo? E qui Docker ci viene in aiuto. Docker è un software per automatizzare la distribuzione e la gestione di applicazioni in ambienti containerizzati. Vale la pena iniziare dal fatto che Docker è rappresentato da un concetto come Docker Enginge. E dovresti iniziare con il sito web ufficiale di Docker e la sezione “ Panoramica di Docker ”.
Prima introduzione a Docker - 4
La documentazione dice che la finestra mobile è composta da:
  • Server Docker chiamato processo Docker Daemon (dockerd).
  • Interfaccia della riga di comando, nota anche come CLI (docker).
  • Un'API REST che descrive come i programmi possono "parlare" con deamon e dirgli cosa fare.
Prima di approfondire ulteriormente, installiamo docker, ovvero installiamo il demone docker. Il sito Web Docker contiene istruzioni per l'installazione di " Docker for Windows ". È interessante notare che Docker ha i propri requisiti di sistema. E se tu, come me, hai un vecchio Windows, ad esempio Windows 7, devi utilizzare Docker Toolbox.
Prima introduzione a Docker - 5

Casella degli strumenti Docker

Per installare Docker su macchine vecchie che non soddisfano i requisiti di sistema. Il sito web lo dice, "Legacy Desktop Solution". Andiamo alla pagina " Docker Toolbox " e scarichiamolo. Questo set pesa circa 211 megabyte. Lo installeremo come predefinito, ovvero saremo semplicemente d'accordo docilmente con tutto senza riorganizzare i flag. Dopo l'installazione controlleremo che tutto sia a posto. In futuro, il nostro campo di battaglia sarà la linea di comando. Raccomando di non utilizzare la riga di comando di Windows, perché potrebbero esserci problemi non evidenti. È meglio usare la shell bash. Su Windows, il modo più consigliato per ottenerlo è installare il sistema di controllo della versione git , tornerà comunque utile. Perché "in bundle" con esso sarà la festa di cui abbiamo bisogno. Per questa recensione userò git bash. Puoi anche installare bash con CYGWIN . Lanciamo bash o git bash. Assicuriamoci di aver installato la Docker Machine, conosciuta anche come Docker Machine: docker-machine -version cos'è questa Docker Machine? Docker Machine è un'utilità per la gestione degli host dockerizzati (si tratta degli host su cui è installato Docker Engine). Se subito dopo l'installazione di Docket Toolbox visualizziamo le macchine docker utilizzando il comando docker-machine ls, vedremo un elenco vuoto:
Prima introduzione a Docker - 6
Creiamo una nuova macchina. Per fare ciò, dobbiamo eseguire il comando create : docker-machine create -- driver virtualbox javarush: Vedremo il registro di creazione della macchina docker:
Prima introduzione a Docker - 7
Ciò che qui ci interessa è quanto segue. Cos'è Boot2Docker? Questa è una distribuzione Linux minimalista per eseguire il motore Docker (comprendiamo che Docker funziona grazie agli strumenti di virtualizzazione Linux e in Windows il meccanismo necessario è apparso solo a partire da Windows 10). Questa distribuzione è basata sulla distribuzione " Tiny Core Linux ". Menzionato anche su VirtualBox VM. Questo perché abbiamo specificato --driver virtualbox. Una nuova macchina virtuale è stata creata in VirtualBox dall'immagine Boot2Docker. Dopo la creazione, possiamo avviare VirtualBox (poiché VirtualBox è installato con Docker Toolbox) e vedere la macchina virtuale creata per la macchina docker:
Prima introduzione a Docker - 8
Dopo la creazione, ci verrà richiesto di eseguire il comando “ docker-machine env ” per ottenere le variabili di ambiente che devono essere configurate per connettersi alla macchina docker:
Prima introduzione a Docker - 9
Dopo aver eseguito questo comando utilizzando docker-machine, ci connettiamo a un host dockerizzato remoto (in questo caso, virtuale ospitato su Virtual Box) e possiamo eseguire i comandi docker localmente come se li stessimo eseguendo su un host remoto. Per verificare possiamo eseguire il comando " docker info ". Se la connessione alla macchina docker non viene stabilita, riceveremo un errore. E se tutto va bene, informazioni sulla finestra mobile sulla macchina mobile. Ora è il momento di capire come funziona in generale Docker e come usarlo.
Prima introduzione a Docker - 10

Contenitori Docker

Quindi abbiamo docker. Cos'è comunque questa finestra mobile? La documentazione di Docker e la sezione “ Inizia ” ci aiuteranno a capirlo . La parte introduttiva di questa sezione introduce i concetti di Docker . Afferma che Docker è una piattaforma per lo sviluppo, il debug e l'esecuzione di applicazioni in contenitori. Pertanto, la cosa principale per Docker sono i contenitori. Anche se guardi il logo della finestra mobile, si tratta di una balena che tiene i contenitori sul dorso. Ma cos’è un contenitore? Successivamente nella sezione " Immagini e contenitori " si dice che un contenitore è un'istanza in esecuzione di Image. E Image è un “pacchetto” che contiene tutto il necessario per l'applicazione (codice, ambiente, librerie, impostazioni, ecc.). Ora proviamolo noi stessi. Il sito Web Docker ha una sezione chiamata " Esempi Docker " che include " Docker for Beginners ". Gli esempi da qui mi sembrano più interessanti. Quindi, improvvisamente abbiamo voluto conoscere Alpine Linux e possiamo farlo utilizzando i contenitori Docker. Per ottenere un'immagine, dobbiamo "tirarla" o "tirarla fuori". Pertanto, eseguiamo il comando docker pull :docker pull apline
Prima introduzione a Docker - 11
Come possiamo vedere, stiamo scaricando da qualche parte. Per impostazione predefinita, Docker esamina il proprio repository sulla rete https://hub.docker.com . Dopo aver recuperato con successo l'immagine, possiamo controllare l'elenco delle immagini disponibili eseguendo il comando docker images :
Prima introduzione a Docker - 12
Ora abbiamo un'immagine apline. Poiché il contenitore è un'istanza in esecuzione dell'immagine, lanciamo proprio questa immagine. Lanciamo il contenitore utilizzando il comando docker run alpine. Come vediamo, non è successo nulla. Anche se eseguiamo il comando docker psper visualizzare tutti i contenitori attivi, non otterremo nulla. Ma se eseguiamo, docker ps -avedremo tutti i contenitori:
Prima conoscenza con Docker - 13
Il fatto è che non abbiamo lanciato Docker in modalità interattiva. Pertanto, eseguì il comando e si fermò. Il comando era aprire il terminale. Facciamo la stessa cosa, ma in modalità interattiva (con il flag -it ):
Prima introduzione a Docker - 14
Come puoi vedere, dopo aver superato un errore e utilizzando il suggerimento, siamo arrivati ​​al contenitore e possiamo lavorarci! Per uscire dal contenitore senza interromperne il funzionamento è possibile premere Ctrl + p + q. Se eseguiamo ora docker ps, vedremo un contenitore attivo. Per inserire un contenitore già in esecuzione, esegui il comando docker exec :
Prima conoscenza con Docker - 15
Consiglio di leggere la descrizione dell'esempio Docker per un'eccellente descrizione di come tutto ciò avviene: " 1.0 Running your first container ". Mi piace perché tutto è scritto lì in un modo molto accessibile e comprensibile. Per riformulare brevemente, siamo connessi utilizzando docker-machine a una macchina virtuale che esegue Docker Daemon. Utilizzando la CLI sull'API REST, chiediamo di avviare l'immagine alpina. Docker lo trova e quindi non lo scarica. Docker crea un nuovo contenitore ed esegue il comando specificato in questo contenitore. E tutto questo, ovviamente, è positivo. Ma perché abbiamo bisogno di tutto questo? E qui dobbiamo capire come la finestra mobile crea un'immagine. E li crea in base al dockerfile.
Prima introduzione a Docker - 16

Dockerfile

Come indicato nel riferimento Dockerfile , un dockerfile è un file di testo che contiene tutti i comandi per ottenere un'immagine. Infatti, tutte le immagini che riceviamo (anche Alpine, dall'esempio sopra) sono state create da un dockerfile. Costruiamo la nostra immagine con un'applicazione Java. E prima abbiamo bisogno di questa applicazione Java. Suggerisco di utilizzare il sistema di compilazione Gradle, di cui puoi leggere di più in questa breve recensione: " Una breve introduzione a Gradle ". Ci aiuterà nella creazione del progetto " Gradle Build init plugin ". Creiamo una nuova applicazione Java utilizzando Gradle: gradle init --type java-application questo comando crea un modello di progetto Java. Questa è un'applicazione autonoma, ma vorremmo creare un'applicazione web. Rimuoviamo le classi App e AppTest (sono state generate automaticamente dal plugin Gradle Build Init). Per creare velocemente un'applicazione web, utilizzeremo il tutorial di Gradle: “ Building Java Web Applications ”. Secondo il tutorial, facciamo: Devi stare attento qui. Come sempre, potrebbero esserci degli errori negli esempi. Ecco qui:
Prima introduzione a Docker - 17
Ora, per testarlo, aggiungiamo il plugin gretty a build.gradle, come indicato nella sezione " Aggiungi il plugin gretty ed esegui l'app ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
È interessante notare che Gretty non vede l'errore in HelloServlet, descritto sopra. Ciò dimostra che un'applicazione può comportarsi diversamente in ambienti diversi. Gretty può funzionare dove un normale server autonomo genererebbe un errore. Non resta che verificare che l'applicazione funzioni correttamente. Facciamo:gradle appRun
Prima conoscenza con Docker - 18
Se tutto va bene, utilizza il comando gradle warper raccogliere un archivio con l'estensione war (archivio web). Per impostazione predefinita, Gradle lo crea nel formato \build\libs. Ora siamo pronti per scrivere il nostro dockerfile. Utilizzando il " riferimento Dockerfile " creeremo un Dockerfile. Creiamo un file chiamato "Dockerfile" nella radice del nostro progetto Java (nello stesso posto dello script di build). Apriamolo per la modifica. Questo file ha il proprio formato, descritto nella sezione " Riferimento Dockerfile: formato ". Qualsiasi dockerfile inizia con un'istruzione FROM, che indica "l'immagine di base". Possiamo dire che questa è l'immagine madre sulla base della quale creiamo la nostra immagine. È molto facile per noi scegliere un'immagine principale. Un'applicazione web necessita di un server web. Ad esempio, possiamo utilizzare il server web Tomcat. Andiamo al repository Docker ufficiale, che si chiama docker hub . Guardiamo lì per vedere se l'immagine di cui abbiamo bisogno è lì:
Prima conoscenza con Docker - 19
Vale anche la pena capire come si chiama l'immagine Tomcat. Ma oltre al nome ha un tag. Un tag è come una versione. Le immagini Tomcat di diverse versioni differiscono in base alla versione di Tomcat utilizzata, alla versione di jre e all'immagine di base. Ad esempio, possiamo ottenere un'immagine docker pull tomcat:9-jre8-alpine che utilizza la versione 9 di Tomcat, jre versione 8 e un'immagine alpina come base. Questo può essere importante per ridurre le dimensioni della nostra immagine:
Prima introduzione a Docker - 20
Come possiamo vedere, la differenza è enorme. Se costruiamo la nostra immagine sulla base di Tomcata Alpine, inizieremo con solo 100 megabyte e non con 600. Di conseguenza, aggiungeremo il seguente contenuto al dockerfile creato in precedenza:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
E ora eseguiamo il comando per costruire l'immagine: docker build -t jrdocker ..
Prima conoscenza con Docker - 21
-t- questo è un tag, cioè come chiamare l'immagine assemblata. Il punto alla fine significa che aggiungiamo la directory corrente (la directory in cui si trova il dockerfile e da cui abbiamo eseguito il comando) a Build context. Build context- questo è il contesto di quei file disponibili durante la creazione di un dockerfile. Come puoi vedere, grazie a questo siamo riusciti a copiare il file war assemblato nella nostra immagine, nella directory del server web. Ora eseguiamo la nostra immagine:docker run -d --rm -p 8888:8080 jrdocker
Prima conoscenza con Docker - 22
Per capire se il server è avviato, puoi guardare il log dal contenitore. Il log può essere ottenuto utilizzando il comando docker logs, specificando il contenitore tramite il suo ID o nome. Per esempio:
Prima conoscenza con Docker - 23
Bene, non dimenticare che possiamo sempre andare su un contenitore in esecuzione per nome con il comando: winpty docker exec -it NameКонтейнера sh Ora non resta che connetterci. In precedenza, abbiamo specificato EXPOSE , ovvero abbiamo consentito l'accesso alla porta 8080 dall'interno del container. Quando abbiamo lanciato il container stesso, abbiamo specificato il tag -p ( incoming ports ), correlando così la porta 8080 sul container (il server web Tomcat sta aspettando connessioni lì) con la porta 8888 su una macchina con un demone docker. Come ricordiamo, abbiamo lanciato il demone docker non direttamente, ma tramite docker-machine. Chiediamo quindi ancora una volta i dati sulle nostre macchine docker utilizzando il comando docker-machine ls e contattiamo il server nel contenitore:
Prima introduzione a Docker - 24
Quindi, tu ed io abbiamo appena lanciato la nostra applicazione web in un contenitore Docker! ) Vorrei inoltre sottolineare quanto segue. In caso di problemi di accesso è bene ricordare che la macchina Docker è innanzitutto una macchina virtuale Virtual BOx. Potrebbero esserci problemi con le impostazioni di rete della macchina virtuale. Una configurazione VMBox funzionante potrebbe assomigliare a questa:
Prima conoscenza con Docker - 25
Prima conoscenza con Docker - 26

Strati

Abbiamo già capito che le immagini vengono create da dockerfile e che i dockerfile sono un insieme di comandi. Abbiamo anche scoperto che un dockerfile ha un genitore. E che la dimensione delle immagini è diversa. È interessante notare che puoi vedere la cronologia di come è stata creata l'immagine utilizzando il comando docker History . Per esempio:
Prima conoscenza con Docker - 27
È importante dirlo per capire che, in sostanza, ogni immagine è un insieme di immagini. Ogni modifica dell'immagine (ogni nuovo comando nel dockerfile) crea un nuovo livello con il proprio ID. Puoi leggere ulteriori informazioni sui livelli nella documentazione " Docker: immagini e livelli ". Consiglio vivamente anche la lettura dell'articolo su Habré: “ Immagini Docker e contenitori in immagini ”.

Conclusione

Spero che questa breve panoramica sia stata sufficiente per interessarti alla containerizzazione. Di seguito sono riportati i collegamenti a materiale aggiuntivo che potrebbe essere utile: #Viacheslav
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION