{"id":6323,"date":"2022-07-14T07:10:20","date_gmt":"2022-07-14T07:10:20","guid":{"rendered":"https:\/\/cloudsurfers.it\/?p=6323"},"modified":"2022-08-10T08:25:13","modified_gmt":"2022-08-10T08:25:13","slug":"introduzione-a-docker","status":"publish","type":"post","link":"https:\/\/cloudsurfers.it\/index.php\/introduzione-a-docker\/","title":{"rendered":"Introduzione a Docker"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/Docker_logo_720-1024x576.jpg\" alt=\"\" class=\"wp-image-6365\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/Docker_logo_720-1024x576.jpg 1024w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/Docker_logo_720-300x169.jpg 300w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/Docker_logo_720-768x432.jpg 768w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/Docker_logo_720.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Intro<\/strong><\/h3>\n\n\n\n<p>In questo articolo andremo ad introdurre Docker soffermandoci su alcune nozioni principali e concluderemo con l&#8217;installazione su una macchina Linux, in modo da avere l&#8217;ambiente pronto per i prossimi articoli dedicati a Docker.<\/p>\n\n\n\n<p><strong>Docker <\/strong>\u00e8 una piattaforma software che permette di creare, testare e distribuire applicazioni con la massima rapidit\u00e0.<br>Il vantaggio principale di Docker \u00e8 quello di consentire agli utenti di&nbsp;impacchettare un&#8217;applicazione con tutte le sue dipendenze in un unico &#8220;contenitore&#8221;&nbsp;chiamato <strong>container<\/strong> e di eseguirlo con estrema rapidit\u00e0.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Container<\/strong><\/h3>\n\n\n\n<p>I container sono unit\u00e0 standardizzate&nbsp;che offrono tutto il necessario per la corretta esecuzione delle applicazioni, incluse librerie, strumenti di sistema, codice e runtime. In altre parole \u00e8 un ambiente che crea un contesto completo per l\u2019esecuzione di un\u2019applicazione.<\/p>\n\n\n\n<p>I contenitori offrono un meccanismo di packaging logico in cui le applicazioni possono essere astratte dall&#8217;ambiente in cui vengono effettivamente eseguite. Questo consente di distribuire le applicazioni basate su container in modo semplice e coerente, indipendentemente dal fatto che l&#8217;ambiente di destinazione sia un data center privato, un cloud pubblico o persino un laptop personale di uno sviluppatore. Ci\u00f2 offre agli sviluppatori la possibilit\u00e0 di creare ambienti prevedibili isolati dal resto delle applicazioni e che possono essere eseguiti ovunque.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Container vs. VM<\/strong><\/h4>\n\n\n\n<p>Il container pu\u00f2 essere considerato una forma di virtualizzazione: come la&nbsp;macchina virtuale&nbsp;virtualizza l&#8217;hardware del server host, i container invece virtualizzano il suo sistema operativo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/image-4.png\" alt=\"\" class=\"wp-image-6330\" width=\"424\" height=\"223\" srcset=\"https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/image-4.png 703w, https:\/\/cloudsurfers.it\/wp-content\/uploads\/2022\/07\/image-4-300x158.png 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><\/figure>\n\n\n\n<p>Avendo un loro sistema operativo, le macchine virtuali sono ottime per fornire l&#8217;isolamento completo dei processi delle applicazioni, ma questo isolamento ha un costo elevato in termini di risorse. Invece con i container, che sfruttano il kernel del SO guest, a discapito di un minor isolamento, si ha la possibilit\u00e0 di eseguire facilmente un gran numero di container su un host senza che questo batta ciglio; infatti, a differenza delle macchine virtuali, i container non hanno un sovraccarico elevato e quindi consentono un utilizzo pi\u00f9 efficiente del sistema e delle risorse sottostanti.<\/p>\n\n\n\n<p>Quindi riassumendo, un container, a differenza di una macchina virtuale:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>non ha bisogno dell\u2019installazione di un sistema operativo<\/li><li>non richiede l\u2019allocazione fissa di risorse come RAM e CPU.<\/li><li>occupa il minimo spazio indispensabile<\/li><li>offre maggior facilit\u00e0 di portabilit\u00e0<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Immagini<\/strong><\/h3>\n\n\n\n<p>Un container Docker a sua volta \u00e8 un\u2019istanza di un\u2019immagine Docker in fase di esecuzione, quest\u2019immagine rappresenta tutto il contenuto e definisce quale applicativo sar\u00e0 eseguito all&#8217;interno del container. <\/p>\n\n\n\n<p>Un&#8217; immagine Docker:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>occupa uno spazio di archiviazione minimo e non utilizza alcuna risorsa di sistema<\/li><li>\u00e8 in sola lettura, non pu\u00f2 essere modificata dopo la creazione<\/li><li>pu\u00f2 essere usata per creare un numero illimitato di container simili<\/li><\/ul>\n\n\n\n<p>Riguardo al secondo punto \u00e8 utile precisare che \u00e8 possibile aggiungere modifiche a un\u2019immagine Docker esistente, ma questo creer\u00e0 una nuova immagine. Proprio per la possibilit\u00e0 di modifica, un\u2019immagine Docker \u00e8 composta da pi\u00f9 livelli di sola lettura: per ogni operazione che porta a una modifica del file system dell&#8217;immagine, viene creato un nuovo livello. L\u2019approccio utilizzato \u00e8 solitamente indicato come \u201ccopy-on-write\u201d: un accesso in scrittura crea una copia modificata dell\u2019immagine in un nuovo livello mentre i dati originali rimangono invariati, definendo quindi una struttura a pi\u00f9 strati, composti da pi\u00f9 immagini intermedie.<\/p>\n\n\n\n<p>Come vedremo le immagini possono essere create ma anche scaricate da repository pubblici come <a href=\"https:\/\/hub.docker.com\/search?q=\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Hub<\/a>, in modo da avere a disposizione una raccolta di immagini sempre pronte all&#8217;uso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Docker<\/strong><\/h3>\n\n\n\n<p>Docker \u00e8 un prodotto open source, realizzato in linguaggio Go, disponibile in due versioni principali:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Docker CE (Community Edition): gratuito, utilizzabile pienamente come supporto alla containerizzazione;<\/li><li>Docker EE (Enterprise Edition): a pagamento, offre certificazioni e supporto nonch\u00e9 elementi architetturali ideali per soluzioni di grande respiro.<\/li><\/ul>\n\n\n\n<p>Noi ci concentriamo su Docker CE, il pi\u00f9 utilizzato dagli sviluppatori perch\u00e9 offre una piattaforma ricca e completa per soluzioni professionali anche di livello notevole;<\/p>\n\n\n\n<p>L&#8217;architettura di Docker \u00e8 basata sul concetto Client-Server, abbiamo infatti:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Docker client<\/strong>, non \u00e8 altro che la riga di comando che consente all&#8217;utente di interagire con il server<\/li><li><strong>Docker Engine<\/strong> (detto anche dockerd o semplicemente docker server), permette l&#8217;esecuzione dei container con le varie applicazioni<\/li><\/ul>\n\n\n\n<p>\u00c8 possibile installare un docker client su una macchina remota rispetto al Docker Engine ma solitamente \u00e8 consigliato utilizzare la stessa macchina per questioni di sicurezza.<\/p>\n\n\n\n<p>Docker quindi viene installato sul server e fornisce semplici comandi con cui creare, avviare o interrompere i container partendo da un&#8217;immagine a disposizione. L&#8217;installazione \u00e8 disponibile per ogni tipo di piattaforma:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Per MacOS e Windows (e anche per Linux) possiamo installare&nbsp;<a href=\"https:\/\/docs.docker.com\/desktop\/\">Docker Desktop<\/a><\/li><li>Per Linux, ambiente nativo, l&#8217;installazione di Docker Engine \u00e8 disponibile anche mediante pacchetti precompilati disponibili nei repository<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Installazione<\/strong><\/h4>\n\n\n\n<p><strong>Configuriamo il repository<\/strong><\/p>\n\n\n\n<p>Per installare Docker Engine su una nuova macchina host, \u00e8 necessario prima configurare il repository Docker.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Aggiorniamo l&#8217;indice del pacchetto apt e installiamo i pacchetti per consentire&nbsp;l&#8217;utilizzo di un repository su HTTPS:<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sudo apt-get update\n\n$ sudo apt-get install \\\n    ca-certificates \\\n    curl \\\n    gnupg \\\n    lsb-release\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiungiamo la chiave GPG ufficiale di Docker:<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n sudo mkdir -p \/etc\/apt\/keyrings\n$ curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Utilizziamo il comando seguente per configurare il&nbsp;repository&nbsp;in versione <strong>stable<\/strong>.<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code aligncenter\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n $ echo \\\n  &quot;deb &#x5B;arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\\n  $(lsb_release -cs) stable&quot; | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null\n<\/pre><\/div>\n\n\n<p><strong>Installiamo Docker Engine<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ora che il repository \u00e8 configurato aggiorniamo l&#8217; indice del pacchetto e installiamo l&#8217;&nbsp;<em>ultima versione<\/em>&nbsp;dei pacchetti necessari<br>Se hai necessit\u00e0 di installare una versione precedente consulta la <a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">documentazione ufficiale<\/a>.<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ sudo apt-get update\n$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Una volta terminata l&#8217;installazione, abilitiamo docker per fare in modo che il servizio si avviii automaticamente ad ogni riavvio della macchina e verifichiamo che Docker Engine sia installato correttamente eseguendo l&#8217;\u00a0immagine di test hello-world.<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ systemctl enable docker\n$ sudo docker run hello-world\n<\/pre><\/div>\n\n\n<p>L&#8217;ultimo comando scarica un&#8217;immagine di prova e la esegue in un contenitore.\u00a0Quando questo contenitore viene eseguito, stampa un messaggio &#8220;hello word&#8221; ed esce dall&#8217;esecuzione, se questo accade vuol dire che Docker Engine \u00e8 installato correttamente<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>N.B. : durante l&#8217;\u00ecinstallazione, il gruppo docker viene creato ma non vengono aggiunti utenti.\u00a0\u00c8 quindi necessario utilizzare\u00a0<strong>sudo <\/strong>per eseguire correttamente i comandi.\u00a0<a href=\"https:\/\/docs.docker.com\/engine\/install\/linux-postinstall\/\">Segui il link alla post-installazione<\/a>\u00a0di Linux\u00a0per consentire agli utenti non privilegiati di eseguire i comandi Docker e per altri passaggi di configurazione facoltativi.<\/p><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusioni<\/h3>\n\n\n\n<p>Docker \u00e8 uno strumento che pu\u00f2 arricchire molto il bagaglio culturale di un programmatore. E\u2019 ricco di concetti particolari, ma non bisogna farsi spaventare perch\u00e9 \u00e8 perfettamente abbordabile, interessante, gratuito e si rende utile sin dai primi momenti di utilizzo. Una volta rotto il ghiaccio con l&#8217;utilizzo dei comandi, non si installer\u00e0 mai pi\u00f9 un database, un linguaggio o un tool direttamente sulla propria workstation solo per provarlo: si cercher\u00e0 un\u2019immagine su Docker Hub, si eseguir\u00e0 il container e, una volta terminato lo si rimuover\u00e0 rapidamente. Poi, raggiunta la dimestichezza necessaria, poche righe di Docker Compose permetteranno di avviare ambienti di lavoro pi\u00f9 articolati composti da pi\u00f9 elementi. <\/p>\n\n\n\n<p>Approfondiremo questi ed altri concetti nei prossimi articoli dedicati a Docker, restate sintonizzati con noi!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker \u00e8 una piattaforma software che permette di creare, testare e distribuire applicazioni con la massima rapidit\u00e0.<br \/>\nIl vantaggio principale di Docker \u00e8 quello di consentire agli utenti di\u00a0impacchettare un&#8217;applicazione con tutte le sue dipendenze in un unico &#8220;contenitore&#8221;\u00a0chiamato container e di eseguirlo con estrema rapidit\u00e0.<\/p>\n","protected":false},"author":6,"featured_media":6365,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wds_primary_category":0,"footnotes":""},"categories":[187],"tags":[186,48,110],"class_list":["post-6323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","tag-container","tag-docker","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/6323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/comments?post=6323"}],"version-history":[{"count":0,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/6323\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/media\/6365"}],"wp:attachment":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/media?parent=6323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/categories?post=6323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/tags?post=6323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}