Come creare un container con Docker

Continuiamo con le nostre guide dedicate a Docker. Oggi vediamo nel dettaglio un argomento di quelli davvero fondamentali per tutti coloro che si occupano di sviluppo web: Docker container.

Un container è l’istanza in esecuzione di un’applicazione in un ambiente isolato al quale vengono dinamicamente assegnate risorse per l’esecuzione. Il container al suo interno contiene l’applicazione da eseguire e tutto ciò di cui necessita: runtime, librerie, configurazione, ecc.


Qual è la differenza tra immagine e container?

L’immagine docker è un package statico, nel quale vengono pacchettizzate tutte le risorse necessarie all’esecuzione di un’applicazione.

Da un’immagine Docker si possono lanciare più container. Supponiamo ad esempio che la nostra applicazione richieda più istanze di un determinato servizio, come ad esempio redis. Dalla stessa immagine di redis reperibile sul Docker hub Docker hub è possibile avere più container in cui redis viene eseguito.


Come si crea un container?

Per creare un container, partendo da un’immagine di partenza è molto semplice: è sufficiente eseguire il comando docker run.

$ docker run redis –name ‘redis-server’

Lanciando questo comando, docker eseguirà il download dell’immagine dal docker hub ed eseguirà un’istanza di redis.

L’argomento –name ci permette di identificare il container e possiamo usarlo come riferimento, come vedremo negli esempi successivi.


Interagire con il container

E’ possibile eseguire un comando all’interno del container con il comando docker exec, come mostrato nell esempio:

$ docker exec -it redis-server redis-cli

Con questo comando Docker, lanciamo il comando redis-cli all’interno del container. Utilizzando l’argomento -it il comando viene eseguito in modalità interattiva: questo ti permette di accedere al prompt dei comandi all’interno del container.

Docker Container


Networking

A seconda dello scopo dell’applicazione, il container potrebbe esporre una porta TCP o UDP alla quale accedere dall’esterno. Se vogliamo far comunicare il container con l’host, dovremo “mappare” la porta in modo che Docker la renda disponibile all’accesso da parte dell’host.

Se ad esempio sul nostro computer locale abbiamo un client con interfaccia grafica per redis e vogliamo fare in modo che si colleghi al container, dovremo esporre la porta 6379. Per far questo, al momento in cui lanciamo il container, dovremo utilizzare l’argomento -p.

$ docker run redis -p 6379:6379 –name ‘redis-server’

In questo modo, sul nostro redis client possiamo impostare 127.0.0.1 come host e 6379 come porta e quindi accedere ai dati contenuti nel container. Possiamo anche specificare una porta personalizzata per il container; tutto questo ci torna utile quando si hanno due container con la stessa applicazione, o che comunque espongono la stessa porta.

$ docker run redis -p 1234:6379 –name ‘redis-server’


In conclusione Docker container

Creare un container con Docker è molto semplice come abbiamo visto. Uno sviluppatore moderno oggi deve conoscere tutte le funzioni di Docker alla perfezione se vuole ottimizzare il suo modo di lavorare e la qualità degli applicativi che ha intenzione di realizzare.

Dopo questo approfondimento dedicato a Docker container, vedremo nei prossimi articoli come creare un ambiente di lavoro con Docker, gestendo più container e facendoli interagire fra di loro, argomenti decisivi per chi vuole diventare un web developer di livello avanzato.

Come creare un ambiente Docker ottimale

Per lo sviluppo di un software è necessario avere a disposizione un ambiente locale con tutti i servizi a disposizione per la corretta esecuzione dell’applicazione che si sta sviluppando.

Ad esempio, se si sta sviluppando un’applicazione web con Symfony, sarà necessario avere a disposizione un webserver come Apache o Nginx, un interprete PHP e probabilmente un database sul quale salvare i dati, come Postgre o MySql.

Docker environment

Come può aiutarti Docker?

