GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Tutto ciò che devi sapere sull'utilizzo di Docker Compose

Se ti stai chiedendo come creare contenitori Docker riproducibili con Docker Compose, sei nel posto giusto. In questo tutorial dettagliato su Docker Compose imparerai come creare semplici container, mappare le porte con Docker Compose fino a complessi scenari multi-container.

Siete pronti? Scendiamo!

Prerequisiti

Se desideri seguire passo dopo passo, in questo tutorial, assicurati di avere quanto segue:

  1. Una nuova installazione di Ubuntu Server LTS con SSH abilitato . Questa guida utilizzerà Ubuntu Server LTS 20.04.1 come macchina host Docker.
  2. Un computer con VS Code installato (opzionale). Questa guida utilizzerà Visual Studio Code 1.52.1 in SSH per l'host Docker ed eseguirà comandi.
  3. L'estensione SSH ufficiale VS Code installata e connesso all'host Docker. (facoltativo)

Cos'è Docker Compose?

I singoli comandi possono diventare lunghi, molto lunghi in Docker. Prendi il seguito come esempio. Questo esempio crea un contenitore per un'applicazione software denominata bookstack.

docker create \
   --name=bookstack \
   -e PUID # UID of user to take ownership of application/files \
   -e PGID # GID of user to take ownership of application/files \
   -e DB_USER # The database user \
   -e DB_PASS # The database password \
   -e DB_HOST # The database host \
   -e DB_DATABASE # The database to be used \
   -e APP_URL # The url your application will be accessed on (required for correct operation of reverse proxy) \
   -v /host/path/to/config:/config # Location of any uploaded data \
   -p 80:80/tcp # Web UI port \
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

Con l'aumentare della complessità di un ambiente Docker, aumenta anche la quantità di flag e condizioni richieste per la configurazione di un container funzionante. La riga di comando di Docker inizia a diventare ingombrante e difficile da risolvere; soprattutto quando le configurazioni multi-container iniziano a entrare nel mix.

Docker Compose è un modo per creare contenitori Docker riproducibili utilizzando un file di configurazione anziché comandi Docker estremamente lunghi. Utilizzando un file di configurazione strutturato, gli errori sono più facili da rilevare e le interazioni del contenitore sono più facili da definire.

Docker Compose diventa rapidamente prezioso quando si tratta di dipendenze di container o ambienti multi-container.

Docker Compose è un modo fantastico per entrare in Infrastructure as Code senza la complessità dei sistemi distribuiti come Kubernetes.

Docker Compose utilizza una struttura di file di configurazione chiamata YAML . YAML è simile a JSON o HTML in quanto YAML è un linguaggio strutturato e leggibile dalla macchina. YAML si concentra specificamente sull'essere il più leggibile possibile dall'uomo mantenendo quel potere strutturato.

YAML ha uno svantaggio in cui le schede e altri spazi bianchi sono significativi e devono essere formattati correttamente. VS Code fa molto di questo duro lavoro per te ed è anche il motivo per cui vedrai molti degli esempi realizzati in VS Code.

Installazione di Docker Compose

Iniziamo ora a sporcarci le mani. Supponendo che tu sia connesso al tuo host Docker, è ora di installare Docker Compose.

Docker Compose è un pacchetto separato dal runtime Docker. Ma l'installazione di Docker Compose installerà anche il runtime Docker, quindi ucciderai due piccioni con una fava!

Per installare Docker Compose e il runtime Docker, esegui i due comandi seguenti.

# update the software list (known as a repository) and then install docker compose
# with any needed dependencies. the -y flag is used to skip confirmation
sudo apt update -y
sudo apt install docker-compose -y

Una volta installato, dovresti ora creare una struttura di cartelle per archiviare i contenitori.

Creazione di una struttura di cartelle per Docker Compose

