Serie Webinar: Introduzione ai Container

Questo articolo è un complemento della serie di webinar su come deployare e gestire carichi lavorativi congelati nel cloud, che copre i principali aspetti dei contenitori, tra cui la gestione del ciclo di vita dei contenitori, l’implementazione di applicazioni multi-contenitore, il scalabilità dei lavori, e l’introduzione di Kubernetes, oltre ad evidenziare le migliori pratiche per eseguire applicazioni stateless.Questo tutorial comprende i concetti e i comandi trattati nella prima sessione della serie, Introdurvi ai contenitori.

Questa guida include i concetti e i comandi trattati nell’sessione precedente della serie, Introducing Containers.

Introduzione

Docker è una piattaforma per deployare e gestire applicazioni congelate. I contenitori sono popolari tra sviluppatori, amministratori e ingegneri di DevOps per la flessibilità che offrono.

Docker ha tre componenti essenziali:

  • Docker Engine
  • Tools per Docker
  • Registro Docker

Il Docker Engine fornisce le capacità di base per gestire i contenitori. Interagisce con il sistema operativo Linux sottostante per esporre semplici API per affrontare il ciclo di vita dei contenitori.

I tool per Docker sono un insieme di utilità da linea di comando che interagiscono con l’API esposta dal Docker Engine. Sono usati per eseguire i contenitori, creare nuovi image, configurare i dati e le reti, e fare molte altre operazioni che influenzano il ciclo di vita di un contenitore.

Il registro Docker è il luogo dove le immagini dei contenitori sono archiviate. Ogni immagine può avere diverse versioni identificate attraverso tag unici. I utenti possono scaricare le immagini esistenti dal registro e caricarle nuove immagini.Docker Hub è un registro hostato gestito da Docker, Inc.. È anche possibile eseguire un registro all’interno delle proprie ambientazioni per tenere le immagini più vicino al motore.

Al termine di questo tutorial, avrete installato Docker su una Dropplet DigitalOcean, gestito i contenitori, lavorato con le immagini, aggiunto persistenza e impostato un registro privato.

Prerequisiti

Per seguire questo tutorial, avete bisogno:

Nel caso in cui il comando docker richieda privilegi di root, puoi eseguirlo senza l’prefix sudo eseguendo il comando docker come utente del gruppo docker.

Per configurare il tuo Dropletto in questo modo, esegui il comando sudo usermod -aG docker ${USER}. Ciò aggiungerà l’utente corrente al gruppo docker. Poi, esegui il comando su - ${USER} per applicare la nuova membrienza del gruppo.

Questo tutorial presuppone che il tuo server sia configurato in modo che il comando docker possa essere eseguito senza l’prefix sudo.

Step 1 — Installazione di Docker

Dopo aver effettuato l’accesso SSH al Dropletto, esegui i seguenti comandi per rimuovere qualsiasi pacchetto relativo a Docker che potrebbe essere già stato installato e poi installarlo dalla repository ufficiale:

  1. sudo apt-get remove docker docker-engine docker.io
  2. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo apt-key fingerprint 0EBFCD88
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. sudo apt-get update
  7. sudo apt-get install -y docker-ce

Dopo l’installazione di Docker, verifica l’installazione con i seguenti comandi:

  1. docker info

Il comando sopra mostra dettagli sulle istanze di Docker Engine deployato nell’ambiente. Il prossimo comando verifica che i tool Docker siano correttamente installati e configurati. Dovrebbero stampare la versione di entrambi Docker Engine e Tools.

  1. docker version

### Step 2 — Lanzamento dei Container

I contenitori Docker sono lanciati da immagini esistenti che sono archiviate nel registro. Le immagini in Docker possono essere archiviate in repository privati o pubblici. I repository privati richiedono l’autenticazione prima di estrarli le immagini. Le immagini pubbliche possono essere accedute da chiunque.

Per cercare un’immagine chiamata hello-world, eseguire il seguente comando:

  1. docker search hello-world