Docker permette di suddividere queste tre parti lanciando tre ambienti isolati, in cui ogni servizio viene eseguito. Questi ambienti isolati sono i Docker container. Quindi, seguendo l’esempio, per la corretta esecuzione della nostra applicazione dovremo avere tre container in esecuzione: uno per il web server, uno con l’interprete PHP e uno con il database.

Lanciare l’esecuzione di questi container da solo non è sufficiente. Abbiamo anche la necessità di farli comunicare fra di loro. Come abbiamo detto, ogni container è un ambiente isolato, e non è a conoscenza del mondo esterno. Per questo il container PHP non è a conoscenza del fatto che esista un container MySql al quale connettersi.


Docker compose

Docker compose è un tool che permette la realizzazione di applicazioni multi-container. E’ molto utilizzato per la configurazione di ambienti di sviluppo in locale, perché è facile da configurare e ha una api da riga di comando molto semplice e veloce da imparare.

Si configura con un file yaml, che per convenzione viene nominato docker-compose.yaml, ma non necessariamente. Attenzione perché è’ possibile anche utilizzare un diverso file specificandolo all’avvio di Docker compose.

Una volta pronto il file di configurazione è possibile lanciare i container, con il comando:

docker-compose up

…e fermare tutti i container con il comando:

docker-compose down


File docker-compose.yaml

Vediamo come si presenta un file di configurazione per Docker compose.

version: ‘3.4’
services:
myappdb:
image: mysql:5.7.29
container_name: myappdb
volumes:
– ./docker:/init
command: –init-file /init/db-init.sql
environment:
MYSQL_ROOT_PASSWORD: “secret”
nginx:
image: nginx:latest
container_name: myapp-nginx
ports:
– 80:80
volumes:
– ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
– “myapp”
myapp:
build:
context: ./
container_name: myapp
volumes:
– ./:/var/www/myapp

Vediamo adesso di commentare le parti interessanti di questo file per capire il funzionamento di ognuna.

version: ‘3.4’

Questa è la versione della sintassi di configurazione utilizzata.

myappdb:

Ogni servizio è contraddistinto da un nome. Questo nome è molto importante e deve essere univoco. Infatti viene utilizzato come namespace per raggiungere il container. Ad esempio in questo caso l’applicazione PHP dovrà cercare di connettersi al database che ha come hostname “myappdb” e porta 3306.

image: mysql:5.7.29
Immagine dalla quale inizializzare il container.

container_name: myappdb
Nome del container.

volumes:
– ./docker:/init

Con questa istruzione eseguiamo il mapping di una cartella locale con una all’interno del container, in modo che i file in essa contenuti possano essere raggiungibili da parte di un processo in esecuzione all’interno del container.

command: –init-file /init/db-init.sql

Aggiunge l’argomento al comando principale del Dockerfile o lo sovrascrive.

environment:
MYSQL_ROOT_PASSWORD: “secret”

E’ possibile assegnare variabili d’ambiente.

ports:
– 80:80

E’ possibile mappare una porta in modo che sia raggiungibile dall’host. In questo caso potremo raggiungere il container nginx tramite la porta 80.

build:
context: ./

Per il container PHP non iniziamo da un’immagine pronta, ma la creiamo dinamicamente, cercando un Dockerfile nella cartella specificata.


Risorse ufficiali

Documentazione di Docker compose e Docker compose reference da consultare sempre e comunque!


In conclusione

Abbiamo voluto offrirti un’infarinatura di cos’è Docker compose e come funziona. Consulta la documentazione ufficiale e inizia a sperimentare in locale. Il modo migliore di imparare è quello di sporcarsi le mani!

Come creare un package con Docker

Quando si parla di package, generalmente ci si riferisce a una parte di software o di librerie raggruppate per essere riutilizzate in scala. Un package infatti può essere ad esempio utilizzato da più applicazioni tramite l’importazione o l’estensione del package stesso.

Docker è un tool che renderà più semplice la tua vita di developer, stiamo parlando di un progetto open source in grado di rendere automatico il deployment di applicazioni all’interno di contenitori software, in pratica una piattaforma che ti consentirà di creare, testare e distribuire applicazioni tramite container.


