Introduzione

Docker è un'software che semplifica il processo di gestione dei processi delle applicazioni nei "contenitori". I contenitori consentono di eseguire le applicazioni in processi isolati dalle risorse. Sono simili alle macchine virtuali.

In questo tutorial, installeremo e utilizzeremo Docker Community Edition (CE) su Ubuntu 18.04 LTS.

Se il vostro intento è installare e configurare Docker su di un server in remoto continuate a leggere, altrimenti se volete installare Docker sul vostro computer locale saltate il primo paragrafo "Connessione al Server" e leggere il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno della password per l'autenticazione.

Per connettersi al server come utente root digitare questo comando:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare il primo parametro:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

Siete ora connessi al vostro server, siete pronti per iniziare l'installazione di Docker.

Installare Docker

Docker è disponibile nel repository ufficiale di Ubuntu, ma potrebbe non essere la versione più recente.
Per utilizzare la versione più recente, installeremo Docker dal repository Docker ufficiale.

Assicuriamoci che i pacchetti nel sistema siano aggiornati alle ultime versioni disponibili:

sudo apt update

Installare alcuni pacchetti necessari che consentono a apt di utilizzare i pacchetti su HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Aggiungere la chiave GPG per il repository Docker ufficiale:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Aggiungi il repository Docker:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Successivamente, aggiornare il database con repository appena aggiunto:

sudo apt update

Assicurati di essere installato dal repository Docker invece del repository predefinito di Ubuntu:

apt-cache policy docker-ce

Dovreste visualizzare un messaggio di output simile al seguente:


docker-ce:
  Installed: (none)
  Candidate: 5:18.09.0~3-0~ubuntu-bionic
  Version table:
 *** 5:18.09.0~3-0~ubuntu-bionic 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages

Infine, installare Docker:

sudo apt install docker-ce

Per controllare lo stato di Docker:

sudo systemctl status docker

Dovreste visualizzare un messaggio di output simile al seguente:


● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-12-18 23:47:13 CET; 3s ago
     Docs: https://docs.docker.com
 Main PID: 1489 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           └─1489 /usr/bin/dockerd -H unix://

Docker è correttamente installato.

Eseguire comandi Docker senza sudo

Per impostazione predefinita, il comando Docker può essere eseguito solo dall'utente root o da un utente nel gruppo docker, che viene creato automaticamente durante il processo di installazione di Docker.

Se si desidera evitare di digitare sudo ogni volta che si esegue il comando docker, aggiungere il proprio nome utente al gruppo docker in questo modo:

sudo usermod -aG docker ${USER}

Per applicare le modifiche al gruppo, disconnettersi dal server e rientrare, oppure digitare dare il seguente comando:

su - ${USER}

Ti verrà richiesto di inserire la password dell'utente per continuare.

Conferma che il tuo utente è stato aggiunto al gruppo docker:

id -nG

Dovreste ricevere un messaggio di output simile al seguente:


noviello sudo docker

Se desideri aggiungere un altro utente al gruppo docker, con il quale non ti sei connesso, dare il seguente comando:

sudo usermod -aG docker nome_utente

Comandi Docker

Utilizzeremo un utente nel gruppo docker, quindi non avremo bisogno di utilizzare sudo. Altrimenti se non si vuole utilizzare un utente del docker aggiungere il comando con sudo.

La sintassi generale è la seguente:

docker [option] [command] [arguments]

Per visualizzare tutti i sottocomandi disponibili:

docker

Dovreste ricevere un messaggio di output simile al seguente:


Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams 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 to files or directories 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 Docker objects
  kill        Kill one or more running containers
  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
  pause       Pause all processes within one or more containers
  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 one or more containers
  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 (streamed to STDOUT by default)
  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 one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

Per visualizzare le informazioni di sistema su Docker, utilizzare:

docker info

Lavorare con le immagini Docker

I contenitori Docker sono costruiti con immagini Docker. Per impostazione predefinita, Docker estrae queste immagini da Docker Hub, un registro Docker gestito da Docker, la società dietro il progetto Docker. Chiunque può ospitare le loro immagini Docker su Docker Hub.

Per verificare se è possibile accedere e scaricare immagini da Docker Hub, digitare:

docker run hello-world

Dovreste ricevere un messaggio di output simile al seguente:


Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:3e1764d0f546ceac4565547df2ac4907fe46f007ea229fd7ef2718514bcec35d
Status: Downloaded newer image for hello-world:latest

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


Docker inizialmente non è in grado di trovare l'immagine hello-world localmente, quindi ha scaricato l'immagine da Docker Hub, che è il repository predefinito. Una volta che l'immagine è stata scaricata, Docker ha creato un contenitore dall'immagine e l'applicazione all'interno del contenitore è stata eseguita, visualizzando il messaggio.

È possibile cercare immagini disponibili su Docker Hub utilizzando il comando docker con il sottocomando di ricerca. Ad esempio, per cercare l'immagine di Ubuntu, digitare:

docker search ubuntu

Lo script eseguirà la scansione di Docker Hub e restituirà un elenco di tutte le immagini il cui nome corrisponde alla stringa di ricerca.

In questo caso dovreste ricevere un messaggio di output simile al seguente:


NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   8984                [OK]
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            258                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   190                                     [OK]
consol/ubuntu-xfce-vnc                                 Ubuntu container with "headless" VNC session…   139                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   95                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   93                  [OK]
neurodebian                                            NeuroDebian provides neuroscience research s…   55                  [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          48                                      [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   40                  [OK]
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     18
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   16
1and1internet/ubuntu-16-apache-php-7.0                 ubuntu-16-apache-php-7.0                        13                                      [OK]
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating sys…   12
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4      ubuntu-16-nginx-php-5.6-wordpress-4             7                                       [OK]
eclipse/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
codenvy/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   5                                       [OK]
darksheer/ubuntu                                       Base Ubuntu Image -- Updated hourly             5                                       [OK]
pivotaldata/ubuntu                                     A quick freshening-up of the base Ubuntu doc…   2
1and1internet/ubuntu-16-sshd                           ubuntu-16-sshd                                  1                                       [OK]
smartentry/ubuntu                                      ubuntu with smartentry                          1                                       [OK]
paasmule/bosh-tools-ubuntu                             Ubuntu based bosh-cli                           0                                       [OK]
ossobv/ubuntu                                          Custom ubuntu image from scratch (based on o…   0
1and1internet/ubuntu-16-healthcheck                    ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                            Ubuntu images for GPDB development              0

Nella colonna OFFICIAL, OK indica un'immagine creata e supportata dalla società dietro il progetto. Una volta identificata l'immagine che vorresti usare, puoi scaricarla sul tuo computer usando il sottocomando pull.

Eseguire il seguente comando per scaricare l'immagine ufficiale di ubuntu sul proprio computer o server:

docker pull ubuntu

Dovreste ricevere un messaggio di output simile al seguente:


Using default tag: latest
latest: Pulling from library/ubuntu
6b98dfc16071: Pull complete
4001a1209541: Pull complete
6319fc68c576: Pull complete
b24603670dc3: Pull complete
97f170c87c6f: Pull complete
Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status: Downloaded newer image for ubuntu:latest

Dopo aver scaricato un'immagine, è possibile eseguire un contenitore utilizzando l'immagine scaricata con il sottocomando run.

Per vedere le immagini che sono state scaricate sul vostro computer o server, digitare:

docker images

Dovreste ricevere un messaggio di output simile al seguente:


REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              93fd78260bd1        4 weeks ago         86.2MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

Come vedremo più avanti in questo tutorial, le immagini che utilizzi per eseguire i contenitori possono essere modificate e utilizzate per generare nuove immagini, che possono quindi essere caricate (spinto è il termine tecnico) su Docker Hub o altri registri di Docker.

Le immagini possono essere modificate e utilizzate per generare nuove immagini, che possono quindi essere caricate (push) su Docker Hub o altri registri di Docker.

Docker Container

Il contenitore hello-world eseguito nel passaggio precedente è un esempio di contenitore che viene eseguito ed e chiuso automaticamente dopo l'emissione di un messaggio di prova. I contenitori possono essere più complessi e possono essere interattivi.

Provare il contenitore dell'immagine di Ubuntu:

docker run -it ubuntu

Il prompt dei comandi dovrebbe cambiare per riflettere il fatto che ci vi trovate all'interno del contenitore. Dovrebbe avere un formato simile al seguente:


[email protected]:/#

I seguenti numeri 3256a08e3b3c corrispondono all'ID del contenitore.

Ora è possibile eseguire qualsiasi comando all'interno del contenitore. Ad esempio, aggiorniamo il database del pacchetto all'interno del contenitore. Non avrete bisogno di anteporre alcun comando con sudo, perché si sta operando all'interno del contenitore come utente root:

apt update

Quindi è possibile installare qualsiasi applicazione come per esempio Node.js:

apt installa nodejs

Dovreste ricevere un messaggio di output simile al seguente:


v8.10.0

Qualsiasi modifica apportata all'interno del contenitore si applica solo a quel contenitore.

Per uscire dal contenitore, digitare exit al prompt.

Diamo un'occhiata alla prossima gestione dei container sul nostro sistema.

Gestire un contenitore Docker

Per visualizzare tutti i contenitori attivi:

docker ps

Dovreste ricevere un messaggio di output simile al seguente:


CONTAINER ID        IMAGE               COMMAND             CREATED    

Abbiamo avviato due contenitori, hello-world e l'immagine di ubuntu. Entrambi i contenitori non sono più in esecuzione, ma esistono ancora sul tuo sistema.

Per visualizzare tutti i contenitori, attivi e inattivi, aggiungere l'opzione -a al comando precedente:
docker ps -a

Dovreste ricevere un messaggio di output simile al seguente:


CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
e917bd03bad3        hello-world         "/hello"            29 minutes ago      Exited (0) 29 minutes ago                       jovial_wozniak
3256a08e3b3c        ubuntu              "/bin/bash"         2 hours ago         Exited (0) 2 hours ago                          stoic_napier   

Per visualizzare l'ultimo contenitore che hai creato, utilizzare il comando -l:

Per avviare un container interrotto, utilizzare docker start, seguito dall'ID contenitore o dal nome del contenitore. Avviare il contenitore basato su Ubuntu con l'ID di 3256a08e3b3c:

docker start 3256a08e3b3c

Il contenitore verrà avviato e potrete utilizzare docker ps per vedere il suo stato.

Per arrestare un container in esecuzione, utilizzare la docker stop, seguito dall'ID contenitore o dal nome.

Arrestare il contenitore utilizzando il nome associato:

docker stop stoic_napier

Per rimuovere un contenitore, è possibile utilizzare il comando docker rm e associare l'ID oppure il nome:

docker rm stoic_napier

L'installazione e la configurazione di Docker su Ubuntu 18.04 LTS è terminata.