Esistono molteplici immagini che corrispondono al nome hello-world. Scegliere quella con più stelle, che indica la popolarità dell’immagine.

Verificale disponibilità delle immagini nel tuo ambiente locale con il seguente comando:

  1. docker images

Poiché non abbiamo lanciato alcun contenitore finora, non ci saranno immagini. Ora possiamo scaricarle e eseguirlle localmente:

  1. docker pull hello-world
  2. docker run hello-world

Se eseguisce il comando docker run senza scaricare l’immagine, Docker Engine prima scaricera l’immagine e poi la eseguirà localmente. Eseguendo il comando docker images di nuovo mostrera che abbiamo l’immagine hello-world disponibile localmente.

Ora lanciamo un contenitore più significativo: un server Web Apache.

  1. docker run -p 80:80 --name web -d httpd

Potresti notare le opzioni aggiuntive passate al comando docker run. Qui è una spiegazione di questi switch:

  • Il comando -p di Docker Engine indica al servizio di esecuzione dei contenitori di esporre il porto 80 del contenitore su un porto del host 80. Poiché Apache ascolta su questo porto, abbiamo bisogno di esporirlo sul porto dell’host.
  • --name specifica che questo passaggio assegna un nome al contenitore in esecuzione. Se ommettiamo questo, Docker Engine assegnerà un nome casuale al contenitore.
  • -d è un’opzione che richiede all’Engine di Docker di eseguire il contenitore in modalità dettagliata. Senza questa opzione, il contenitore sarà eseguito in primo piano, bloccando l’accesso alla shell. Aggiungendo il contenitore in background consente di usare la shell mentre il contenitore continua ad eseguirsi.

Per verificare che il nostro contenitore sia effettivamente in esecuzione in background, provate questo comando:

  1. docker ps

Il risultato mostra che il contenitore chiamato web è in esecuzione con il porto 80 mappato al porto dell’host 80.

Ora accedete al server Web:

  1. curl localhost

Prova ad accedere al server Web usando il seguente comando:

  1. docker stop web
  2. docker rm web

Ecco come fermare e rimuovere il contenitore in esecuzione con i comandi seguenti:

Ripetere nuovamente docker ps conferma che il contenitore è terminato.

Passo 3 — Aggiungere storage ai contenitori

I contenitori sono effimeri, cioè vanno perduti quando il contenitore viene terminato. Per conservare i dati oltre la vita di un contenitore, abbiamo bisogno di assegnarci una volumetria. Le volumetrie sono direttorie dal sistema di file dell’host.

Inizia creando una nuova directory sul host:

  1. mkdir htdocs

Ora lanciamo il contenitore con un nuovo switch per montare la directory htdocs. Questa directory è la radice del server Web Apache.

  1. docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

Lanciamo il contenitore con un nuovo switch che indica la directory htdocs all’interno del contenitore, puntandola al root del server Web Apache. Ogni cambiamento fatto su questa directory sarà visibile sia nel contesto del host che all’interno del contenitore.

Accedi alla directory dal contenitore usando il comando:

  1. docker exec -it web /bin/bash

Questo comando attacca il tuo terminale al shell del contenitore in modo interattivo. Dovresti vedere che sei ora arrivato all’interno del contenitore.

Naviga nella directory htdocs e crea semplicemente un file HTML. Quindi, esci dalla shell del contenitore:

  1. cd /usr/local/apache2/htdocs
  2. echo '<h1>Hello World from Container</h1>' > index.html
  3. exit

Eseguire il comando curl localhost mostra che il server Web sta restituendo la pagina che hai creato.

Non solo puoi accedere a questo file dall’host, ma anche modificarlo:

  1. cd htdocs
  2. cat index.html
  3. echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

Eseguire nuovamente curl localhost conferma che il server Web sta servendo la pagina creata da recentemente sul host.

Terminare il contenitore con il seguente comando. (Il -f forza Docker a terminare senza fermarsi prima.)

  1. docker rm -f web

Passaggio 4 — Costruzione Immagini

Oltre ad eseguire le immagini esistenti dall’ registro, possiamo crearne nuove e archiviarle nel registro.

Puoi creare nuove immagini da contenitori esistenti. Le modifiche apportate al contenitore vengono confermate e poi le immagini sono taggate e pushate al registro.

Rilancia il contenitore httpd ancora una volta e modifica il file di default:

  1. docker run -p 80:80 --name web -d httpd
  2. docker exec -it web /bin/bash
  3. cd htdocs
  4. echo '<h1>Welcome to my Web Application</h1>' > index.html
  5. exit

Il contenitore è ora in esecuzione con un index.html personalizzato. Puoi verificarlo con curl localhost.

Prima di committeremo il contenitore modificato, è buona pratica fermarlo. Dopo che è stato fermato, eseguirai il comando commit:

  1. docker stop web
  2. docker commit web doweb

Conferma la creazione dell’immagine con il comando docker images. Mostra l’immagine doweb che hai appena creato.

Per etichettare e archiviare questa immagine su Docker Hub esegui i seguenti comandi per inviarla al registro pubblico:

  1. docker login
  2. docker tag your_docker_hub_username/doweb
  3. docker push your_docker_hub_username/doweb

Puoi verificare la nuova immagine tramite ricerca nel browser o sul comando linea.

Passaggio 5 — Avvio di un Registro Privato

È possibile eseguire il registro del pacchetto in ambienti privati per mantenere le immagini più sicure. Questo riduce anche la latenza tra l’engine di Docker e il repository delle immagini.

Il registro Docker è disponibile come contenitore che può essere lanciato come qualsiasi altro contenitore. Poiché il registro conserva diverse immagini, è buona pratica attaccare un volume di archiviazione al suo interno.

  1. docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

Nota che il contenitore è stato lanciato in background con il porto 5000 esposto e la directory registry mappata sul sistema di file host. Puoi verificare che il contenitore sia in esecuzione eseguendo il comando docker ps.

Ora potrai verificare che il contenitore è in esecuzione eseguendo il comando docker ps.

  1. docker pull busybox
  2. docker tag busybox localhost:5000/busybox
  3. docker images

Puoi ora taggare un’immagine locale e pusharla nel registro privato. Lascia che prima abbiai fatto un pull dell’immagine busybox dal hub Docker.

  1. docker push localhost:5000/busybox

Il comando precedente conferma che l’immagine busybox è ora taggata con localhost:5000, quindi puoi pusharla al registro locale.

  1. docker rmi -f localhost:5000/busybox
  2. docker images
  3. docker pull localhost:5000/busybox
  4. docker images

Con l’immagine pushata al registro locale, prova ad eliminarla dall’ambiente e poi a pullarla dal registro.

Hai completato il ciclo completo di pull dell’immagine, taggare, pusharla al registro locale e, infine, pullarla nuovamente.

Potrebbero essere casi in cui voudresti eseguire il registro del pacchetto su una macchina dedicata. Il motore di Docker in esecuzione su macchine differenti parlerà al registro remoto per estrarne e pusharle le immagini.

Poiché il registro non è sicuro, occorre modificare la configurazione di Docker Engine per consentire l’accesso a un registro non sicuro. Per fare ciò, modifichi il file daemon.json situato in /etc/docker/daemon.json. Crea il file se non esiste.

Aggiungi il seguente elemento:

Editing /etc/docker/daemon.json
{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

Sostituisci REMOTE_REGISTRY_HOST con il nome host o l’indirizzo IP del registro remoto. Riavvia Docker Engine per assicurarti che le modifiche alla configurazione siano applicate.

##Conclusione
Questo tutorial ti ha aiutato a iniziare con Docker. Ha coperto i concetti essenziali, inclusa l’installazione, la gestione dei container, la gestione delle immagini, l’archiviazione e il registro privato. Le prossime sessioni e articoli di questa serie ti aiuteranno a passare oltre le basi di Docker.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-docker