Docker Package: il concetto di “immagine”

Il concetto di package si può tradurre in Docker con le immagini, o Docker image.
Una Docker image contiene di solito un set di istruzioni per la creazione dei container. I container sono istanze di software in esecuzione.
Dalla stessa immagine dovete sapere che è possibile creare più container.

Ad esempio, se volessi creare più istanze di ngnix per soddisfare diverse HTTP request, posso farlo partendo dalla stessa immagine di nginx.

Seguendo lo stesso esempio, potresti chiederti come puoi – partendo dall’immagine pubblica di ngnix – applicare una configurazione personalizzata per il tuo web server.

E’ molto semplice: devi creare un’immagine personalizzata nella quale, partendo dall’immagine base di nginx, si applicano degli step in cui si va ad aggiungere la configurazione personalizzata di nginx.

Per fare questo creiamo un nuovo progetto che chiameremo myapp. All’interno del progetto creiamo un file chiamato Dockerfile, e una cartella config con il file default.conf.

Docker package

Creiamo la nostra configurazione dentro al file config/default.conf. L’esempio contiene una configurazione fittizia, in cui si inoltrano le richieste a un server PHP.

Docker package

Adesso creiamo invece gli step di creazione della nuova immagine all’interno del Dockerfile.

Docker package

Come puoi notare, eseguiamo tre passaggi, di cui l’ultimo è sicuramente opzionale, che ha il solo scopo di mostrare il comando RUN. Iniziando dall’alto, il comando FROM indica da quale immagine si deve partire nella creazione delle nuova immagine. COPY invece ha due argomenti: il file da copiare e la sua destinazione finale all’interno dell’immagine. In questo modo copiamo la nostra configurazione personalizzata nginx nella cartella appropriata all’interno dell’immagine.
Oltre a copiare file, si possono eseguire comandi con il comando RUN. Questo è utile per automatizzare l’installazione di software aggiuntivi o altro.

Esistono molti altri comandi per il Docker file, ne puoi trovare la reference completa cliccando qui: troverai una fonte di assoluto interesse se intendi fare sul serio con Docker.


Lancio Comando Docker Build

Una volta creati i file, da terminale è sufficiente lanciare il comando docker build per creare la nuova immagine personalizzata.

Docker package

Come si vede dall’immagine, i tre step descritti nel Dockerfile vengono eseguiti in sequenza. L’argoment -t del comando docker build permette di dare un nome all’immagine. A questo punto la nostra immagine sarà disponibile per l’utilizzo:

Docker package

Con questa mini guida adesso dovresti essere in grado autonomamente di creare un’immagine con Docker. Consulta la reference che abbiamo menzionato nel precedente paragrafo per maggiori dettagli e inizia a sperimentare!

Come deployare con Docker

Docker è una piattaforma che tramite un sistema di virtualizzazione permette di eseguire programmi in pacchetti chiamati container.

I container sono isolati l’uno dall’altro e includono tutte le risorse software, compreso il sistema operativo, e dunque permettono l’esecuzione dell’applicazione.

Deploy Docker: eseguire il deploy di un’applicazione con Docker usando Docker Image

Per eseguire il deploy di un’applicazione con Docker, è necessario prima di tutto avere a disposizione un’immagine.

L’immagine, o Docker image, è un artefatto di sola lettura che contiene un set di istruzioni per la creazione di un container che può essere eseguito sulla piattaforma Docker. L’immagine fornisce un metodo particolarmente comodo per creare pacchetti di applicazioni e ambienti server preconfigurati.

La Docker image, può essere creata mediante un Dockerfile e con il comando docker build.

Deploy Docker

Possiamo trovare l’immagine appena creata nella lista delle immagini con il comando docker image ls.

Per fare il deploy dell’applicazione sarà necessario avere a disposizione un’istanza di Ubuntu Server con Docker installato. Questa instanza può trovarsi su una virtual machine locale o remota, oppure può trovarsi su una macchina fisica dedicata.

