Ho visto molte persone confondersi tra un Dockerfile e un file Compose. Ciò è principalmente dovuto al fatto che entrambi vengono utilizzati per modificare un'immagine Docker in un certo modo, sebbene non sia tecnicamente corretto.
È facile confondere i due termini, ma è anche necessario capire la differenza quando si parla con un collega o con il proprio (potenziale) datore di lavoro.
Dockerfile è ciò che viene utilizzato per creare un'immagine contenitore e un file Compose è ciò che viene utilizzato per distribuire un'istanza di tale immagine come contenitore.
Consentitemi di entrare un po' nel dettaglio in modo da comprendere correttamente la differenza tra Docker Compose e Dockerfile.
Cos'è un Dockerfile?
Mi piace chiamare Dockerfile il predecessore di un'immagine contenitore. Costruisci un'immagine da un Dockerfile. Un tipico Dockerfile contiene istruzioni di compilazione speciali, comandi come RUN
, ADD
, COPY
, ENTRYPOINT
, ecc.
Prendi l'esempio seguente:
FROM alpine:latest
RUN apk add --no-cache fortune
ENTRYPOINT ["fortune"]
Ogni riga inizia con un'istruzione per il componente build. Queste istruzioni non devono necessariamente essere scritte in maiuscolo. Quanto segue è valido quanto il precedente.
from alpine:latest
run apk add --no-cache fortune
entrypoint ["fortune"]
Da questo Dockerfile, ora puoi creare un'immagine contenitore (o un'immagine Docker). Un'immagine è semplicemente un modello per i contenitori in esecuzione, costituito da più livelli di sola lettura. Dal momento che questo non è un articolo sulle immagini dei contenitori, mi asterrò dallo spiegare questo argomento.
Per creare un'immagine da questo Dockerfile, utilizzando la CLI della finestra mobile, esegui il seguente comando
docker build -t fortune:alpine .
Questo creerà un'immagine taggata fortune:alpine
. Non creerò ancora un contenitore da questa immagine, è per la prossima sezione.
Cos'è un file Compose?
I file Compose vengono utilizzati in due tipi di distribuzioni:nella distribuzione non cluster con docker-compose
e una distribuzione del cluster con docker swarm
.
Per distinguere i due tipi, affronterò il file di composizione responsabile della distribuzione del cluster come file di stack. Tra poco parlerò dei file stack.
I file Compose fanno parte di uno strumento chiamato docker-compose
. È un'applicazione client per il server daemon della finestra mobile, un po' come la docker
client CLI, ma invece di digitare l'intero run
comandi ogni volta, con docker-compose
puoi riutilizzare lo stesso file YAML più e più volte e distribuire lo stesso container con la stessa configurazione della prima volta.
È più leggibile, più manutenibile, più intuitivo. Un singolo file di composizione può contenere più configurazioni di distribuzione del contenitore.
Il supporto per la composizione dei file farà parte del client Docker predefinito che è scritto in Go, come argomento della riga di comando, "docker compose". Nota il trattino mancante lì. È ancora sperimentale, quindi in produzione si consiglia di utilizzare la versione Python, ad es. docker-compose.Prendiamo l'immagine precedente e distribuiamone un'istanza utilizzando un file di composizione.
version: "3.3"
services:
fortune:
image: "fortune:alpine"
Salva il file come docker-compose.yml
. Ora esegui nella stessa directory il seguente comando
docker-compose up
Non devi salva il file come docker-compose.yml
, puoi salvarlo come preferisci, ma se non è docker-compose.yml
o docker-compose.yaml
, assicurati di utilizzare il -f [FILENAME]
opzione.
docker-compose -f docker-compose.yml up
Aspetta e guarda cosa succede.
Per sapere quale fortune
cioè, leggi questo articolo sui comandi Linux divertenti.
Cos'è un file stack?
I file stack sono identici per comporre file con sintassi simile e la maggior parte delle opzioni interne, con alcune eccezioni. I file di stack vengono utilizzati per distribuire stack di servizi in un cluster swarm.
Puoi riutilizzare il file di composizione precedente direttamente come file di stack.
Innanzitutto, inizializza il cluster.
docker swarm init
Quindi esegui un comando simile al seguente
docker stack deploy -c docker-compose.yml fortune
Se distribuito in questo modo, è necessario controllare l'output visualizzando i registri del servizio utilizzando docker service logs ...
.
Conclusione
I file Docker e Compose hanno uno scopo diverso. Se potessi costruire una sequenza temporale, sarebbe simile a questa
Dockerfile -> Docker Image -> Compose File -> Running Containers
C'è un altro motivo per cui i principianti si confondono con questi due file. È possibile puntare a un Dockerfile tramite il file Compose, quindi è possibile utilizzare docker-compose
per costruire l'immagine.
Ad esempio, puoi riscrivere il file di composizione precedente così
version: "3.3"
services:
fortune:
build:
context: '.'
dockerfile: "./Dockerfile"
image: "fortune:alpine"
Ora puoi eseguire docker-compose build
per costruire l'immagine. Oppure puoi anche eseguire docker-compose up --build
per creare ed eseguire il container contemporaneamente.
Qui il Dockerfile viene passato attraverso il file di composizione e, dal primo sguardo, può sembrare che sia il file di composizione responsabile della creazione dell'immagine, ma non lo è.
Docker Run vs Start vs Create:Differenza spiegata Per un principiante di Docker, termini come Docker Start, Docker Run e Docker Create potrebbero creare confusione. Questo articolo spiega la differenza con esempi. Manuale LinuxAbhishek PrakashSpero che questo articolo abbia chiarito qual è la differenza tra un Dockerfile e un file Compose. Se hai domande, fammi sapere nella sezione commenti in basso.