<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Docker Tutorial</title>
	<atom:link href="https://dockertutorial.it/feed/" rel="self" type="application/rss+xml" />
	<link>https://dockertutorial.it</link>
	<description></description>
	<lastBuildDate>Sat, 30 Jan 2021 09:18:59 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://dockertutorial.it/wp-content/uploads/2020/04/cropped-New-Project-2-32x32.png</url>
	<title>Docker Tutorial</title>
	<link>https://dockertutorial.it</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">186986242</site>	<item>
		<title>Cos&#8217;è Docker? Perché usarlo?</title>
		<link>https://dockertutorial.it/cose-docker-perche-usarlo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cose-docker-perche-usarlo</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 09:49:23 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=23</guid>

					<description><![CDATA[<p>Cos&#8217;è Docker? Per rispondere a questa domanda in realtà dobbiamo partire da un po&#8217; più distante. Qual è l&#8217;idea che sta alla base di Docker?...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cose-docker-perche-usarlo/">Cos&#8217;è Docker? Perché usarlo?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2>Cos&#8217;è Docker?</h2>



<p>Per rispondere a questa domanda in realtà dobbiamo partire da un po&#8217; più distante.</p>



<p><em>Qual è l&#8217;idea che sta alla base di Docker? Quali sono le cause che hanno portato alla nascita di questa tecnologia?</em></p>



<p>Partiamo dicendo che <strong>Docker è una tecnologia nata per consentire la creazione e gestione di container Linux.</strong> </p>



<p>Linux fa già ampio uso dei container in diverse tecnologie, anche nel proprio kernel. Per fare qualche nome: <em>kernel namespace, control groups, union file system</em> e, per ultimo, <em>Docker</em>.</p>



<p>Si è scelto di utilizzare Linux perché al momento in cui è stato lanciato il progetto era l&#8217;unico sistema operativo in grado di gestire nativamente una struttura a Container. Questo è stato possibile grazie a diverse entità, sia la community di Linux, sia diversi player commerciali. Giusto per fare un esempio, <strong>Kubernetes</strong> vede la sua origine in un progetto di Google ed ha proprio Docker come runtime di default. </p>



<h3>Kubernetes</h3>



<p>Giusto due parole in merito a Kubernetes.  Kubernes deriva dal greco &#8220;<em>κυβερνήτης</em>&#8221; che significa Timoniere.   Si tratta di <strong>uno dei principali sistemi per la gestione ad alto livello di container</strong> ( orchestration, deployment, autoscaling, load balancing, service discovery, &#8230; ).</p>



<p>Riassumendo con una metafora, in sistemi complessi<strong> Docker è il braccio e Kubernetes è la mente</strong>.</p>



<p>Non è strettamente necessario utilizzare Kubernetes, Docker mette a disposizione il suo orchestrator chiamato Docker Swarm anche se la community sembra preferire sempre più Kubernetes a Swarm.</p>



<p>Linux fa già ampio uso dei container in diverse tecnologie, anche nel proprio kernel. Per fare qualche nome: <em>kernel namespace, control groups, union file system</em> e, per ultimo, <em>Docker</em>.</p>



<p>Sebbene sia possibile gestire tutte le dipendenze tra container a mano, è molto comodo avere uno strumento che centralizzi la gestione di dipendenze, relazioni e interazioni tra container al crescere delle applicazioni.</p>



<h2>Perché dovrei usare Docker?</h2>



<p>Essendo un container ricavato da un&#8217;immagine, è possibile dire con le dovute approssimazioni che nel momento in cui devo replicare un ambiente da una parte ad un altra mi basterà istanziare un container a partire dalla stessa immagine e collegare eventualmente le risorse necessarie.</p>



<p>Questo trova risvolto immediato in due situazioni:</p>



<ul><li>Tra sviluppatori</li><li>Nei vari ambienti:<ul><li>Sviluppo</li><li>Produzione</li><li>Staging</li><li>Test</li><li>&#8230;</li></ul></li><li>Cambio provider hosting</li><li>Scalabilità</li><li>Pacchettizzazione</li><li>Provisioning gestito da infrastruttura docker</li></ul>



<p>Utilizzando docker possiamo praticamente <strong>azzerare il tempo necessario a mettere uno/a sviluppatore/trice in condizione di lavorare su un nuovo progetto</strong> poiché il tempo necessario alla replica dell&#8217;ambiente in locale si limiterà ad avviare un container da un&#8217;immagine che gli/le forniremo</p>



<p>Quando cambiamo provider per l&#8217;hosting, potremmo replicare l&#8217;ambiente semplicemente facendo deploy dello stesso cluster. </p>



<p>La <strong>scalabilità</strong> viene gestita mediante dei <strong>balancer</strong>. Il meccanismo è simile a quello dei servizi cloud con le macchine virtuali ovvero spawn e kill in base a delle soglie sull&#8217;utilizzo delle risorse. A differenza di questi ultimi però, non saranno macchine virtuali ad essere istanziate o spente, ma container. Questo permette <strong>maggior controllo su costi e risorse</strong>.</p>



<p>Questo concetto, applicato ad ambienti cloud, permette di scalare praticamente all&#8217;infinito.</p>



<p>Per ultima, la pacchettizzazione. <strong>Tutto ciò che è necessario per l&#8217;esecuzione può essere spedito assieme.</strong> Questo è diretta conseguenza del fatto che un container viene costruito sempre a partire da un&#8217;immagine che deve dichiarare tutto il necessario affinché esso possa venire eseguito. </p>



<p>Partire sempre dalla stessa immagine, significa partire sempre dalla stessa condizione iniziale. Di riflesso, non ci saranno problemi di configurazione poiché già affrontati in fase di configurazione dell&#8217;immagine.</p>



<p>Se decidiamo di affidare l&#8217;immagine all&#8217;infrastruttura di Docker, ci togliamo anche il problema di garantirne la fruibilità. Per fare ciò docker usa una sorta di repository di immagini chiamato <strong>Docker Registry</strong>. Se affidiamo le nostre immagini a questo servizio, una volta caricata l&#8217;immagine con il tag di versione, sarà poi il registry a distribuire l&#8217;immagine per noi.</p>



<p>Nel caso appena descritto, la nostra responsabilità sta nella costruzione dell&#8217;immagine e nel corretto funzionamento del container una volta in esecuzione sul server. tutto ciò che sta nel mezzo è sotto la responsabilità di Docker.</p>



<p>Questo, di riflesso, fa si che un utilizzatore possa usare un immagine così com&#8217;è senza preoccuparsi dei dettagli implementativi, basta che venga utilizzata in conformità all&#8217;architettura.</p>



<p>Vedremo anche questo in dettaglio, tuttavia un container disegnato per eseguire in ambiente x86_64 non funzionerà in ambiente ARM. Questo perché non si tratta di una macchina virtuale ma di un processo in esecuzione sull&#8217;host nel quale è in esecuzione il demone di Docker</p>



<h4>Che cos&#8217;è un container?</h4>



<p>Quando ci si approccia a Docker, ci si aspetta di avere a che fare con i container dal primo momento. Ed in qualche modo è così.</p>



<p>Ma è troppo presto, non si può definire dettagliatamente il concetto di container senza sapere cosa sia un&#8217;immagine.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/introduzione-sulle-immagini/">Introduzione sulle immagini</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/sfondo" target="_blank" rel="noreferrer noopener">lifeforstock &#8211; it.freepik.com</a></p>



<p></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cose-docker-perche-usarlo/">Cos&#8217;è Docker? Perché usarlo?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">23</post-id>	</item>
		<item>
		<title>Introduzione sulle Immagini</title>
		<link>https://dockertutorial.it/introduzione-sulle-immagini/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduzione-sulle-immagini</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 09:50:01 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=24</guid>

					<description><![CDATA[<p>Chi si interessa a Docker, solitamente sa che è possibile eseguire qualcosa in un container e vuole capire come far girare la sua applicazione, ma...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/introduzione-sulle-immagini/">Introduzione sulle Immagini</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Chi si interessa a Docker, solitamente sa che è possibile eseguire qualcosa in un container e vuole capire come far girare la sua applicazione, ma non sa come.</p>



<figure class="wp-block-pullquote no-quotes-citation"><blockquote><p><em>Un container ha bisogno di sapere che cosa eseguire e qual è l&#8217;ambiente su cui deve operare. Per fare ciò si usano le immagini ed un container non è altro che un immagine in esecuzione</em></p></blockquote></figure>



<div class="wp-block-group"><div class="wp-block-group__inner-container">
<p>Detta in breve: </p>
</div></div>



<p>Per ora, quando parliamo di un&#8217;immagine, parliamo di una <strong>configurazione che determina come deve essere fatto il sistema</strong> che andrà eseguito.</p>



<p>Facendo un parallelo con la <em>programmazione ad oggetti</em>, possiamo trattare l&#8217;immagine alla stregua di una classe ed i container eseguiti su di essa alla stregua di oggetti.</p>



<h2>Microservizi</h2>



<p>Questa soluzione si sposa alla perfezione con l&#8217;<a href="https://en.wikipedia.org/wiki/Microservices">approccio a Microservizi</a>.</p>



<p>Ogni <strong>immagine specifica come deve essere fatto il servizio </strong>che rappresenta, mentre ogni container è esattamente un&#8217;istanza di quel servizio.</p>



<p>In caso di sovraccarico o carenza di risorse di un container, andremo ad istanziare un altro servizio. Con le stesse caratteristiche. Dalla stessa immagine.</p>



<p></p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/cosa-c-era-prima/" class="aioseop-link">Cosa c&#8217;era prima</a></p>



<p>Immagine: <a rel="noreferrer noopener" href="https://it.freepik.com/foto-vettori-gratuito/sfondo" target="_blank" class="aioseop-link"></a><a href="https://it.freepik.com/foto-vettori-gratuito/acqua">Acqua foto creata da wirestock &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/introduzione-sulle-immagini/">Introduzione sulle Immagini</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">24</post-id>	</item>
		<item>
		<title>Cosa c&#8217;era prima?</title>
		<link>https://dockertutorial.it/cosa-c-era-prima/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cosa-c-era-prima</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 13:26:24 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=51</guid>

					<description><![CDATA[<p>Innanzitutto, cosa c&#8217;era prima di Docker? Rispondere a questa domanda senza generalizzare troppo è molto difficile. Tuttavia, semplificando, possiamo racchiudere tutto in due macro-categorie: Macchine...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cosa-c-era-prima/">Cosa c&#8217;era prima?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Innanzitutto, cosa c&#8217;era prima di Docker?</p>



<p>Rispondere a questa domanda senza generalizzare troppo è molto difficile. <br>Tuttavia, semplificando, possiamo racchiudere tutto in due macro-categorie: <strong>Macchine Fisiche </strong>e <strong>Macchine Virtuali</strong>.</p>



<h3>Macchine Fisiche</h3>



<p>Come tutte le soluzioni, presentano sia pro sia contro. <br>Dato che stiamo parlando do Docker, mi limito a esplicitare i problemi che hanno spinto a trovare una soluzione in tale direzione.</p>



<ul><li>Dimensionate con una stima, spesso difficile da eseguire</li><li>Costi Elevati</li><li>Difficoltà a scalare</li><li>Difficoltà a replicare il codice in altre macchine</li><li>Difficoltà di monitoraggio delle risorse in modo centralizzato</li><li>Tempistiche d&#8217;intervento molto lunghe in caso di failure</li></ul>



<p>I punti trovano riscontro in diversi aspetti. Il primo che mi viene in mente è un servizio con picchi di utenza e lunghi periodi di carico basso. </p>



<p>Con in sistema a macchine fisiche (Bare-Metal) l&#8217;unica soluzione è avere in dotazione l&#8217;infrastruttura necessaria alla gestione dell&#8217;intero carico. Pagando per la gestione della stessa ed il costo di mantenimento in servizio anche nei periodi in cui l&#8217;utilizzo è ridotto.</p>



<p>A questo aspetto si somma anche l&#8217;esattezza della stima di massimo carico che, se errata, rischia anche di rendere il costoso sistema inadeguato al carico.</p>



<p>Con Docker si può risolvere, attraverso i Command Line Tool, la problematica della decentralizzazione delle risorse. Vi è un sistema infatti che permette di vedere in modo centralizzato, lo stato di tutte le risorse in ogni momento.</p>



<p></p>



<p>E in caso di failure?</p>



<p>In un ambiente di questo tipo, un problema ad una macchina determina una procedura risolutiva piuttosto lunga. Innanzitutto capire di quale macchina si tratta. Poi dobbiamo ripristinare il suo ambiente e solo dopo possiamo tornare operativi.</p>



<p>Con Docker invece sarà sufficiente riavviare il container associando eventualmente la nuova risorsa. Qualora il problema si facesse più grave e coinvolgesse una macchina su cui sta girando Docker, basterà installare Docker su una nuova macchina ed il resto, dopo il deploy dell&#8217;infrastruttura, verrà da se.</p>



<h2>Macchine Virtuali</h2>



<p>Spesso utilizzate per spedire (delivery) delle applicazioni complete.<br>Di conseguenza, se volessimo trasportare l&#8217;approccio a microservizi alle macchine virtuali, dovremmo avere una macchina virtuale per ogni servizio.</p>



<p>Per ogni macchina virtuale dovrei gestire singolarmente sistema operativo, ram, disco, processori, visibilità di rete.</p>



<p>Non è sicuramente la miglior soluzione possibile.</p>



<p>Prendiamo ad esempio avere un server Apache con MySql e un reverse proxy NGINX. Una gestione a microservizi si macchine virtuali richiederebbe tre sistemi operativi, magari anche della stessa versione. </p>



<p>È proprio qui che emerge il reale vantaggio di utilizzare Docker. <br></p>



<p>Quello che succede è che vengono creati dei container. I container sono una sorta di sandbox, e dialogano con l&#8217;esterno con delle modalità che approfondiremo quando parleremo di Network e di apertura delle porte nei container.</p>



<figure class="wp-block-pullquote"><blockquote><p>Spesso utilizzare Docker o meno determina la possibilità o meno di realizzare un servizio con l&#8217;infrastruttura a disposizione o meno</p></blockquote></figure>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/container-su-windows-e-mac/">Container su Windows e Mac</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/viag" target="_blank" rel="noreferrer noopener">photoangel &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cosa-c-era-prima/">Cosa c&#8217;era prima?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">51</post-id>	</item>
		<item>
		<title>Container su Windows e Mac</title>
		<link>https://dockertutorial.it/container-su-windows-e-mac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=container-su-windows-e-mac</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 14:16:25 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=65</guid>

					<description><![CDATA[<p>Windows Sebbene Docker sia nato per per la gestione di container Linux, anche microsoft ha deciso di mettere a disposizione degli sviluppatori una tecnologia che...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/container-su-windows-e-mac/">Container su Windows e Mac</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2>Windows</h2>



<p>Sebbene Docker sia nato per per la gestione di container Linux, anche microsoft ha deciso di mettere a disposizione degli sviluppatori una tecnologia che permetta di lavorare in un ambiente simile. Stiamo parlando di: &#8220;<strong>Windows Container</strong>&#8220;.</p>



<p>Purtroppo è una tecnologia nuova e, nel momento in cui scrivo, solo <strong>Windows 10 (Professional o Enterprise a 64 bit)</strong> e <strong>Windows Server 2016</strong> supportano nativamente questa funzionalità. Per maggiori dettagli e una lista aggiornata delle versioni, vi rimando a <a href="https://hub.docker.com/editions/community/docker-ce-desktop-windows" target="_blank" rel="noreferrer noopener">questo link</a>.</p>



<p>Nel caso non abbiate a disposizione una di queste versioni di Windows, esiste un&#8217;alternativa.</p>



<p>Per le altre versioni di Windows, è possibile utilizzare una Toolbox che predispone l&#8217;ambiente su una macchina virtuale creata ad-hoc su VirtualBox. Ne consegue che verrà chiesto di installare l&#8217;ambiente di virtualizzazione &#8220;Virtual Box&#8221; che appesantirà l&#8217;esecuzione e brucerà delle risorse, ma per lo sviluppo va benissimo ed è anche gratuito.  </p>



<h2>Mac</h2>



<p>Per quanto riguarda macOs, il supporto ai container non è nativo.</p>



<p>In questo caso è possibile scaricare Docker for Mac che fornisce un pacchetto completo che esegue, anche in questo caso, i container in una macchina virtuale Linux.</p>



<p></p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/facciamo-chiarezza/" class="aioseop-link">Facciamo Chiarezza</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/albero">Albero foto creata da freepik &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/container-su-windows-e-mac/">Container su Windows e Mac</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">65</post-id>	</item>
		<item>
		<title>Facciamo chiarezza</title>
		<link>https://dockertutorial.it/facciamo-chiarezza/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facciamo-chiarezza</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 26 Apr 2020 10:12:40 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=134</guid>

					<description><![CDATA[<p>Spesso quando si parla di Docker si tende a confondere tra loro diverse cose. In particolare: Docker Inc. Docker Runtime / Docker Orchestration engine Docker...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/facciamo-chiarezza/">Facciamo chiarezza</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Spesso quando si parla di Docker si tende a confondere tra loro diverse cose. <br>In particolare:</p>



<ol><li>Docker Inc.</li><li>Docker Runtime / Docker Orchestration engine</li><li>Docker Project</li></ol>



<h2>Docker Inc.</h2>



<p>Si tratta dell&#8217;<strong>azienda</strong> che in questo momento<strong> mantiene il progetto Docker</strong>.</p>



<p>Quando è nata non si chiamava così, ma &#8220;dotCloud&#8221; e forniva un servizio di tipo PaaS (Platform as a Service) per la gestione dei container linux.</p>



<p>Per fare ciò, dotCloud aveva sviluppato un tool interno, chiamato appunto: &#8216;Docker&#8217;.<br>Il nome Docker è stato ricavato da &#8220;Dock-Worker&#8221;, ovvero le persone che si occupano di caricare e scaricare le navi dai porti, in questo caso con particolare riferimento ai container.</p>



<p>Purtroppo il modello di business si è rivelato particolarmente fragile e nel 2013 vi è stato un cambio di dirigenza che ha visto <a href="https://www.docker.com/blog/excited-to-be-joining-the-great-teams-at-dotcloud-docker-as-ceo/" class="aioseop-link">cambiare l&#8217;amministratore delegato in Ben Golub</a>.</p>



<p>Con Ben Golub, il <strong>framework</strong> è diventato <strong>disponibile a tutti</strong>.</p>



<h2>Docker Runtime / Docker Orchestration engine</h2>



<p>In questo caso stiamo parlando del core. <br>Questo è il <strong>motore che si occupa di far funzionare i container</strong>.</p>



<p>Una delle caratteristiche certamente più interessanti è la possibilità di <strong>estendere</strong> questa componente mediante dei <strong>plugin</strong>.</p>



<p>Esistono due versioni diverse:</p>



<ul><li><strong>CE</strong> &#8211; Community Edition</li><li><strong>EE</strong> &#8211; Enterprise Edition</li></ul>



<p><strong>La</strong> <strong>versione community è gratuita</strong>, mentre la <strong>versione enterprise è a pagamento</strong>. <br>La differenza tra le due è che la versione enterprise mette a disposizione delle caratteristiche pensate appositamente per il business, tra le quali il <strong>supporto qualificato</strong> e le modalità supporto alle versioni.</p>



<p>Il 13 Novembre 2019, <a href="https://www.mirantis.com/blog/mirantis-acquires-docker-enterprise-platform-business/" class="aioseop-link">Docker Enterprise è stato </a><a href="https://www.mirantis.com/company/press-center/company-news/mirantis-acquires-docker-enterprise/" class="aioseop-link">acquisito</a><a href="https://www.mirantis.com/blog/mirantis-acquires-docker-enterprise-platform-business/" class="aioseop-link"> da Mirantis</a>.</p>



<p>Tutti gli esempi presenti sul tutorial, saranno eseguiti in ambiente community, quindi saranno replicabili nell&#8217;ambiente gratuito previsto dalla community edition.</p>



<p>La versione Enterprise si divide a sua volta in <strong>tre versioni</strong>:</p>



<ul><li>Enterprise Basic</li><li>Enterprise Standard</li><li>Enterprise Advanced</li></ul>



<h2>Politica delle release</h2>



<p>Sia per la versione community, sia per la versione enterprise, è previsto <strong>un rilascio di tipo stable</strong> <strong>ogni tre mesi</strong>.</p>



<p>La versione <strong>enterprise</strong> garantisce patch e <strong>bugfix per 12</strong> mesi a partire dal rilascio della versione di Docker. La versione <strong>community</strong>, invece, fornisce lo stesso tipo di assistenza solo per i <strong>4 mesi</strong> successivi al rilascio della versione stable,</p>



<p>È disponibile anche un terzo canale di rilascio per le versioni community, ovvero il <strong><a href="https://docs.docker.com/docker-for-windows/faqs/" class="aioseop-link">canale edge</a></strong>.<br>Questo tipo di rilascio avviene <strong>con cadenza mensile e vengono mantenuti solo per il mese successivo alla data di rilascio</strong>.</p>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="376" src="http://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02.png" alt="" class="wp-image-147" srcset="https://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02.png 1024w, https://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02-300x110.png 300w, https://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02-768x282.png 768w, https://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02-100x37.png 100w, https://dockertutorial.it/wp-content/uploads/2020/04/2017_08_21_docker-02-700x257.png 700w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Grafico dei rilasci</figcaption></figure></div>



<p>Guardando con attenzione il grafico dei rilasci, emergono i tag utilizzati per indicare i numeri di versione.<br>A partire dal 2017, si compone il numero di versione in questo modo:</p>



<p>v <span class="has-inline-color has-vivid-green-cyan-color"><strong>2 numeri per l&#8217;anno</strong></span> <span class="has-inline-color has-vivid-red-color">.</span> <span class="has-inline-color has-vivid-cyan-blue-color"><strong>2 numeri per il mese</strong></span></p>



<p>Ad esempio v17.09 è la versione che è stata rilasciata nel settembre del 2017.<br>A dire il vero questo tag di release non è completo. <br>Oltre a queste informazioni è possibile trovare la <strong>patch</strong> appena dopo il mese e l&#8217;indicazione del tipo di release. I tag di release, infatti, specificano se si tratta di una release di Docker CE o EE. Per fare ciò viene posta la stringa <strong>-ce</strong> in coda al tag di versione nel caso si tratti di un release di tipo community.</p>



<p>È possibile consultare l&#8217;elenco delle versioni community a <a href="https://github.com/docker/docker-ce/tags" class="aioseop-link">questo link</a>.</p>



<h2>Docker Project</h2>



<p>Quando si parla di Docker o Moby project si parla del progetto che <strong>nasce per scomporre Docker</strong>, che fino al 2017 si presentava come monolitico, <strong>in componenti</strong>. Andremo più in dettaglio su tale aspetto nelle prossime sezioni.</p>



<p>Questo progetto ha chiesto aiuto al mondo open source, rivolgendosi in particolare a chi aveva (ed ha) dimestichezza con il mondo <a href="https://golang.org/" class="aioseop-link">GO</a>. </p>



<p>Nel caso qualcuno se la sentisse e avesse voglia di dare il suo contributo, ecco il <a href="https://github.com/moby/moby" class="aioseop-link">repository</a>.</p>



<p>Nella <strong>DockerCon</strong> (la principale conferenza annuale su Docker) del 2017, ha cambiato nome in <a href="https://mobyproject.org/" class="aioseop-link">Moby Project</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="http://dockertutorial.it/wp-content/uploads/2020/04/moby-project-logo.jpg" alt="" class="wp-image-152" width="268" height="151" srcset="https://dockertutorial.it/wp-content/uploads/2020/04/moby-project-logo.jpg 638w, https://dockertutorial.it/wp-content/uploads/2020/04/moby-project-logo-300x169.jpg 300w, https://dockertutorial.it/wp-content/uploads/2020/04/moby-project-logo-100x56.jpg 100w" sizes="(max-width: 268px) 100vw, 268px" /></figure></div>



<p>Ma perché è nato moby?</p>



<p>C&#8217;è stato un momento in cui ci sono state delle scaramucce nel mondo di Docker.<br>La causa principale deriva dal fatto che <strong>le componenti di Docker sono pensate per essere intercambiabili</strong>, un po&#8217; come se fossero dei pezzi di motore di un auto (se qualcuno li conosce, può averne riscontro immediato pensando ai driver di rete).</p>



<p>Questo, a dirla tutta, è un fattore positivo poiché permette di poter scegliere la componente che risponde meglio alle esigenze del caso specifico in cui ci si imbatte.</p>



<p>Il problema è che questo funziona bene solo se tutti giocano con le stesse regole.</p>



<p>Nelle fasi iniziali di docker purtroppo non è stato così. <br>Vi erano componenti sviluppate da Docker e componenti di terze parti. <br>Ad un certo punto si è verificato un <strong>braccio di ferro</strong> tra <strong>Docker</strong> e <strong>CoreOs</strong> che ha portato dei problemi di compatibilità tra i plugin di terze parti e quelli ufficiali.</p>



<p>La crescita di Docker e della sua adozione era seriamente compromessa proprio a causa della non interoperabilità di plugin ufficiali con plugin di terze parti.</p>



<p>È risultato evidente che c&#8217;era bisogno di adottare uno <strong>standard condiviso</strong>.<br>Da qui, è stata fondata <a href="https://www.opencontainers.org/" class="aioseop-link">OCI (Open Container Initiative)</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="http://dockertutorial.it/wp-content/uploads/2020/04/OCI-1024x442.png" alt="" class="wp-image-160" width="406" height="174" srcset="https://dockertutorial.it/wp-content/uploads/2020/04/OCI-1024x442.png 1024w, https://dockertutorial.it/wp-content/uploads/2020/04/OCI-300x129.png 300w, https://dockertutorial.it/wp-content/uploads/2020/04/OCI-768x331.png 768w, https://dockertutorial.it/wp-content/uploads/2020/04/OCI-100x43.png 100w, https://dockertutorial.it/wp-content/uploads/2020/04/OCI-700x302.png 700w, https://dockertutorial.it/wp-content/uploads/2020/04/OCI.png 1381w" sizes="(max-width: 406px) 100vw, 406px" /></figure></div>



<p>OCI è un&#8217;<strong>organizzazione</strong> che racchiude tutti i principali player che si occupano di container e si pone come obiettivo quello di <strong>guidare una crescita secondo regole comuni</strong> e degli standard che devono essere adottati da tutti.</p>



<p>L&#8217;architettura del motore di Docker si è conformata ai dettami previsti dalla release di OCI relativa ai runtime.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/il-motore/" class="aioseop-link">Il motore</a></p>



<p><a href="https://it.freepik.com/foto-vettori-gratuito/sfondo" class="aioseop-link"></a><a href="https://it.freepik.com/foto-vettori-gratuito/sfondo" class="aioseop-link">Foto creata da mrsiraphol &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/facciamo-chiarezza/">Facciamo chiarezza</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">134</post-id>	</item>
		<item>
		<title>Il motore</title>
		<link>https://dockertutorial.it/il-motore/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=il-motore</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 26 Apr 2020 16:24:36 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=155</guid>

					<description><![CDATA[<p>Parliamo ora di quello che è il vero e proprio motore di Docker, il Docker Engine. In questa sezione approfondiremo quella che è stata l&#8217;evoluzione...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/il-motore/">Il motore</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Parliamo ora di quello che è il vero e proprio motore di Docker, il <strong>Docker Engine</strong>.</p>



<p>In questa sezione approfondiremo quella che è stata <strong>l&#8217;evoluzione del motore di Docker</strong> e delle principali componenti che lo compongono.</p>



<p>È possibile utilizzare Docker ad un buon livello anche senza conoscere nel dettaglio questa tematica. Incoraggio comunque a conoscere anche questo aspetto per avere un idea più chiara di cosa succede a basso livello. A me è tornato utile per risolvere alcuni bug particolarmente insidiosi.</p>



<p>Il motore di Docker, <strong>Docker Engine</strong>, ha la responsabilità di <strong>gestire ed eseguire i container</strong>.<br>Proprio come il motore di un&#8217;auto, è composto da componenti specializzate ed intercambiabili ed è aderente, dove possibile, alle specifiche definite da OCI.</p>



<p>I principali componenti che compongono il Docker engine sono: &#8220;<strong>Docker</strong> <strong>Client</strong>&#8220;, &#8220;<strong>Docker</strong> <strong>Daemon</strong>&#8220;, &#8220;<strong>containerd</strong>&#8221; e &#8220;<strong>runc</strong>&#8220;.</p>



<p>Per quanto riguarda il demone, in particolare, la storia è un po&#8217; travagliata. <br>All&#8217;inizio il demone era monolitico, accorpando quindi molte funzionalità nella stessa codebase.<br>Esso si <strong>serviva di LXC</strong> per avere accesso alle principali primitive relative i container presenti nel kernel Linux. Questa dipendenza ha fatto nascere un problema serio: <strong>le funzionalità core di Docker erano dipendenti da un servizio di terze parti, LXC</strong>, sul quale Docker non aveva nessuna tipologia di controllo.</p>



<p>La soluzione è stata<strong> l&#8217;implementazione in casa un framework in grado di prendersi in carico le responsabilità</strong> che fino a quel momento erano state demandate a LXC. Questo strumento proprietario si chiama <strong>libcontainer</strong> ed è utilizzato da Docker a partire dalla versione 0.9.<br>Il modulo libcontainer, oltre al non essere più dipendente da LXC, è anche <strong>cross platform</strong>, quindi può venire eseguito in diverse piattaforme e non più solo su linux.</p>



<p>Anche il fatto di utilizzare un demone, Docker daemon, monolitico ha portato non poche problematiche, soprattutto alla luce della grande diffusione. Un codice non modulare è per definizione difficile da estendere, correggere e, più in generale, da mantenere.<br>Preso atto della situazione, Docker Inc. ha iniziato un refactor molto accurato, che per altro è ancora in corso. L&#8217;obiettivo  è quello di <strong>scomporre il demone in moduli più piccoli</strong>, che siano <strong>specializzati</strong>, <strong>intercambiabili</strong> e soprattutto &#8211; <strong>manutenibili</strong>.</p>



<p>Alcune funzionalità di primo piano sono già state scorporate dal demone, quali <strong>container runtime</strong> e <strong>esecuzione dei container</strong> in moduli chiamati rispettivamente <strong>runc</strong> e <strong>containerd</strong>. Di questi ultimi parleremo tra pochissimo.</p>



<h2>Componenti principali</h2>



<p>Prima di spiegarle ad una ad una, cerchiamo di capire come sono in relazione tra loro aiutandoci con la seguente figura.&nbsp;</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="http://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-1024x970.png" alt="" class="wp-image-164" width="591" height="559" srcset="https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-1024x970.png 1024w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-300x284.png 300w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-768x727.png 768w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-1536x1454.png 1536w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-100x95.png 100w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-475x450.png 475w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52-1267x1200.png 1267w, https://dockertutorial.it/wp-content/uploads/2020/04/Schermata-2020-04-26-alle-18.49.52.png 1620w" sizes="(max-width: 591px) 100vw, 591px" /><figcaption>Interazioni tra le componenti di Docker</figcaption></figure></div>



<h3>CLI</h3>



<p>La <strong>componete più in alto</strong> nella figura rappresenta il <strong>client</strong>, dove è possibile eseguire comandi della CLI (Command Line Interface) di Docker. Qui il <a href="https://docs.docker.com/engine/reference/commandline/cli/" class="aioseop-link">link alla documentazione</a>.</p>



<p class="has-background has-very-light-gray-background-color">La CLI viene utilizzata per <strong>controllare il demone</strong> di Docker, il quale si avvale del <strong>container supervisor “containerd” </strong>per avviare, fermare o sospendere i container.<br>I container vengono eseguiti all&#8217;interno di un <strong>container runtime</strong> chiamato “<strong>runc</strong>”.</p>



<p>Per il momento lasciamo un attimo da parte “shim”, ci arriveremo tra un attimo. Per ora è importante che siano chiare le funzionalità a cui assolvono i moduli appena descritti e, dato che ci siamo, cerchiamo di capire qualcosa di più su di essi.</p>



<h3>Runc</h3>



<p>Runc è l&#8217;<strong>implementazione del container runtime</strong> aderente alle specifiche definite da OCI.&nbsp;<br>Si tratta di un modulo standalone che <strong>ha il compito di creare container</strong>.&nbsp;</p>



<p>Più in generale si tratta di <strong>un&#8217;interfaccia</strong> a linea di comando<strong> per libcontainer</strong>.</p>



<h3>Containerd</h3>



<p>Containerd gestisce invece la <strong>logica di esecuzione dei container</strong>.</p>



<p>Questo modulo<strong> gestisce i container ma non li crea</strong>. La loro creazione è gestita mediante l’apposito modulo runc.</p>



<p>Gestisce routine come <strong>start</strong>, <strong>stop</strong>, <strong>pause</strong>, <strong>rm</strong>, ed alcune altre per le quali vi lascio il <a href="https://containerd.io" class="aioseop-link">link al sito ufficiale</a>.</p>



<p>Come potrete notare dal sito, oltre ai container, containerd gestisce anche <strong>alcune funzionalità relative alle immagini</strong>. Questo per esigenze dettate da sistemi di Orchestration, Kubernetes in primis.<br>Containerd è stato sviluppato da Docker Inc. ma è stato donato a <a href="https://www.cncf.io/" class="aioseop-link">CNCF (Cloud Native Computing Foundation)</a>.</p>



<h3>Shim</h3>



<p>Runc crea i container, ma una volta assolto questo compito, esso termina, lasciando il container senza un processo padre.</p>



<p>Per prevenire ciò, viene creato <strong>un processo shim per ogni container</strong>. Il processo shim <strong>diventa il padre del container</strong> a cui è riferito.</p>



<p>Alcune delle responsabilità che assume inerenti al processo riferito container figlio sono, Gestione degli stream di IO e notifica degli eventi ad esso pertinenti al demone.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/container-le-basi/" class="aioseop-link">Container &#8211; Le basi</a></p>



<p>Immagine: <a rel="noreferrer noopener" href="https://it.freepik.com/foto-vettori-gratuito/sfondo" target="_blank" class="aioseop-link">mrsiraphol &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/il-motore/">Il motore</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">155</post-id>	</item>
		<item>
		<title>Container &#8211; le basi</title>
		<link>https://dockertutorial.it/container-le-basi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=container-le-basi</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sat, 02 May 2020 14:23:41 +0000</pubDate>
				<category><![CDATA[Introduzione]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=189</guid>

					<description><![CDATA[<p>In questa sezione ci faremo un’idea di base del funzionamento di un container, in modo da avere gli strumenti minimi per affrontare il prossimo capitolo....</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/container-le-basi/">Container &#8211; le basi</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>In questa sezione ci faremo un’idea di base del funzionamento di un container, in modo da avere gli strumenti minimi per affrontare il prossimo capitolo.</p>



<p>Faccio una premessa, io sono solito utilizzare il client per mac. I comandi sono gli stessi per tutti i sistemi operativi, tuttavia può capitare che qualche immagine non sia compatibile con alcuni sistemi operativi o architetture. Questo risulterà più chiaro nel prossimo capitolo ed in particolare quando parleremo di immagini ad architettura multipla e di manifest.</p>



<p></p>



<h2>Lanciare il primo container</h2>



<p>Iniziamo con l’istruzione di base, quella che permette di creare un container a partire da un immagine, ovvero: </p>



<pre class="wp-block-code"><code>docker container run</code></pre>



<p>L’istruzione &#8220;<em>docker container run&#8221;</em>, <strong>istanzia un container a partire da una specifica immagine</strong>.</p>



<p>Coma da tradizione, quando si inizia a prendere confidenza con una nuova tecnologia, si comincia sempre con un &#8220;Hello world&#8221;. Guarda caso esiste proprio un&#8217;immagine che si chiama &#8220;hello-world&#8221;.</p>



<p>Eseguiamo quindi il comando </p>



<pre class="wp-block-code"><code>docker container run hello-world</code></pre>



<p>Nel mio caso, l&#8217;output generato è il seguente: </p>



<p></p>



<pre class="wp-block-preformatted">Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/</pre>



<p></p>



<h2>Interpretazione dell&#8217;output</h2>



<p>Le prime righe dell&#8217;output prodotto dal run sono particolarmente interessanti perché ci permettono di intuire cosa sta succedendo under-the-hood.</p>



<pre class="wp-block-code"><code>Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest</code></pre>



<p><br>Come prima cosa vediamo che Docker cerca di <strong>recuperare l’immagine</strong> richiesta da un <strong>repository locale all’host</strong>, ma senza avere successo. <br>Per ora tralasciamo la stringa “:latest”, avremo modo di parlarne molto presto.<br>Dal momento che abbiamo richiesto un’immagine che non abbiamo mai scaricato prima d&#8217;ora, essa viene r<strong>ecuperata dal docker daemon</strong>, come vediamo dalla seconda riga. <br></p>



<p>Subito dopo viene indicato l&#8217;esito del <strong>pull dell’immagine</strong>, l’hash a 256 bit ottenuto mediante l’algoritmo di encryption sha256 e la <strong>conferma di avvenuto download</strong>.</p>



<p>Tutto ciò che segue è l’output del container che il demone di Docker inoltra al client a sua volta scrive sullo standard output.</p>



<p></p>



<h2>Visualizzare i container</h2>



<p>Abbiamo creato un container, ora verifichiamo i dettagli mediante il comando che fornisce la <strong>lista dei container</strong> presenti sul nostro host:</p>



<pre class="wp-block-code"><code>docker container ls</code></pre>



<p>Eseguendo questa istruzione, però, ci accorgiamo di qualcosa di strano. La lista non mostra <strong>nessun container</strong> relativo all&#8217;immagine &#8220;hello-world&#8221;.</p>



<p>Com’è possibile? <br>Eppure lo abbiamo creato! Abbiamo anche visto l&#8217;output!</p>



<p>Quando abbiamo di questi dubbi, la soluzione più efficace è quella di utilizzare l’help del comando.</p>



<pre class="wp-block-code"><code>docker container ls --help</code></pre>



<p>Ottenendo questo output</p>



<pre class="wp-block-preformatted">Usage:	docker container ls [OPTIONS]

List containers

Aliases:
  ls, ps, list

Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display numeric IDs
  -s, --size            Display total file sizes
</pre>



<p></p>



<p>Ecco svelato il problema! <br>Eseguendo il comando nella versione di default, ovvero senza flag aggiuntivi, vengono mostrati<strong> solo i container in esecuzione</strong>.<br>Questo significa che il container che abbiamo appena creato non è più in esecuzione. Nel caso specifico, <em>hello-world</em> termina dopo aver stampato un messaggio.<br></p>



<p>Per vedere tutti i container, compresi quelli che non sono in esecuzione, dobbiamo<strong> aggiungere il flag &#8211;all o -a</strong>.<br>La nuova versione del comando diventa quindi:</p>



<pre class="wp-block-code"><code>docker container ls --all</code></pre>



<p>Dalla quale otteniamo un output di questo tipo:</p>



<pre class="wp-block-preformatted">CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
9f0b8fee671c        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       laughing_visvesvaraya
</pre>



<p></p>



<p>Ora il container che abbiamo generato a partire dall’immagine hello-world è visibile.</p>



<p>Nella <strong>colonna status</strong> si nota che il container è <strong>terminato</strong>. Vedremo dettagliatamente questi aspetti nel capitolo dedicato ai container.</p>



<p></p>



<h2>Eliminare un container</h2>



<p>Sebbene in molti casi può risultare comodo avere accesso ai container terminati, questa volta non ce ne facciamo niente e decidiamo di eliminare il container appena creato.</p>



<p>Per eliminare il container non più in uso dalla lista, il comando è:</p>



<pre class="wp-block-preformatted">docker container rm <container_id></pre>



<p>Per container_id si intende il codice identificativo del container visibile nella prima colonna del comando docker container ls. In questo caso, l&#8217;istruzione da eseguire sarà:</p>



<pre class="wp-block-preformatted">docker container rm 9f0b8fee671c</pre>



<p> In generale, quando viene richiesto di inserire il container id, è sufficiente inserire i primi caratteri dell&#8217;hash a condizione che non ci sia un altro container con lo stesso prefisso.</p>



<p></p>



<h2>Container rimossi automaticamente</h2>



<p>Quando sappiamo già non ci interessa persistere un container una volta terminato, possiamo eseguirlo direttamente con il <strong>flag &#8211;rm</strong>. Questa particolare notazione su occuperà di rimuovere automaticamente il container quando terminerà la sua esecuzione.<br>Nel caso di hello world avremmo potuto eseguire il comando in questo modo:</p>



<pre class="wp-block-preformatted">docker container run --rm hello-world</pre>



<p></p>



<h2>Start &amp; Stop vs Pause &amp; Unpause</h2>



<p>Spesso si fa confusione tra questi comandi, ma il concetto è molto semplice.<br>Nel primo caso i container vengono terminati e riavviati. Nel secondo caso vengono &#8220;congelati&#8221;  e &#8220;risvegliati&#8221;.</p>



<p>Per <strong>fermare</strong> e <strong>riavviare</strong> i container si usano:</p>



<pre class="wp-block-preformatted">docker container start
docker container stop</pre>



<p>Per <strong>sospendere</strong> e <strong>risvegliare</strong> un container, invece si usano:</p>



<pre class="wp-block-preformatted">docker container pause 
docker container unpause</pre>



<p>I comandi saranno <strong>sempre seguiti dal o dai container_id</strong> dei container ai quali vogliamo applicare l&#8217;istruzione.</p>



<p>Il modo migliore per spiegare cosa cambia tra i due è mediante un esempio. In questo caso ho scelto di utilizzare un&#8217;immagine di Alpine Linux sulla quale eseguirò lo start e lo stop di un container.<br>Pause e unpause hanno la stessa notazione, quindi eviterò di riportarli.</p>



<p>Proviamo con il primo set di comandi, ovvero container start e container stop. Dato che abbiamo imparato che i container possono terminare l&#8217;esecuzione appena dopo l&#8217;avvio, mettiamo le mani avanti e impostiamo uno sleep di 1000 secondi. In questo modo il container rimarrà in esecuzione per 1000 secondi prima di terminare.</p>



<p>Per impostare lo sleep è sufficiente digitare il comando &#8216;sleep 1000&#8217;<strong> in coda all&#8217;istruzione di run</strong>.</p>



<pre class="wp-block-preformatted">docker container run alpine sleep 1000</pre>



<p>Quando parleremo nel dettaglio di Dockerfile, la modalità con la quale viene invocato questo comando sarà più chiara, per ora immaginate che il comando specificato in coda al comando run, sovrascrive l’ultimo comando che eseguirebbe il container all’avvio.</p>



<p>Ora per 1000 secondi il terminale rimarrà occupato, poi, secondo il normale flusso, il container terminerà rilasciando il terminale.</p>



<p>Apriamo allora un nuovo tab e cerchiamo il nostro container in esecuzione con:</p>



<pre class="wp-block-preformatted">docker container ls</pre>



<p>Questa volta vediamo che l container figura nella lista. Nel mio case il container id è &#8216;<strong>616</strong>52fca85f0&#8242;, quindi per fermare il container mi basterà digitare:</p>



<pre class="wp-block-preformatted">docker container stop 616</pre>



<p>Al termine di questa istruzione il container non sarà più in esecuzione, quindi se proviamo a cercarlo con docker container ls non lo troveremo nella lista.</p>



<p>Per visualizzarlo, ci basterà eseguire il comando <em>docker container ls &#8211;all</em>, e lo troveremo con stato <strong>Exited(137) </strong>e non più Exited(0).<br>Per far ripartire il container, ci basterà eseguire:</p>



<pre class="wp-block-preformatted">docker container start 616</pre>



<p>Eseguendo docker container ls vediamo che il container è attivo perché la colonna relativa allo stato riporterà: <strong>Up</strong>.</p>



<p></p>



<h2>Curiosità</h2>



<p>Abbiamo assimilato i rudimenti della CLI per quanto riguarda i container.<br>Dopo aver letto lo <a href="http://dockertutorial.it/il-motore/" class="aioseop-link">scorsa sezione</a>, a qualcuno potrebbe venire la curiosità di sapere cosa succede sotto il cofano quando viene avviato un container. </p>



<p>Se ti riconosci in questa descrizione, le prossime righe sono per te!</p>



<p>Quando lanciamo il comando <em>docker container run</em>, il Client converte l’istruzione in una chiamata POST all’endpoint che il demone di Docker ha predisposto a tale scopo.<br>Il demone invoca containerd che che chiede a runc di istanziare il container.<br>runc crea il container e termina, mentre il processo containerd-shim diventerà il nuovo padre del container.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/immagini/" class="aioseop-link">Immagini</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/viaggio">Viaggio foto creata da freepik &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/container-le-basi/">Container &#8211; le basi</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">189</post-id>	</item>
		<item>
		<title>Cos&#8217;è un&#8217;immagine?</title>
		<link>https://dockertutorial.it/cose-unimmagine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cose-unimmagine</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 10 May 2020 13:17:53 +0000</pubDate>
				<category><![CDATA[Immagini]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=283</guid>

					<description><![CDATA[<p>Questo capitolo è dedicato ad uno degli argomenti più importanti di questo corso. Le immagini. Iniziamo con la definizione tratta dal sito ufficiale: “An Image...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cose-unimmagine/">Cos&#8217;è un&#8217;immagine?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Questo capitolo è dedicato ad uno degli argomenti più importanti di questo corso. Le immagini. <br>Iniziamo con la definizione tratta dal sito ufficiale:</p>



<blockquote class="wp-block-quote"><p><br>“An Image is an ordered collection of root filesystem changes and the corresponding execution parameters for use within a container runtime.”</p><cite><a href="https://github.com/moby/moby/blob/master/image/spec/v1.2.md" class="aioseop-link">Moby Image readme.md v1.2</a></cite></blockquote>



<p><br>Tradotto: “Un’immagine è una <strong>raccolta ordinata di modifiche al filesystem di root e dei corrispondenti parametri di esecuzione da utilizzare all’interno di un container runtime</strong>.”</p>



<p>Mi rendo conto che da questa definizione si possa capire ben poco, cerco di rendere questa definizione più comprensibile.</p>



<p>Un immagine è fondamentalmente un <strong>pacchetto</strong> che contiene: <strong>Codice binario di un’App</strong>, <strong>dipendenze</strong> necessarie, <strong>Metadati</strong> e <strong>Istruzioni</strong> su come eseguire l’App.<br>Fondamentalmente è tutto qui.</p>



<p>L’applicazione verrà eseguita in un container, come <strong>processo dell’host</strong>. Questo significa che il kernel su cui gira il container creato a partire da questa immagine, è quello dell’host. </p>



<p class="wp-block-coblocks-highlight"><mark class="wp-block-coblocks-highlight__content">Le immagini e l’host condividono il kernel.</mark></p>



<p>Un immagine può tuttavia utilizzare un Sistema Operativo diverso dall’host <strong>purché condividano il kernel</strong>, ad esempio potrei avere un host RedHat ed un container Ubuntu che condividono il kernel linux.</p>



<p><br>Spesso le immagini contengono <strong>svariate utility</strong> dei sistemi operativi di cui fanno parte, fornendo un ambiente il più completo o specializzato possibile. Questo determina inesorabilmente un aumento della loro dimensione. Un esempio è l’immagine di <strong>Ubuntu</strong>.<br>Di contro, possono essere anche molto <strong>scarne</strong>, privilegiando la leggerezza e lasciando agli utilizzatori l’onere di aggiungere i pacchetti necessari. Un esempio di questa categoria è <strong>Alpine</strong>.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/come-fatta-unimmagine/" class="aioseop-link">Com&#8217;è fatta un&#8217;immagine</a></p>



<p>Immagine: <a href="https://it.freepik.com/eberhard9" class="aioseop-link">eberhard9 &#8211; it.freepik.com</a></p>



<p></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cose-unimmagine/">Cos&#8217;è un&#8217;immagine?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">283</post-id>	</item>
		<item>
		<title>Com&#8217;è fatta un&#8217;immagine?</title>
		<link>https://dockertutorial.it/come-fatta-unimmagine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=come-fatta-unimmagine</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 10 May 2020 13:33:30 +0000</pubDate>
				<category><![CDATA[Immagini]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=291</guid>

					<description><![CDATA[<p>Un immagine non è da intendere come un blocco unico, ma come una pila di livelli incrementali detti &#8220;layer&#8220;. L’insieme ordinato dei layer, costituisce il...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/come-fatta-unimmagine/">Com&#8217;è fatta un&#8217;immagine?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Un immagine non è da intendere come un blocco unico, ma come una<strong> pila di livelli incrementali</strong> detti &#8220;<strong>layer</strong>&#8220;.</p>



<p>L’<strong>insieme ordinato dei layer</strong>, costituisce il singolo oggetto immagine.&nbsp;</p>



<p>Questa struttura ha numerosi vantaggi; Il principale è che i layer sono <strong>riusabili</strong>.&nbsp;</p>



<p>Ad esempio, se più immagini sono costruite a partire da un’immagine della stessa versione di Ubuntu, Docker non scaricherà ogni volta una nuova copia di tale immagine ma userà la stessa per costruire tutte le immagini coinvolte.</p>



<h2>Come funziona la condivisione dei layer?</h2>



<p>Alla prima richiesta l’immagine di partenza verrà scaricata, alle successive sarà recuperata dal repository locale dell’host. Per &#8220;repository locale dell&#8217;host&#8221; intendo il sistema che colleziona e organizza le immagini presenti sul device che sta scaricando le immagini.</p>



<p>A seconda delle dipendenze la dimensione di un’immagine può variare di molto. Si può variare da pochi KiloByte a svariati GigaByte.</p>



<p>E’ anche possibile creare un’immagine a partire da un container, facendone una sorta di fotografia. Per fare ciò si usa il comando <a href="https://docs.docker.com/engine/reference/commandline/commit/" class="aioseop-link">docker container commit</a>. <br>Va detto però che è un caso che trova applicazione solo in contesti particolari.</p>



<p>Per chi come me si occupa di sviluppare software, penso possa essere utile fare un parallelo (per cercare di dare un’idea, non una definizione). Pensate alle immagini come a delle classi e i container come degli oggetti, ovvero delle immagini istanziate.</p>



<p><br>In realtà anche le<strong> immagini vengono costruite</strong>, producendo un binario, ma questo avviene <strong>build-time</strong>. I container invece vengono costruiti run-time.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/cosa-succede-quando-scarichiamo-unimmagine/" class="aioseop-link">Cosa succede quando scarichiamo un&#8217;immagine</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/legno">Legno foto creata da wirestock &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/come-fatta-unimmagine/">Com&#8217;è fatta un&#8217;immagine?</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">291</post-id>	</item>
		<item>
		<title>Cosa succede quando scarichiamo un&#8217;immagine</title>
		<link>https://dockertutorial.it/cosa-succede-quando-scarichiamo-unimmagine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cosa-succede-quando-scarichiamo-unimmagine</link>
		
		<dc:creator><![CDATA[Fabio Ros]]></dc:creator>
		<pubDate>Sun, 10 May 2020 14:04:34 +0000</pubDate>
				<category><![CDATA[Immagini]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://dockertutorial.it/?p=310</guid>

					<description><![CDATA[<p>In questa sezione, andremo più in dettaglio su alcuni aspetti, prevalentemente a basso livello, riguardanti le immagini. Quando scarichiamo un’immagine, ne specifichiamo solo il nome...</p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cosa-succede-quando-scarichiamo-unimmagine/">Cosa succede quando scarichiamo un&#8217;immagine</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In questa sezione, andremo più in dettaglio su alcuni aspetti, prevalentemente a basso livello, riguardanti le immagini.</p>



<p>Quando scarichiamo un’immagine, ne specifichiamo solo il <strong>nome</strong> ed in alcuni casi il <strong>tag</strong> identificativo. Questo può far pensare di aver a che fare con un oggetto unico.</p>



<p>Nella sezione &#8220;<a href="http://dockertutorial.it/come-fatta-unimmagine/" class="aioseop-link">Com&#8217;è fatta un&#8217;immagine</a>&#8221; abbiamo visto che non è così, siamo a conoscenza del fatto che esiste un meccanismo che compone le immagini per layer successivi.</p>



<p>Tuttavia vale la pene vederlo con i nostri occhi scaricando due release consecutive della stessa immagine. Facciamo un esempio con <a href="https://redis.io/" class="aioseop-link">redis</a> basato su Alpine:</p>



<pre class="wp-block-preformatted">docker image pull redis:5-alpine</pre>



<p>ottenendo questo output:</p>



<pre class="wp-block-preformatted">5-alpine: Pulling from library/redis
cbdbe7a5bc2a: Already exists 
dc0373118a0d: Pull complete 
cfd369fe6256: Pull complete 
3e45770272d9: Pull complete 
558de8ea3153: Pull complete 
a2c652551612: Pull complete 
Digest: sha256:83a3af36d5e57f2901b4783c313720e5fa3ecf0424ba86ad9775e06a9a5e35d0
Status: Downloaded newer image for redis:5-alpine
docker.io/library/redis:5-alpine</pre>



<p>Già da qui notiamo che vengono scaricati più frammenti e non un blocco unico. Qualcosa dovrebbe già farci sospettare che l’ipotesi dell’immagine a blocco unico comincia a scricchiolare.<br>Possiamo inoltre vedere già il primo esempio di riuso (dalla riga &#8220;cbdbe7a5bc2a: Already exists&#8221;). Dato che stiamo utilizzando le versioni Alpine, probabilmente stiamo riutilizzando il layer del kernel Alpine da un&#8217;immagine scaricata in precedenza (<a href="http://dockertutorial.it/container-le-basi/" class="aioseop-link">qui</a>).<br>Scarichiamo ora la versione 6-alpine con:</p>



<pre class="wp-block-preformatted">docker image pull redis:6-alpine</pre>



<p>ottenendo questo output:</p>



<pre class="wp-block-preformatted">6-alpine: Pulling from library/redis
cbdbe7a5bc2a: Already exists 
dc0373118a0d: Already exists 
cfd369fe6256: Already exists 
e5396613619b: Pull complete 
6809b5ad2cd4: Pull complete 
386ecfe54d06: Pull complete 
Digest: sha256:2586f31f74ac1d7dc6f6c7eabca42f09bba5ec9911fc519d55fbd7508a9c4f01
Status: Downloaded newer image for redis:6-alpine
docker.io/library/redis:6-alpine</pre>



<p>Qui il riuso diventa evidente. Alcuni &#8220;<strong>frammenti</strong>&#8221; della seconda immagine sono stati <strong>recuperati dalla cache del repository locale</strong>.</p>



<p>C&#8217;è da dire che un utilizzatore di Docker alle prime armi, avrebbe potuto lanciare diversi container senza essere consapevole di tale aspetto. Docker rende tale aspetto assolutamente trasparente, ma è indispensabile conoscerlo per evitare situazioni spiacevoli.</p>



<h2>Come vengono aggregati i layer?</h2>



<p>L&#8217;aggregazione dei livelli (layer) avviene mediante il concetto di <strong>Union File System</strong>.</p>



<p>Mi piacerebbe andare più a fondo sulla questione (parlando di aufs, overlay2, ecc), ma non vorrei andare troppo fuori tema.</p>



<p>Quello che dobbiamo portarci a casa è che <strong>ogni layer può aggiungere file, cartelle o metadati al prodotto dei layer precedenti</strong>. </p>



<p>I layer vengono applicati uno alla volta, in ordine. Al termine dell’applicazione di un layer X, la struttura file risultante sarà la fusione di tutte le modifiche apportate da tutti i layer precedenti e dal layer X. </p>



<p><strong>Per il container</strong>, la struttura file su cui si poggia può essere intesa come un’<strong>entità singola</strong>.</p>



<p>—<br><strong>Prosegui su:</strong> <a href="http://dockertutorial.it/analizzare-la-struttura-di-unimmagine/" class="aioseop-link">Analizzare la struttura di un&#8217;immagine</a></p>



<p>Immagine: <a href="https://it.freepik.com/foto-vettori-gratuito/viaggio">Viaggio foto creata da freepik &#8211; it.freepik.com</a></p>
<p>L'articolo <a rel="nofollow" href="https://dockertutorial.it/cosa-succede-quando-scarichiamo-unimmagine/">Cosa succede quando scarichiamo un&#8217;immagine</a> proviene da <a rel="nofollow" href="https://dockertutorial.it">Docker Tutorial</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">310</post-id>	</item>
	</channel>
</rss>