Considera che la macchina virtuale dove verrà eseguito il deploy dovrà avere accesso all’immagine creata. Per fare questo si dovrà copiare l’immagine su un docker registry accessibile via internet. Ci sono molti servizi, tra cui Docker Hub, Amazon ECR o Google Container Registry.

Inoltre, avremo bisogno di creare un account per ottenere la URL del registry e l’abilitazione per poter caricare immagini Docker. A questo punto si potrà caricare l’immagine mediante il comando docker push:

Deploy Docker

Una volta fatto ciò, accedendo alla macchina con Ubuntu Docker, dobbiamo prendere l’immagine dal registry:

Deploy Docker

Appena abbiamo ottenuto l’immagine possiamo lanciare un container con il comando docker run:

Deploy Docker


Deploy Docker: eseguire i comandi all’interno del container

L’attributo -p permette di fare il mapping della porta 80 in modo che sia accessibile dall’esterno. Adesso, lanciando il comando docker ps dovresti vedere il container appena lanciato nella lista.

Per eseguire comandi all’interno del container in esecuzione è possibile eseguire il comando docker exec . Lanciando il comando bash o sh avrai modo di utilizzare la shell all’interno del container, in questo modo:


Scalare più container dinamicamente: i tools di container orchestration

Questo è il metodo più semplice per eseguire il deploy di un container Docker. Che succede se vogliamo eseguire più container e farli interagire tra loro? E se vogliamo scalare il numero di container dinamicamente?

Per fare questo abbiamo bisogno di un tool di container orchestration. Ce ne sono molti, come Docker Swarm, Kubernetes o Amazon ECS, argomenti che tratteremo nei prossimi articoli in maniera approfondita.

Speriamo che questa mini guida possa averti aiutato e soprattutto che ti abbia fatto comprendere come creare un’immagine ed eseguire il deploy di un container.

Docker è oggi un tool imprescindibile per chi si occupa di sviluppo web e di programmazione lato server.

Docker consente infatti di distribuire il codice in maniera più rapida ed è un tool che ci dà una concreta opportunità di rendere omogeneo il funzionamento delle applicazioni ottimizzando il trasferimento del codice.

Come installare Docker: mini guida pratica

Installare Docker sulla propria macchina per creare un ambiente di sviluppo è davvero un’operazione molto semplice. Vediamo come installarlo su Windows, Mac e Ubuntu.

Come installare Docker: Windows, Mac e Ubuntu

In questa mini guida vediamo come installare Docker su Windows, Mac e Ubuntu.


Installare Docker su Windows

Prima di iniziare l’installazione assicurati di avere una versione di Windows tra Pro, Enterprise o Education.

Se hai Windows Home, dovrai installare WSL 2, un subsystem per Windows che permette di creare un ambiente Linux dove Docker può essere eseguito.

Guida all’installazione di WSL 2: https://docs.microsoft.com/en-us/windows/wsl/install-win10

A questo punto dovremo scaricare l’installer. E’ possibile scaricare l’installer di Docker per Windows dal Docker Hub:

Fai doppio click sull’eseguibile .exe e segui questi passaggi:

  • Quando richiesto, assicurati che l’opzione per abilitare Hyper-V sia selezionata.
  • Segui le istruzioni dell’installer e autorizzalo a procedere.
  • Completa il processo e chiudi l’installer.

Per lanciare Docker, cerca “Docker” e scegli “Docker Desktop” tra i risultati.

How to install Docker


Installare Docker su Mac

Come per Windows, per installare Docker su Mac è necessario scaricare l’installer dal Docker Hub.

Come requisito minimo, il computer non deve essere un modello precedente al 2011 ed è necessario avere una versione di macOS uguale o successiva alla 10.14.

Nota che se invece il tuo modello è molto recente e monta un processore M1 di nuova generazione, nessuna versione stabile di Docker è disponibile alla data in cui questo articolo è stato scritto. E’ possibile scaricare una versione ancora in fase di sviluppo chiamata Apple M1 Tech Preview. Leggi bene la sezione “Known issues” dove vengono elencate le limitazioni e i problemi conosciuti.

