{"id":6456,"date":"2022-08-10T08:21:54","date_gmt":"2022-08-10T08:21:54","guid":{"rendered":"https:\/\/cloudsurfers.it\/?p=6456"},"modified":"2022-08-10T08:24:24","modified_gmt":"2022-08-10T08:24:24","slug":"i-comandi-base-di-docker","status":"publish","type":"post","link":"https:\/\/cloudsurfers.it\/index.php\/i-comandi-base-di-docker\/","title":{"rendered":"I comandi base di Docker"},"content":{"rendered":"\n<p>Nel precedente articolo dedicato a Docker abbiamo completato l&#8217;installazione, se te lo sei perso lo trovi <a href=\"https:\/\/cloudsurfers.it\/index.php\/introduzione-a-docker\/\" target=\"_blank\" rel=\"noreferrer noopener\">qui<\/a>. Ora che abbiamo tutto pronto, \u00e8 tempo di sporcarci le mani.&nbsp;In questa sezione, eseguiremo un contenitore&nbsp;sul nostro sistema e avremo un assaggio dei primi comandi.<\/p>\n\n\n\n<p>Per iniziare, eseguiamo quanto segue nel nostro terminale:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: go; title: ; notranslate\" title=\"\">\n$ sudo docker pull ubuntu\n<\/pre><\/div>\n\n\n<p>Il&nbsp;comando pull recupera l&#8217;&nbsp;<a href=\"https:\/\/hub.docker.com\/_\/busybox\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>immagine<\/strong><\/a>&nbsp;di ubuntu dal repository in cloud&nbsp;<a href=\"https:\/\/hub.docker.com\/explore\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Docker Hub<\/strong><\/a>&nbsp;e la salva sul nostro sistema.&nbsp;Puoi usare il&nbsp;comando docker images per vedere un elenco di tutte le immagini presenti sul tuo sistema.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: go; title: ; notranslate\" title=\"\">\n$ sudo docker images\nREPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\nubuntu                 latest              c51f86c28340        4 weeks ago         1.109 MB\n<\/pre><\/div>\n\n\n<p>Non avendo specificato un <strong>tag<\/strong>, viene automaticamente scaricata l&#8217;ultima versione disponibile<\/p>\n\n\n\n<p>Ora proviamo ad eseguire un&nbsp;<strong>contenitore<\/strong>&nbsp;Docker basato sull&#8217; immagine appena scaricata.&nbsp;Per farlo useremo il&nbsp;comando <code>docker run<\/code> che abbiamo gi\u00e0 utilizzato nell&#8217;articolo introduttivo. <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ sudo docker run ubuntu\n<\/pre><\/div>\n\n\n<p>Quando chiamiamo il comando <code>docker run<\/code>, il client Docker trova l&#8217;immagine, carica il contenitore e quindi esegue un comando in quel contenitore.<\/p>\n\n\n\n<p>Se l&#8217;immagine non si trova gi\u00e0 in locale, Docker eseguir\u00e0 automaticamente anche il pull dal repository.<\/p>\n\n\n\n<p>Digitando il comando&nbsp;<code>docker ps<\/code> ci vengono mostrati tutti i contenitori attualmente in esecuzione, se invece utilizziamo <code>docker ps -a<\/code>avremo una lista di tutti i container presenti, indipendentemente dal loro stato.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: go; title: ; notranslate\" title=\"\">\n$ docker ps -a\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES\n305297d7a235        ubuntu             &quot;bash&quot;            1 minutes ago      Exited (0) 0 minutes ago                       distracted_goldstine\n14e5bd11d164        hello-world         &quot;\/hello&quot;            50 minutes ago       Exited (0) 50 minutes ago                        thirsty_euclid\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n\n<p>Come vediamo, ogni Container creato ha un proprio <strong>ID <\/strong>e un proprio <strong>nome <\/strong>che lo contraddistinguono<br>Possiamo notare che il nostro contenitore Ubuntu appena eseguito \u00e8 in stato &#8220;exited&#8221;. Questo perch\u00e9 il <strong>comando <\/strong>predefinito per la macchina ubuntu \u00e8 <code>bash<\/code> e noi abbiamo avviato il container in modalit\u00e0 non interattiva obbligando quindi il container ad uscire perch\u00e9 non ha pi\u00f9 nulla da fare.<\/p>\n\n\n\n<p>L&#8217;esecuzione del comando&nbsp;<code>docker run<\/code> con il flag&nbsp;<code>-it<\/code> ci collega invece a un tty interattivo nel contenitore (-i abilita standard input -t avvia una tty).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ sudo docker -it run ubuntu\n<\/pre><\/div>\n\n\n<p>Ora possiamo eseguire tutti i comandi che vogliamo nel contenitore come se fossimo collegati direttamente su una macchina linux.&nbsp;Non ci credi? Prenditi del tempo per eseguire i tuoi comandi preferiti e nel frattempo esegui anche il comando ps, noterai che il processo bash ha come PID 1 perch\u00e8 \u00e8 il comando entry point eseguito dopo aver startato il container.<\/p>\n\n\n\n<p>Per uscire dal contenitore \u00e8 possibile utilizzare il comando <code>exit<\/code>;  digitando questo comando il contenitore killer\u00e0 il nostro PID1 e quindi risulter\u00e0 in stato <strong>exited<\/strong>; per uscire mantenendo il container in stato <strong>Up<\/strong> possiamo usare invece la combinazione di tasti <strong>Ctrl PQ<\/strong>. Proviamo questa seconda opzione e poi controlliamo i contenitori attivi.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: go; title: ; notranslate\" title=\"\">\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES\nff0a5c3750b9 ubuntu             &quot;bash&quot;            3 minutes ago      Up  3 minutes ago                       crazy_hugle\n\n<\/pre><\/div>\n\n\n<p>Come vediamo il nostro container \u00e8 rimasto Up dopo aver eseguito la combinazione Ctrl PQ<\/p>\n\n\n\n<p>Proviamo ora a rientrare nel container eseguendo il seguente comando: <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ sudo docker -it exec ff0a5c3750b9 bash\n<\/pre><\/div>\n\n\n<p>Con il comando<code>docker exec<\/code> saremo in grado di agganciarci al nostro container avviato in precedenza e aggiungere un nuovo comando. Nel nostro caso abbiamo aggiunto <strong>bash <\/strong>per rientrare nella bash ma se ad esempio avessimo digitato <strong>ls<\/strong>, avrebbe stampato i risultati del comando e sarebbe uscito. Ora che siamo nuovamente nella bash digitiamo ps, noteremo che il PID non \u00e8 pi\u00f9 uno perch\u00e9 abbiamo eseguito un nuovo comando mentre il container era gi\u00e0 avviato. Se infatti ora provassimo a digitare <strong>exit<\/strong> noteremo che il container rester\u00e0 comunque Up perch\u00e8 il processo con Id =1 \u00e8 ancora in esecuzione. Per agganciarci direttamente al comando definito in fase di creazione del container possiamo usare <code>docker attach<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ sudo docker attach ff0a5c3750b9\n<\/pre><\/div>\n\n\n<p>E poi possiamo controllare con <strong>ps <\/strong>il numero del processo bash<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nroot@ff0a5c3750b9:\/# ps\nPID TTY TIME CMD\n1 pts\/0 00:00:00 bash\n22 pts\/0 00:00:00 ps\n<\/pre><\/div>\n\n\n<p>Abbiamo visto che \u00e8 proprio 1, quindi ci siamo agganciati al comando eseguito in fase di avvio del container<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Altri comandi base<\/h5>\n\n\n\n<p><code>docker create &lt;nomeimmagine&gt;<\/code> crea il container senza avviarlo<\/p>\n\n\n\n<p><code>docker start &lt;idcontainer&gt;<\/code> avvia un container stoppato in precedenza<\/p>\n\n\n\n<p><code>docker stop &lt;idcontainer&gt;<\/code>  stoppa un container in esecuzione mantenendo il file system<\/p>\n\n\n\n<p><code>docker pause &lt;idcontainer&gt;<\/code> mette in pausa il container mantenendo file system e stato dei processi<\/p>\n\n\n\n<p><code>docker unpause &lt;idcontainer&gt;<\/code> rimette in esecuzione un container in pausa<\/p>\n\n\n\n<p><code>docker restart &lt;idcontainer&gt;<\/code> riavvia un container in esecuzione<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Questo conclude un giro rapido dei comandi base, che molto probabilmente utilizzerai pi\u00f9 spesso.&nbsp;Man mano che procediamo ulteriormente, ne vedremo di nuovi.<\/p>\n\n\n\n<p>Prima di andare avanti, per\u00f2, facciamo un po&#8217; di pulizia.&nbsp;Se eseguiamo&nbsp;<code>docker ps -a<\/code> notiamo che abbiamo diversi container doppi perch\u00e8 abbiamo eseguito pi\u00f9 volte il comando  <code>docker run<\/code> .&nbsp;Quindi, prima di procedere, eliminiamo i contenitori che non ci servono pi\u00f9.&nbsp;Per farlo, possiamo eseguire il comando&nbsp;<code>docker rm<\/code> seguito dall&#8217;id dei contenitori che vogliamo eliminare.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ docker rm 305297d7a235 ff0a5c3750b9\n\n305297d7a235\nff0a5c3750b9\n<\/pre><\/div>\n\n\n<p><code>docker rm<\/code> rimuove solo i container stoppati, per eliminare i container in esecuzione \u00e8 possibile utilizzare <code>docker rm -d<\/code> .<br>Al momento dell&#8217;eliminazione, dovresti vedere restituiti gli ID dei container eliminati.&nbsp;Se hai un elevato numero di contenitori da eliminare in una volta sola \u00e8 possibile eseguire qualche comando composto:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ docker rm $(docker ps -a -q -f status=exited)\n<\/pre><\/div>\n\n\n<p>Questo comando ad esempio elimina tutti i contenitori con stato&nbsp;<code>exited<\/code>, il flag&nbsp;<code>-q<\/code> restituisce solo gli ID numerici e l&#8217;opzione&nbsp;<code>-f<\/code> invece permette di impostare il filtro desiderato, in questo caso abbiamo impostato l&#8217;eliminazione per soli i container in stato exited.&nbsp;<\/p>\n\n\n\n<p>Per eliminare tutti i container non utilizzati \u00e8 possibile anche utilizzare il comando&nbsp;<code>docker container prune<\/code><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n$ docker container prune\n\nWARNING! This will remove all stopped containers.\nAre you sure you want to continue? &#x5B;y\/N] y\nDeleted Containers:\n4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063\nf98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360\n\nTotal reclaimed space: 212 B\n<\/pre><\/div>\n\n\n<p>Infine, puoi anche eliminare le immagini che non ti servono pi\u00f9 eseguendo&nbsp;<code>docker rmi<\/code>:<\/p>\n\n\n\n<p><code>docker rmi &lt;nomeimmagine&gt;<\/code> rimuove l&#8217;immagine in base al nome<\/p>\n\n\n\n<p><code>docker rmi $docker images -a -q)<\/code> rimuove tutte le immagini locali<\/p>\n\n\n\n<p>Anticipiamo anche il comando <code>docker system prune -a <\/code>. Questo comando elimina:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>tutti i container stoppati<\/li><li>tutte le immagini senza almeno un container associato<\/li><li>le network non utilizzate (vedremo nei prossimi articoli come creare network aggiuntive e perch\u00e9 farlo)<\/li><li>svuota tutta la cache di build<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Conclusioni<\/h4>\n\n\n\n<p>Oggi abbiamo mosso i primi passi nel mondo Docker, avviando i primi container e imparando i comandi principali. Se l&#8217;hai notato, tutto \u00e8 accaduto abbastanza rapidamente; immagina invece di aver dovuto creare una macchina virtuale, avviarla, eseguire un comando e quindi spegnerla.&nbsp;Nei prossimi articoli vedremo la gestione dei dati e il networking, provando a far dialogare tra loro pi\u00f9 container.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nel precedente articolo dedicato a Docker abbiamo completato l&#8217;installazione, se te lo sei perso lo trovi qui. Ora che abbiamo tutto pronto, \u00e8 tempo di sporcarci le mani.&nbsp;In questa sezione, &#8230;<\/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":[48,110],"class_list":["post-6456","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","tag-docker","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/6456","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=6456"}],"version-history":[{"count":0,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/posts\/6456\/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=6456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/categories?post=6456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudsurfers.it\/index.php\/wp-json\/wp\/v2\/tags?post=6456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}