Prima di poter creare un contenitore con Docker Compose, devi prima creare una cartella in cui archiviare i contenitori. Non dovresti solo creare una struttura di cartelle per archiviare i contenitori, ma scoprirai che vari comandi Docker sono sensibili alla posizione di vari file di configurazione; Docker Compose non è diverso.

Il componente più importante di Docker Compose è il suo file di configurazione chiamato docker-compose.yaml . Questo file di configurazione, come spiegato sopra, determina come il runtime Docker deve creare un contenitore.

Quando esegui Docker Compose, il comando cercherà il suo file di configurazione nella stessa cartella in cui viene eseguito il comando. A causa di questo requisito, è sempre meglio creare una cartella separata durante l'esecuzione di Docker Compose.

Potrebbe esserci un solo file di configurazione Docker Compose per cartella.

Per dimostrare la creazione di un container Docker con Docker Compose, crea prima una struttura di cartelle per archiviare il container futuro e il relativo file di configurazione utilizzando un piccolo file server chiamato Caddy.

Caddy è un file server, simile a apache httpd o nginx , ma scritto nella lingua Go. Caddy è progettato specificamente per facilità d'uso (e genererà o servirà automaticamente un file index.html) senza configurazione. Questa combinazione rende il caddy una buona scelta per i principianti.

Supponendo che tu abbia effettuato l'accesso al tuo host Docker, crea la struttura delle cartelle come segue:

  1. Nella tua home directory, crea una cartella chiamata contenitori . Questa cartella sarà un buon segnaposto per questo e altri contenitori.
  2. All'interno dei contenitori cartella, crea una sottocartella denominata caddy . Questa cartella conterrà il file di configurazione Docker Compose e il contenitore Caddy stesso.
  3. Infine, all'interno della cartella contenitore, caddy, crea un file di testo vuoto chiamato docker-compose.yaml che diventerà il file di configurazione di Docker Compose.

Con la struttura delle cartelle e il file di configurazione Docker Compose creati, ora puoi iniziare a compilare il file di configurazione con una configurazione Docker Compose.

Creazione di un file di configurazione Docker Compose

Nella sua forma più semplice, un docker-compose.yaml il file per il contenitore del caddy è simile al seguente. Nel tuo editor di testo Linux preferito o con VS Code, copia e incolla il codice seguente nel file di configurazione Docker Compose creato in precedenza.

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

Esaminiamo ciascuna delle opzioni mostrate:

  • version specifica la versione del file di composizione mobile. Ogni nuova definizione di Docker Compose include modifiche sostanziali alle specifiche. Pertanto la versione è importante in modo che Docker Compose possa dire quali funzionalità deve utilizzare. La versione 3.7 è l'ultima versione supportata da Ubuntu 20.04.1 LTS.

Le specifiche complete per Docker Compose 3.x sono disponibili qui. La documentazione collegata menziona ogni singola opzione che puoi utilizzare all'interno di Docker Compose

  • services contengono le specifiche per i contenitori effettivi. Puoi definire più contenitori in questa sezione.
  • caddy è il nome del primo contenitore (questo è puramente indicativo).
  • container_name definisce il nome effettivo assegnato al contenitore da Docker e deve essere univoco.
  • image è il nome dell'immagine. In questo caso, caddy dall'Hub Docker è definito. Il nome o il numero dopo il tag separato da due punti è la versione.

Mappatura delle porte

Quest'ultima opzione in particolare richiede una menzione speciale:

ports:
  - "80:80"

In Docker Compose, le ports La direttiva consente di impostare una o più mappature dall'host al contenitore. Ad esempio, sopra hai mappato la porta 80 sull'host per portare 80 sul contenitore. Tuttavia, non è necessario che corrisponda al numero di porta. L'esempio seguente mappa la porta 8800 sull'host per portare 80 nel contenitore.

ports:
  - "8800:80"

Puoi anche definire più porte come di seguito.

ports:
  - "80:80"
  - "443:443"

In questo modo verranno mappate entrambe le porte 80 e 443 all'host (una configurazione comune per i server Web, per servire sia HTTP che HTTPS).