Una volta scaricato l’installer con estensione .dmg, fai doppio click. Si aprirà una finestrella con l’icona di Docker e la cartella delle applicazioni. Trascina Docker.app dentro la cartella delle applicazioni.

How to install Docker

Ora cerca Docker dallo spotlight (cmd + spazio) e avvia Docker.

Sulla barra di stato in alto a destra dovresti poter notare l’icona di Docker.

How to install Docker

Il processo di avvio sarà terminato quando l’icona rimarrà ferma.


Installare Docker su Ubuntu

Per installare Docker su Ubuntu è necessario seguire alcuni passi da riga di comando.

  1. Installa alcuni package necessari per usare un repository su HTTPS:

    $ sudo apt-get update
    $ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

  2. Aggiungi la chiave GPG ufficiale di Docker:

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

  3. Aggiungi la repository:

    $ sudo add-apt-repository \
    “deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable”

    Nota che puoi impostare un valore diverso di “arch” se il tuo processore ha un’architettura diversa da x86: armhf o arm64.

  4. Installa Docker Engine:

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io

  5. L’installazione di Docker è ora completata.

Cos’è Docker e come funziona questo preziosissimo tool

Docker è una piattaforma che ha rivoluzionato il modo in cui creiamo, testiamo e distribuiamo le nostre applicazioni. Perché? Perché grazie a Docker – il software open source per la containerizzazione in ambiente Linux– è possibile distribuire e ricalibrare le risorse per le nostre applicazioni in qualsiasi ambiente.

In questo articolo che abbiamo scritto per voi vediamo insieme le principali caratteristiche di Docker, quando usarlo, come funziona Docker e qual è la differenza tra Docker e una macchina virtuale.

Seguiteci!

Vediamo Docker dettagliatamente

Il suo linguaggio di programmazione è molto semplice e intuitivo, caratteristica che ci permette di tenere le risorse sempre sotto controllo.
La caratteristica principale di Docker è che consente di distribuire il codice in maniera più rapida, di rendere omogeneo il funzionamento delle applicazioni e di ottimizzare il trasferimento del codice. Tutto questo, come capirete, ci fa risparmiare una grande quantità di tempo, di energie e di denaro.
Ma non finisce qui, grazie a Docker, infatti:

  • si distribuiscono software con una frequenza di sette volte maggiore rispetto a chi non lo utilizza;
  • l’uso dei container semplifica la distribuzione e l’identificazione dei problemi e il rollback per il ripristino;
  • anche il trasferimento delle applicazioni da computer di sviluppo locali a distribuzioni di produzione in AWS è facilitato.

Come funziona Docker?

In questo paragrafo vediamo un po’ più nel dettaglio, ma senza perderci troppo in tecnicismi, come funziona Docker.

Come abbiamo visto nei paragrafi precedenti Docker è la piattaforma software open source che fornisce una modalità standard per creare, eseguire e deployare applicazioni mediante l’uso di container.
Il container è un ambiente isolato dove l’applicazione viene eseguita su un proprio sistema operativo, condividendo con l’host risorse hardware (CPU e RAM) allocate dinamicamente.
Questa funzionalità è coadiuvata e semplificata da servizi come Docker Compose o Kubernetes che facilitano l’esecuzione e la gestione dei container.

L’altra caratteristica, che non possiamo che definire più che positiva, è che i container Docker semplificano l’esecuzione del codice lato server, migliorandone i livelli di utilizzo.

Qual è la differenza tra Docker e una macchina virtuale?

Le macchine virtuali e i container differiscono in diversi modi, ma la differenza principale è che i container forniscono un modo per virtualizzare un sistema operativo in modo che più carichi di lavoro possano essere eseguiti su una singola istanza del sistema operativo.
Con le VM, l’hardware viene virtualizzato per eseguire più istanze del sistema operativo. La velocità, l’agilità e la portabilità dei container li rendono un ulteriore strumento per semplificare lo sviluppo del software.