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.ymlfile.
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-servere il secondo è node-appe vuoi che sia creato usando Dockerfilenella 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.ymlfile vorresti iniziare la prima riga in questo modo:
version: '3'
Questo dice a Docker la versione docker-composeche 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-composedi 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 8081sul mio computer locale 8081sul 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.ymlfile 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-composenon 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.ymlfile 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-servere reindirizzerà tale connessione verso questo container in esecuzione.
Per tutto il tempo, l' Dockerfileunico contiene questo:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Quindi, mentre prima dovresti eseguire docker run myimageper creare un'istanza di tutti i contenitori o servizi all'interno del file puoi invece eseguire docker-compose upe non devi specificare un'immagine perché Docker cercherà nella directory di lavoro corrente e cercherà un docker-compose.ymlfile all'interno di lì.
Prima docker-compose.yml, dovevamo trattare con due comandi separati di docker build .e docker run myimage, ma nel docker-composemondo 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-composesemplifica il lavoro con più contenitori. La prossima volta che devi avviare questo gruppo di contenitori in background puoi farlo docker-compose up -de fermarli puoi farlo docker-compose down.