Il creatore dell'immagine Docker definisce le porte disponibili al momento della creazione. Assicurati di controllare la documentazione dell'immagine con cui stai lavorando su Docker Hub o sul sito Web del manutentore per le porte mappabili. Non ha senso mappare una porta se la porta non è in uso!

Con questo in mente, diamo un'occhiata all'esecuzione effettiva del contenitore.

Esecuzione del container

A questo punto dovresti avere docker-compose.yaml file all'interno del tuo ~\containers\caddy cartella. Ora è il momento di creare e avviare il contenitore Caddy.

Sul tuo terminale esegui il comando seguente che farà apparire i contenitori Docker definiti in docker-compose.yaml file.

# This command must be run in the same folder as the file. The -d flag runs
# the command *detached*, which will bring up the container in the background
sudo docker-compose up -d

Potresti notare che non dovevi specificare la posizione del file docker-compose.yaml durante l'esecuzione di sudo docker-compose up -d . Docker Compose si aspetta che tu esegua tutti i comandi all'interno della cartella che contiene il file docker-compose.yaml, poiché molti comandi sono relativi a quella cartella.

Ora verifica che il contenitore sia attivo e funzionante accedendo a http:// . Questa guida utilizza http://homelab-docker per riferimento.

Puoi vedere questa elaborazione in corso in VS Code mentre SSH è stato inserito nell'host Docker nell'animazione seguente:

Successo! Ora hai utilizzato con successo Docker Compose per avviare un container da un file di configurazione. Fatto questo primo importante passo, diamo un'occhiata a come gestisci lo stato del tuo container.

Comandi per la gestione dei contenitori staccati

Nella sezione precedente, hai avviato il contenitore del caddy usando -d bandiera. In questo modo è stato eseguito un container in un distaccato stato. Quando un contenitore è in uno stato scollegato, il contenitore continuerà a essere eseguito in background. Ma questo pone un problema:come gestisci quel container se non hai più il controllo diretto?

Per risolvere questo problema, Docker Compose dispone di una serie di comandi che gestiranno i contenitori avviati con un docker-compose.yaml file:

  • docker-compose restart viene utilizzato per riavviare un contenitore attualmente in esecuzione. Farlo è diverso dal rieseguire effettivamente docker-compose up -d . Il comando di riavvio riavvierà semplicemente un contenitore esistente, eseguirà nuovamente il docker-compose up -d comando e ricreare il contenitore da zero (se il file di configurazione è stato modificato).
  • docker-compose stop arresterà un contenitore in esecuzione senza distruggere il contenitore. Allo stesso modo, docker-compose start riavvierà il container.
  • docker-compose down fermerà i container in esecuzione e li distruggerà anche . È qui che entra in gioco l'avere bind mount di volumi (leggi di più sotto).
  • docker-compose pull estrarrà la versione corrente dell'immagine (o delle immagini) della finestra mobile dal repository. Se si utilizza l'latest tag, puoi seguire con docker-compose down && sudo docker-compose up -d per sostituire il contenitore con l'ultima versione. Usando docker-compose pull è un modo conveniente per aggiornare rapidamente i container con tempi di inattività minimi.
  • docker-compose logs mostrerà i log del contenitore in esecuzione (o interrotto). Puoi anche indirizzare singoli contenitori (se ci sono più contenitori definiti nel file di composizione) con docker-compose logs <container name> .

Un elenco completo dei comandi docker-compose può essere visualizzato eseguendo docker-compose senza ulteriori argomenti o citati qui nella documentazione.

Ora che hai un container in esecuzione, diamo un'occhiata all'utilizzo del contenuto salvato localmente sul tuo computer.

Creazione di cavalcature vincolanti in Docker Compose

Rilegatura di cavalcature Ecco come Docker associa i dati utente importanti alla memoria locale sul tuo server. Per iniziare, genera del contenuto per il contenitore da ospitare:

  1. Sull'host Docker, all'interno di ~/containers/caddy cartella crea una nuova cartella chiamata files .

2. Crea un nuovo file chiamato index.html all'interno di ~/containers/caddy cartella che appare come sotto. Questa sarà la pagina principale che il server web Caddy servirà.

<body><h2>hello world!</h2></body>

3. Modifica il file di configurazione di Docker Compose in modo che assomigli di seguito. Il file di esempio seguente sta aggiungendo i volumes sezione e puntando un montaggio di collegamento ai file cartella appena creata per renderla disponibile al contenitore.

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #the ./ refers a folder relative to the docker-compose file - "./files:/usr/share/caddy"

4. Esegui docker-compose up -d ancora. Docker Compose ora riconoscerà che il file è stato modificato e ricrea il tuo contenitore.

5. Passa alla pagina del contenitore con un browser e ora dovresti vedere che sta servendo "Hello World!" pagina.

Puoi vedere quanto segue nell'animazione qui sotto:

Ora stai ospitando contenuti archiviati localmente sulla tua macchina! Tuttavia, cosa succede se i tuoi contenuti si trovano su una fonte esterna come una condivisione di rete?

Utilizzo di Docker Compose con i volumi Docker

Dopo aver creato un semplice contenitore con Docker Compose, probabilmente avrai bisogno di quel contenitore per accedere ai file da qualche altra parte, magari su una condivisione di rete. In tal caso, puoi configurare il contenitore per l'utilizzo dei volumi Docker direttamente nel file di configurazione di Docker Compose.

A scopo dimostrativo, questa guida creerà un server NFS (Network File Share) sull'host Docker. Servire contenuto locale come montaggio NFS non ha alcuno scopo pratico al di fuori della dimostrazione. Se dovessi montare un volume NFS, generalmente proverrà da una sorgente esterna come un NAS o un server remoto.

Configura una condivisione NFS

Se non hai già impostato una condivisione NFS, creane una ora sull'host Docker per questo tutorial. Per farlo:

  1. Installa il server NFS pacchetto eseguendo apt install nfs-kernel-server -y .

2. Aggiungere il contenitore come esportazione NFS (simile a una condivisione CIFS di Windows) eseguendo quanto segue.

# Add a line to the /etc/exports config file to create a NFS share for # /home/homelab/containers. This share is only exposed to localhost (to # prevent other computers from having access) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # Restart the NFS server with the new config sudo systemctl restart nfs-kernel-server

3. Ora verifica che l'host esponga la condivisione NFS eseguendo showmount -e localhost . Questo comando mostrerà tutte le condivisioni NFS attualmente esposte e chi ha accesso.

Nello screenshot qui sotto, puoi vedere /home/homelab/containers è esposto, ma solo al computer localhost (che è lo stesso server che esegue l'host Docker).

Se vedi la cartella /home//containers nell'output viene impostata la condivisione NFS.

Definizione di un volume denominato Docker

Dopo aver creato la condivisione NFS, ora devi dire a Docker come accedere a quella condivisione. Usando Docker Compose, puoi farlo definendo un volume denominato nel file di configurazione di Docker Compose.

Un volume denominato è un modo per Docker di astrarre condivisioni di file basate sulla rete. La condivisione di file di rete è disponibile in tutti i tipi di forme e dimensioni al giorno d'oggi:condivisioni CIFS (Windows), condivisioni NFS (Linux), AWS S3 Bucket e altro ancora. Creando un volume con nome, Docker fa la parte più difficile di capire come comunicare con la condivisione di rete e lascia che il contenitore tratti la condivisione come se fosse un archivio locale.

Per creare un volume con nome:

  1. Apri il file di configurazione di Docker Compose (docker-compose.yaml ). Se stai seguendo, il file dovrebbe trovarsi in ~/containers/caddy cartella.

2. All'interno del file di configurazione Docker Compose, aggiungi un volumes sezione dopo i services sezione. Il tuo file di configurazione dovrebbe essere simile a quello di seguito. I volumes la sezione crea un volume denominato MyWebsite . All'interno di quel volume denominato, vengono specificati i parametri necessari (come IP, impostazioni NFS e percorso). I volumes parametro all'interno dei services anche la sezione viene modificata, per puntare al volume del nome anziché a una cartella locale.

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. Dopo aver definito il volume denominato che punta alla condivisione NFS nel file di configurazione Docker Compose, eseguire docker-compose up -d per creare e avviare il contenitore. Se tutto va bene, il contenitore e il sito Web dovrebbero tornare in funzione.

4. Passare nuovamente alla pagina del contenitore. L'indice.html il contenuto dovrebbe apparire proprio come se il file fosse montato localmente. Tuttavia, quel file viene montato tramite il server NFS impostato sulla rete.

Poiché ora puoi montare volumi Docker esterni in Docker Compose, ora puoi portare tutti i tipi di archiviazione di rete nei tuoi contenitori. Tuttavia, Docker Compose può fare molto di più che definire singoli contenitori o volumi. Entriamo in scenari più complessi e multi-container.

Questo tutorial non utilizzerà più il contenitore del caddy, quindi puoi rimuovere il contenitore usando docker-compose down .

Definizione di più contenitori in Docker Compose

La maggior parte dei contenitori Docker non funziona all'interno del vuoto. I container Docker di solito hanno dipendenze di servizi come database o servizi Web separati che parlano tramite un'API.

Utilizzando Docker Compose, puoi raggruppare i contenitori definiti all'interno di un unico file. Definendo più contenitori in un unico file, i contenitori possono comunicare tra servizi dipendenti e semplificare l'organizzazione di layout di contenitori complessi.

Per dimostrare un tale scenario, configuriamo una popolare applicazione wiki chiamata BookStack .

BookStack è un popolare software wiki noto per la sua facilità d'uso e il layout gerarchico (al contrario di un layout piatto, come mediawiki).

BookStack, come molte applicazioni Web, richiede un database separato per funzionare correttamente, nonché le informazioni necessarie per comunicare con il database. L'impostazione di una tale situazione è dove Docker Compose eccelle.

Crea il file di configurazione Docker Compose

BookStack non ha un'immagine Docker gestita internamente, tuttavia, linuxserver.io mantiene una rispettabile immagine Docker Hub per conto di BookStack. Sebbene la documentazione sul sito dell'hub Docker contenga un file di configurazione Docker Compose consigliato, questo tutorial creerà un nuovo file di configurazione spiegando i concetti.

Sull'host Docker:

  1. Per prima cosa, crea una cartella per BookStack. Se hai seguito i tutorial della sezione precedente, dovresti avere un ~/containers cartella. Crea una cartella chiamata bookstack lì dentro.

2. Quindi crea un file di configurazione Docker Compose vuoto chiamato docker-compose.yaml all'interno della libreria cartella.

3. Ora apri il file di configurazione Docker Compose e definisci due contenitori:il bookstack contenitore e il bookstack_db (mariadb) contenitore.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

Finora, questo docker-compose.yaml file utilizza principalmente concetti già introdotti:hai due servizi (bookstack e bookstack_db ), sia con immagini che con attacchi di rilegatura. Il container bookstack ha una mappatura delle porte dalla porta host 8080 alla porta interna 80.

Dato l'overhead estremamente basso dei container Docker, è pratica comune definire un container database separato per ogni applicazione web. Ciò consente una maggiore separazione dei compiti. Questo è nettamente diverso dalle tradizionali configurazioni di database, in cui una singola installazione di database può servire centinaia di applicazioni web.

Una nuova opzione che puoi vedere nel file sopra è depends_on comando. Questo comando indica a Docker l'ordine in cui i contenitori devono iniziare. La definizione di depends_on il comando dice a Docker che il bookstack_db contenitore deve inizia prima.

Impostazione della comunicazione del container con variabili di ambiente

Questo file di configurazione creato nell'ultima sezione non è ancora completo. Sebbene tu abbia definito due servizi (contenitori), non si parlano! La bookstack container non ha idea di come comunicare con il bookstack_db contenitore. Risolviamolo usando le variabili di ambiente.

Le variabili di ambiente sono il modo più comune per fornire variabili ai contenitori Docker. Si tratta di variabili fornite in fase di esecuzione (o definite in docker-compose.yaml file di configurazione) per fornire informazioni su ciò che deve fare il contenitore.

Le variabili d'ambiente sono definite dalla persona che crea l'immagine Docker. Saranno diversi a seconda dell'immagine Docker che stai utilizzando e devi fare riferimento alla documentazione del creatore in merito alle variabili di ambiente da utilizzare.

Esistono due metodi per definire le variabili di ambiente; direttamente nella docker-compose.yaml file stesso o come file separato.

Un file separato è, in genere, il metodo consigliato, soprattutto se le variabili contengono dati sensibili come le password. Un docker-compose.yaml il file è progettato per essere condiviso o addirittura caricato in un repository GitHub pubblico. Avere un file separato per i dati sensibili riduce la possibilità di una violazione accidentale della sicurezza.

Sull'host Docker, ora crea due variabili di ambiente; uno per la libreria container e uno per bookstack_db contenitore.

  1. Crea un nuovo file in ~/containers/bookstack cartella denominata bookstack.env con il seguente contenuto:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. Crea un nuovo file in ~/containers/bookstack cartella denominata bookstack_db.env e includere i seguenti contenuti:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3. Come best practice, ora assicurati entrambi env i file non sono leggibili da altri utenti.

chmod 600 bookstack.env bookstack_db.env

Dovresti modificare l'accesso in lettura perché entrambi i file bookstack.env e bookstack_db.env contengono dati sensibili.

4. Aggiorna ~/containers/bookstack/docker-compose.yaml File Docker Compose per fare riferimento a questi due file di ambiente mostrati di seguito.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5. Ora avvia il bookstack e bookstack_db contenitori utilizzando Docker Compose.

sudo docker-compose up -d

Puoi vedere ciascuno dei passaggi sopra menzionati in questa sezione eseguiti in VS Code di seguito.

Monitoraggio dei registri di composizione Docker

Il motore Docker funziona con Docker Compose per eseguire molte attività diverse in background. Essere in grado di monitorare cosa sta succedendo soprattutto quando si lavora con più container contemporaneamente è utile.

Per monitorare il contenitore della libreria, ad esempio, utilizza i logs comando. In questo tutorial, una volta che vedi i log mostrano [services.d] done , puoi andare all'URL della libreria.

sudo docker-compose logs bookstack

A questo punto, dovresti avere un wiki completamente funzionante in esecuzione all'interno del proprio contenitore, con il proprio database, interamente all'interno di Docker!

Se hai le cartelle bookstack e bookstack_db, puoi ricreare il tuo ambiente bookstack da zero.

Docker Compose e networking

Fino a questo punto, non hai imparato molto sull'aspetto della comunicazione e del networking di come i container funzionano insieme. Cambiamo le cose.

Quando crei più contenitori all'interno di un singolo docker-compose.yaml file come hai fatto nelle sezioni precedenti, sono tutti assegnati alla stessa rete (di solito chiamata nome-della-cartella-genitore_predefinita ).

Puoi vedere la rete creata per i contenitori quando esegui docker-compose up -d come mostrato di seguito.

Quando tutti i container vengono assegnati all'interno della stessa rete, Docker crea le voci DNS per loro internamente. Ecco perché nell'esempio precedente hai indicato il tuo database come bookstack_db nelle variabili d'ambiente. Quel bookstack_db name è in realtà una voce DNS che punta all'indirizzo IP del contenitore del database.

Inoltre, non devi fare affidamento su Docker Compose per generare automaticamente le reti per te. È possibile definire manualmente reti interne o esterne. La definizione manuale delle reti è ottima quando si dispone di un container che deve comunicare con un altro container in un docker-compose.yaml separato file. Potresti esporre le porte o creare una rete a cui possono unirsi entrambi!

Nota che quando inizi a definire in modo esplicito le reti, devi anche definire in modo esplicito la rete predefinita. Docker Compose interromperà automaticamente la creazione della rete non appena inizierai a definire le reti

Ora modifica la libreria docker-compose.yaml per includere una rete creata esternamente.

  1. Crea la rete esterna con docker network create my_external_network .

2. Definisci la rete esterna in docker-compose.yaml :

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. Esegui docker-compose up -d per ricreare i contenitori. I tuoi due contenitori sono ora uniti a due reti come mostrato di seguito.

Il contenitore della libreria ora è anche unito a una rete definita esternamente. Ciò ti consente di creare un altro contenitore che trasforma il traffico HTTP dello stack di libri in HTTPS prima che lasci Docker (denominato proxy inverso ).

Impostazione di un utente specifico per l'esecuzione di un container

Per impostazione predefinita, tutti i contenitori Docker vengono eseguiti come utente root in modalità sandbox. Ciò equivale all'esecuzione di una macchina virtuale che ha eseguito l'accesso come utente amministratore predefinito. Mentre questo generalmente non è un problema, ci sono problemi di sicurezza se la sandbox è compromessa.

L'altro problema con l'esecuzione come root sono i permessi dei file. Potresti notare che se provi a eliminare il db cartella all'interno del bookstack cartella, in realtà non puoi; i contenuti sono di proprietà di root.

Sebbene la maggior parte delle immagini non apprezzi l'esecuzione come utente non root, linuxserver.io le immagini in particolare offrono una variabile di ambiente per impostare l'utente che viene eseguito all'interno del contenitore. Puoi farlo aggiungendo UID=1000 e GID=1000 all'interno di bookstack.env configurazione.

1000:1000 is the default user ID and group for the first user in ubuntu (which you may not be). You can read more about User IDs and Group IDs at Related:A Windows Guy in a Linux World:Users and File Permissions )

You can also force a UID and GID using the user parameter in docker-compose, but this is not recommended as most containers do not behave well when forced to a different user

Setting the Restart Policy

If you’d like containers built with Docker Compose to restart on failure, use the restart policy by adding a restart: <option> parameter under the container settings in docker-compose.yaml .

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Adding this parameter will cause containers to automatically restart on failure to help maintain uptime in the event of unexpected power issues.

Manually setting DNS entries for Containers

Just like with Windows and Linux, Docker also has a “hosts file”. By using the extra_hosts parameter in a config file, you can force a host to resolve to a specific IP. This can be useful when you have DNS constraints, such as split DNS or a test server you want to interact with temporarily.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

Running Commands

Once the container is started, you can run commands inside of the container using the docker-compose run . For example, maybe you’d like to start up a Bash terminal inside of your bookstack contenitore. To do that, you’d run the command below.

docker-compose run web bash

Conclusion

At this stage, you should have enough information to follow along with the majority of docker-compose tutorials out on the web. Having this knowledge can vastly expand your ability to move into the world of Docker, and the building of web apps in Infrastructure as Code.


Docker
  1. Podman vs Docker:tutto ciò che devi sapere

  2. Tutto quello che volevi sapere su Zorin OS 12

  3. Tutto quello che devi sapere su Ubuntu 13.04

  4. Tutto ciò che devi sapere su CentOS Stream

  5. Che cos'è una VPN? Tutto quello che devi sapere sulle VPN

Tutto ciò che devi sapere sul sistema operativo Peppermint Linux

Tutto quello che devi sapere su Black Lab Linux

Tutto ciò che devi sapere su Linux Mint Distro

Tutto ciò che devi sapere sugli inode in Linux

Tutto ciò che è importante sapere su Hard Link in Linux

Tutto ciò che è importante sapere sull'UID in Linux