Come installare e usare Docker su Ubuntu 16.04
Introduzione
Docker è un’applicazione che rende più semplice e facile eseguire i processi delle applicazioni in contenitori, che sono come le macchine virtuali solo più portabili, con più risorse da usare e maggiormente dipendenti dal sistema operativo ospite. Per una introduzione dettagliata alle diverse componenti di un contenitore Docker, si veda L’ecosistema Docker: una Introduzione ai componenti comuni.
Ci sono due metodi per installare Docker su Ubuntu 16.04. Un metodo comporta l’installazione su un’esistente installazione del sistema operativo. L’altro consiste nel far partire un server con uno strumento chiamato Docker Machine che autoinstalla Docker su tale server.
In questo tutorial, imparerete come installarlo ed utilizzarlo su un’installazione esistente di Ubuntu 16.04.
Prerequisiti
Per seguire questo tutorial è necessario quanto segue:
- Droplet [la VPS di DigitalOcean, NdR] Ubuntu 16.04 a 64-bit
- Utente non root con privilegi sudo. La guida introduttiva ad Ubuntu 16.04 spiega come impostare questa funzione.
Nota: Docker richiede una versione a 64 bit di Ubuntu così come una versione del kernel uguale o superiore a 3.10. La Droplet Ubuntu 16.04 a 64 bit soddisfa tali requisiti.
Tutti i comandi in questo tutorial dovrebbero essere eseguiti come utente non root. Se fosse necessario l’accesso root, il comando dovrà essere preceduto da sudo
. La guida introduttiva ad Ubuntu 16.04 spiega come aggiungere utenti e dare loro l’accesso sudo.
Fase 1 – Installazione di Docker
Il pacchetto di installazione di Docker disponibile nel repository ufficiale di Ubuntu 16.04 non è la versione più recente. Per ottenere la versione più recente, installate Docker dal repository ufficiale di Docker. Questa sezione mostra come farlo.
In primo luogo, cercate di aggiornare il database dei pacchetti:
sudo apt-get update
Ora installate Docker. Aggiungete al sistema la chiave GPG per il repository ufficiale di Docker:
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
Aggiungete il repository di Docker alle fonti APT:
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
Aggiornate il database dei pacchetti con i pacchetti di Docker appena aggiunti al repository:
sudo apt-get update
Assicuratevi di eseguire l’installazione dal repository di Docker invece che da quello predefinito di Ubuntu 16.04:
apt-cache policy docker-engine
Dovrebbe apparire un output simile al seguente:
docker-engine:
Installed: (none)
Candidate: 1.11.1-0~xenial
Version table:
1.11.1-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
1.11.0-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
Si noti che docker-engine
non è installato, ma il candidato per l’installazione è quello del repository di Docker per Ubuntu 16.04. Il numero di versione di
docker-engine
potrebbe essere diverso.
Infine, installate Docker:
sudo apt-get install -y docker-engine
Ora Docker dovrebbe essere installato, il demone è stato avviato ed il processo ha attivato l’avvio al boot. Verificate che sia in esecuzione:
sudo systemctl status docker
L’output dovrebbe essere simile al seguente, dimostrando che il servizio è attivo e in esecuzione:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)
Ora l’installazione di Docker non solo vi dà il servizio Docker (demone), ma anche l’utility docker
a riga di comando, o il client Docker. Vedremo come utilizzare il comando docker
più avanti in questo tutorial.
Fase 2 – L’esecuzione del comando Docker senza sudo (facoltativo)
Di default, l’esecuzione del comando docker
richiede i privilegi di root, si deve dunque precedere il comando con sudo
. Può essere anche eseguito da un utente del gruppo docker, che viene creato automaticamente durante l’installazione di Docker. Se si tenta di eseguire il comando docker
senza precederlo prima con sudo
o senza essere nel gruppo docker, si otterrà un output simile a questo:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Se si vuole evitare di usare sudo
ogni volta che si esegue il comando docker
, aggiungete il nome utente al gruppo docker:
sudo usermod -aG docker $(whoami)
Per rendere effettiva questa modifica, sarà necessario effettuare il logout dalla Droplet ed entrare nuovamente con lo stesso nome utente.
Nel caso fosse necessario aggiungere un utente al gruppo docker
al quale non siete autenticati, specificate quel nome utente usando:
sudo usermod -aG docker username
Il resto di questo articolo presuppone che si esegua il comando docker
come utente del gruppo docker. Nel caso sceglieste di non farlo, anteponete sudo
ai comandi.
Fase 3 – Uso del comando docker
Con Docker installato e funzionante, è il momento di acquisire familiarità con l’utility da riga di comando. L’utilizzo di docker
consiste nel passargli una serie di opzioni e comandi seguiti da argomenti. La sintassi ha questa forma:
docker [opzione] [comando] [argomenti]
Per visualizzare tutti i sottocomandi disponibili, scrivete:
docker
Come in Docker 1.11.1, la lista completa dei comandi secondari disponibili comprende:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container or image
kill Kill a running container
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
network Manage Docker networks
pause Pause all processes within a container
port List port mappings or a specific mapping for the CONTAINER
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop a running container
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within a container
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code
Per visualizzare le opzioni disponibili per uno specifico comando, scrivete:
docker docker-subcommand --help
Per visualizzare le informazioni su Docker a livello di sistema, utilizzate:
docker info
Fase 4 – Lavorare con le immagini Docker
I contenitori Docker sono gestiti dalle immagini Docker. Di default, queste immagini vengono prese da Docker Hub, un registro gestito da Docker, la società che sta dietro il progetto Docker. Chiunque può costruire ed ospitare le proprie immagini Docker su Docker Hub, quindi la maggior parte delle applicazioni e delle distribuzioni Linux delle quali avrete necessità di eseguire i contenitori Docker, hanno delle immagini ospitate su Docker Hub.
Per verificare se è possibile accedere e scaricare immagini da Docker Hub, scrivete:
docker run hello-world
L’output dovrebbe indicare che Docker funziona correttamente:
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
È possibile cercare immagini disponibili su Docker Hub utilizzando il comando docker
con il sottocomando search
. Ad esempio, per cercare l’immagine di Ubuntu, scrivete:
docker search ubuntu
Lo script esplora Docker Hub e restituisce un elenco di tutte le immagini il cui nome corrisponde alla stringa di ricerca. In questo caso, l’output sarà simile a questo:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 3808 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 61 [OK]
torusware/speedus-ubuntu Always updated official Ubuntu docker imag... 25 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 24 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components... 23 [OK]
nickistre/ubuntu-lamp LAMP server on Ubuntu 6 [OK]
nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 5 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images... 4 [OK]
nimmis/ubuntu This is a docker images different LTS vers... 4 [OK]
maxexcloo/ubuntu Docker base image built on Ubuntu with Sup... 2 [OK]
admiringworm/ubuntu Base ubuntu images based on the official u... 1 [OK]
...
Nella colonna OFFICIAL, OK indica un’immagine costruita e supportata dalla società che sta dietro al progetto. Una volta identificata l’immagine che si desidera utilizzare, è possibile scaricarla sul vostro computer utilizzando il sottocomando pull
in questo modo:
docker pull ubuntu
Dopo che l’immagine è stata scaricata, si può quindi eseguire un contenitore utilizzando l’immagine scaricata con il sottocomando run
. Se un’immagine non viene scaricata quando docker
è eseguito con il sottocomando run
, il client Docker per prima cosa scaricherà l’immagine e successivamente eseguirà un contenitore:
docker run ubuntu
Per vedere le immagini che sono state scaricate sul computer, scrivete:
docker images
L’output dovrebbe essere simile al seguente:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c5f1cf30c96b 7 days ago 120.8 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
Come si vedrà più avanti in questo tutorial, le immagini che si utilizzano per eseguire i contenitori possono essere modificate ed utilizzate per generare nuove immagini che possono poi essere caricate (pushed è il termine tecnico) su Docker Hub o su altri registri Docker.
Fase 5 – Esecuzione di un contenitore Docker
Il contenitore hello-world
che è stato eseguito precedentemente è un esempio di contenitore che viene eseguito e termina dopo l’emissione di un messaggio di prova. I contenitori, tuttavia, possono essere molto più utili di quest’ultimo e possono essere interattivi. Dopo tutto, sono simili alle macchine virtuali, solamente più orientati alle risorse.
A titolo di esempio, eseguiamo un contenitore utilizzando l’ultima immagine di Ubuntu. La combinazione delle opzioni -i e -t consente l’accesso alla shell interattiva nel contenitore:
docker run -it ubuntu
Il prompt dei comandi dovrebbe cambiare per riflettere il fatto che ora si sta lavorando all’interno del contenitore, e dovrebbe prendere questa forma:
root@d9b100f2f636:/#
Importante: Si noti l’id del contenitore nel prompt dei comandi. Nell’esempio precedente è d9b100f2f636
.
Ora si può eseguire qualsiasi comando all’interno del contenitore. Ad esempio, supponiamo di aggiornare il database dei pacchetti all’interno del contenitore. Non c’è bisogno di prefissare ogni comando con sudo
perché si sta operando all’interno del contenitore con i privilegi di root:
apt-get update
Ora installate una qualsiasi applicazione al suo interno. Per esempio, installate NodeJS.
apt-get install -y nodejs
Fase 6 – Fare cambiamenti in un contenitore per un’immagine Docker
Di default, i filesystem Docker sono temporanei. Se si avvia un’immagine Docker, è possibile creare, modificare ed eliminare i file, proprio come una macchina virtuale. Tuttavia, se si arresta il contenitore e lo si avvia di nuovo, andranno perse tutte le modifiche: tutti i file eliminati in precedenza verranno ripristinati e tutti i nuovi file o le modifiche apportate non saranno presenti. Questo perché le immagini di Docker sono più simili ai template piuttosto che alle immagini come nel mondo della virtualizzazione standard.
Per informazioni su come mantenere questi cambiamenti all’interno del contenitore in modo che possano resistere ai riavvii del contenitore, è necessario utilizzare i Docker Data Volumes (volumi dati di Docker). Per i dettagli, fate riferimento a Lavorare con i Data Volumes di Docker su Ubuntu 14.04.
Questa sezione mostra come salvare lo stato di un contenitore come nuova immagine Docker.
Dopo aver installato nodejs all’interno del contenitore Ubuntu, avete un contenitore alimentato da un’immagine, ma il contenitore è diverso dall’immagine che avete usato per crearlo.
Per salvare lo stato del contenitore come nuova immagine, per prima cosa uscite dal contenitore stesso:
exit
Poi fate le modifiche alla una nuova istanza dell’immagine Docker usando il seguente comando. L’opzione -m è per il messaggio di commit che vi aiuta a sapere quali modifiche sono state apportate, mentre -a viene utilizzato per specificare l’autore. L’ID del contenitore è quello indicato in precedenza nel tutorial quando avete iniziato la sessione interattiva di Docker. A meno che non siano stati creati dei repository aggiuntivi su Docker Hub, il repository è di solito il vostro nome utente di Docker Hub:
docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name
Per esempio:
docker commit -m "added node.js" -a "Sunday Ogwu-Chinuwa" d9b100f2f636 finid/ubuntu-nodejs
Nota: Quando si esegue il commit di un’immagine, la nuova immagine viene salvata in locale, cioè sul computer. Più avanti in questo tutorial, imparerete come effettuare il push dell’immagine in un registro Docker come Docker Hub in modo che possa essere valutata e utilizzata da voi e dagli altri.
Dopo che l’operazione è stata completata, elencare le immagini Docker presenti ora sul vostro computer dovrebbe mostrare anche la nuova immagine, così come quella vecchia ricavata da:
docker images
finid/ubuntu-nodejs latest 62359544c9ba 50 seconds ago 206.6 MB
ubuntu latest c5f1cf30c96b 7 days ago 120.8 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
Nell’esempio precedente, ubuntu-nodejs è la nuova immagine, che è derivata dall’immagine Ubuntu esistente su Docker Hub. La differenza di dimensioni riflette i cambiamenti che sono stati fatti. In questo esempio, il cambiamento è che NodeJS è stato installato. Quindi, la prossima volta che avrete bisogno di eseguire un contenitore utilizzando Ubuntu con NodeJS pre-installato, potete usare da subito la nuova immagine. Le immagini possono anche essere costruite da quello che è chiamato Dockerfile. Ma questo è un processo molto complesso che è ben al di fuori della portata di questo articolo.
Fase 7 – Elencare i contenitori Docker
Dopo aver utilizzato Docker per un po’, sul computer avrete molti contenitori attivi (in esecuzione) e inattivi. Per visualizzare quelli attivi, usate:
docker ps
Si avrà un output simile al seguente:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c79cc556dd ubuntu "/bin/bash" 3 hours ago Up 3 hours silly_spence
Per visualizzare tutti i contenitori attivi e inattivi, usate l’opzione -a
:
docker ps -a
Per visualizzare l’ultimo contenitore che è stato creato, usate l’opzione -l
:
docker ps -l
Per interrompere un contenitore attivo o in esecuzione, basta scrivere:
docker stop container-id
Il container-id
può essere trovato nell’output del comando docker ps
.
Fase 8 – Effettuare il push delle immagini Docker in un repository
Il passo successivo alla creazione di una nuova immagine da un’immagine esistente è quello di condividerla con i vostri amici, con il mondo intero su Docker Hub, o su un altro registro Docker al quale si ha accesso. Per effettuare il push di un’immagine su Docker Hub o su qualsiasi altro registro Docker, è necessario disporre di un account su tale sistema.
Questa sezione mostra come effettuare il push di un’immagine Docker su Docker Hub. Per informazioni su come creare il proprio registro privato Docker si veda Come installare un registro privato Docker su Ubuntu 14.04.
Per creare un account su Docker Hub, registratevi su Docker Hub. In seguito, per effettuare il push della vostra immagine, accedete a Docker Hub. Vi verrà chiesto di effettuare il login:
docker login -u docker-registry-username
Se la password specificata è corretta, l’autenticazione dovrebbe avere successo. Una volta effettuato il login, potete effettuare il push della vostra immagine utilizzando:
docker push docker-registry-username/docker-image-name
Ci vorrà del tempo prima che il processo sia completato e, una volta terminato, l’output sarà simile al seguente:
The push refers to a repository [docker.io/finid/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
Dopo aver effettuare il push di un’immagine su un registro, dovrebbe essere elencata sulla bacheca del vostro account, come quella mostrata nella immagine qui sotto.
Se un tentativo di push presenta un errore di questo tipo, è probabile che non vi eravate autenticati:
The push refers to a repository [docker.io/finid/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
Eseguite il login e ripetete il tentativo di push.
Conclusioni
C’è molto di più su Docker rispetto a quello che è stato esposto in questo articolo, ma dovrebbe essere abbastanza per iniziare a lavorare con Docker su Ubuntu 16.04. Come la maggior parte dei progetti open source, Docker è costituito da una base di codice in rapido sviluppo; per leggere le ultime informazioni prendete dunque l’abitudine di visitare la pagina del blog del progetto.
Verificate anche gli altri tutorial su Docker nella Comunità DigitalOcean.
Autore: finid
Revisore: Tammy Fox