docker-compose esiste per impedirti di scrivere una tonnellata di comandi che dovresti eseguire con docker-cli.
docker-compose semplifica anche l'avvio simultaneo di più contenitori e li collega automaticamente con una qualche forma di rete.
Lo scopo di docker-compose è di funzionare come docker cli ma di emettere più comandi molto più rapidamente.
Per utilizzare docker-compose, è necessario codificare i comandi in esecuzione in un docker-compose.yml
file.
Non hai intenzione di copiarli incollandoli nel file yaml, c'è una sintassi speciale.
Una volta creato, devi inviarlo al cli di composizione docker e spetterà al cli analizzare il file e creare tutti i diversi contenitori con la configurazione corretta che specifichiamo.
Quindi avrai contenitori separati, diciamo ad esempio, uno è redis-server
e il secondo è node-app
e vuoi che sia creato usando Dockerfile
nella directory corrente.
Inoltre, dopo aver creato quel contenitore, mappereste una porta dal contenitore al computer locale per accedere a tutto ciò che lo esegue al suo interno.
Quindi per il tuo docker-compose.yml
file vorresti iniziare la prima riga in questo modo:
version: '3'
Questo dice a Docker la versione docker-compose
che vuoi usare. Dopo di ciò devi aggiungere:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Si prega di notare il rientro, molto importante. Inoltre, nota per un servizio che sto afferrando un'immagine, ma per un altro servizio sto dicendo docker-compose
di guardare all'interno della directory corrente per creare l'immagine che verrà utilizzata per il secondo contenitore.
Quindi si desidera specificare tutte le diverse porte che si desidera aprire su questo contenitore.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Si noti il trattino, un trattino in un file yaml è il modo in cui si specifica un array. In questo esempio sto mappando 8081
sul mio computer locale 8081
sul contenitore in questo modo:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Quindi la prima porta è il tuo computer locale, e l'altra è la porta sul contenitore, puoi anche distinguere tra i due per evitare confusione in questo modo:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Sviluppando il tuo docker-compose.yml
file in questo modo creerà questi contenitori essenzialmente sulla stessa rete e avranno libero accesso per comunicare tra loro in qualsiasi modo desiderino e scambiare tutte le informazioni che desiderano.
Quando i due contenitori vengono creati utilizzando docker-compose
non sono necessarie dichiarazioni di porta.
Ora nel mio esempio, dobbiamo fare una configurazione del codice nell'app Nodejs che assomigli a questo:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Uso questo esempio sopra per farti sapere che potrebbe esserci qualche configurazione specifica che dovresti fare oltre al docker-compose.yml
file che potrebbe essere specifico per il tuo progetto.
Ora, se mai ti ritrovi a lavorare con un'app Nodejs e redis vuoi assicurarti di essere a conoscenza della porta predefinita utilizzata da Nodejs, quindi aggiungerò questo:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Quindi Docker vedrà che l'app Node sta cercando redis-server
e reindirizzerà tale connessione verso questo container in esecuzione.
Per tutto il tempo, l' Dockerfile
unico contiene questo:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Quindi, mentre prima dovresti eseguire docker run myimage
per creare un'istanza di tutti i contenitori o servizi all'interno del file puoi invece eseguire docker-compose up
e non devi specificare un'immagine perché Docker cercherà nella directory di lavoro corrente e cercherà un docker-compose.yml
file all'interno di lì.
Prima docker-compose.yml
, dovevamo trattare con due comandi separati di docker build .
e docker run myimage
, ma nel docker-compose
mondo se vuoi ricostruire le tue immagini che scrivi docker-compose up --build
. Ciò indica a Docker di riavviare i contenitori ma di ricostruirlo per ottenere le ultime modifiche.
Quindi docker-compose
semplifica il lavoro con più contenitori. La prossima volta che devi avviare questo gruppo di contenitori in background puoi farlo docker-compose up -d
e fermarli puoi farlo docker-compose down
.