CodeGym /Corsi /Docker SELF /Creazione di docker-compose.yml

Creazione di docker-compose.yml

Docker SELF
Livello 15 , Lezione 2
Disponibile

3.1 File compose.yaml

Il file compose.yaml (o una delle seguenti varianti: docker-compose.yaml, docker-compose.yml, compose.yml) è il file di configurazione principale utilizzato da Docker Compose per definire e gestire applicazioni multi-container. Descrive quali container (servizi) devono essere avviati, come interagiscono tra di loro e quali risorse necessitano.

Per uniformità in questa lezione, useremo la variante compose.yaml, poiché è raccomandata per le versioni moderne di Docker Compose.

Struttura del file compose.yaml

Il file compose.yaml è composto da diverse sezioni, ognuna delle quali descrive vari aspetti della configurazione dell'applicazione. Le sezioni principali includono:

  1. version: specifica la versione del file Compose (ad esempio, '3.9').
  2. services: descrive i container (servizi), le loro configurazioni e dipendenze.
  3. volumes: definisce i volumi per memorizzare i dati tra i container e l'host.
  4. networks: configura le reti attraverso le quali i servizi comunicano tra di loro.

3.2 Direttive principali

1. version

La direttiva version definisce la versione della sintassi Docker Compose utilizzata nel file compose.yaml. Al momento in cui scriviamo, la versione più aggiornata è la 3, in particolare gli aggiornamenti come 3.8 e 3.9.

Yaml

version: '3.9'

2. services

La sezione services definisce i container che Compose deve creare ed eseguire. Ogni servizio rappresenta un container separato con una configurazione specifica.

Esempio:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

In questo esempio sono definiti due servizi: web e db. Il servizio web utilizza l'immagine nginx:latest e apre la porta 80. Il servizio db utilizza l'immagine mongo:latest e collega un volume per archiviare i dati.

3. volumes

La sezione volumes è utilizzata per definire i volumi che possono essere collegati ai container per l'archiviazione dei dati. Questo è utile per conservare i dati nel caso in cui i container vengano riavviati.

Esempio:

Yaml

volumes:
  mongo-data:

4. networks

La sezione networks consente di definire reti personalizzate in cui operano i container. Questo garantisce isolamento e configurazione delle connessioni di rete. Se le reti non sono specificate, Docker Compose creerà una rete predefinita e tutti i servizi vi saranno collegati.

Esempio:

Yaml

networks:
  front-end:
  back-end:

3.3 Direttive per la configurazione dei servizi

Le principali direttive per configurare i servizi:

1. image

La direttiva image indica l'immagine che verrà utilizzata per creare il container.

Esempio:

Yaml

services:
  web:
    image: nginx:latest

2. build

La direttiva build viene utilizzata per specificare il percorso al Dockerfile, che deve essere utilizzato per costruire l'immagine.

Esempio:

Yaml

services:
  app:
    build: ./app

3. ports

La direttiva ports definisce le porte che devono essere aperte e inoltrate dalla macchina host al container.

Esempio:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

La direttiva volumes monta i volumi nei container, consentendo di salvare i dati tra i riavvii dei container.

Esempio:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

La direttiva environment imposta le variabili di ambiente per il container.

Esempio:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

La direttiva depends_on indica che questo servizio dipende da altri servizi e deve essere avviato dopo di essi.

Importante! Quando avvii il tuo servizio, non hai una garanzia del 100% che tutti i servizi necessari per il suo funzionamento siano completamente pronti. Saranno avviati, sì, ma il successivo funzionamento non è garantito. Questo problema può essere risolto con l'health-check, ma ne parleremo più avanti.

Esempio:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

La direttiva command consente di sovrascrivere il comando che verrà eseguito all'avvio del container.

Esempio:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

La direttiva networks connette il servizio a una o più reti.

Esempio:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 Esempio completo

Esempio completo del file compose.yaml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

In questo esempio:

  • Sono definiti tre servizi: web, app e db.
  • web usa l'immagine Nginx, monta un file di configurazione e dipende dal servizio app.
  • app viene buildato da un Dockerfile locale, monta il codice sorgente dell'applicazione e usa variabili d'ambiente.
  • db usa l'immagine MongoDB e monta un volume per archiviare i dati.
  • Sono creati due volumi e due network per isolare e gestire l'interazione tra i servizi.

Nota: un volume è mongo-data, e l'altro è una directory montata dalla macchina host (per esempio, ./app).

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION