Se non conosci Docker Compose e lo impari seguendo vari tutorial, potresti imbatterti in termini come docker-compose up, docker-compose up -d, docker-compose stop, docker-compose down o persino docker -componi stop.
Questi termini sono sufficienti per confondere un principiante della finestra mobile perché molti di questi comandi di composizione della finestra mobile sembrano comportarsi in modo molto simile.
In effetti, all'inizio può essere particolarmente difficile distinguere subito la differenza tra docker-compose up
e docker-compose start
.
Avviare un container tramite Docker Compose non equivale a eseguire il comando up? Non esattamente.
Lascia che ti spieghi tutto in dettaglio.
Differenze tra Docker Componi su, su -d, stop, inizio, giù e giù -v
A cosa servono questi comandi:
Comando Docker Componi distribuisce servizi di app Web e crea nuovi contenitori dall'immagine Docker insieme alla configurazione di reti, volumi e ogni configurazione specificata nel file Docker Compose. Quando specifichi -d
, significa che gli dici di eseguirlo in modalità distaccata in modo che venga eseguito in background dandoti il controllo del terminale (discusso tra poco tramite alcuni esempi di seguito).
Comando di arresto per la composizione di Docker interrompe tutti i servizi associati a una configurazione Docker Compose. NON rimuove alcun contenitore o volume interno o rete associati.
Comando di avvio di Docker Componi avvierà tutti i servizi interrotti specificati su una configurazione interrotta basata sullo stesso file Docker Compose.
Comando Docker Componi interrompe tutti i servizi associati a una configurazione Docker Compose. A differenza di stop, rimuove anche eventuali contenitori e reti interne associate ai servizi. Ma NON volumi specificati internamente. Per fare anche questo, devi specificare in aggiunta il -v
flag dopo il down
comando.
Sembra simile al comando Docker run vs start, giusto?
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 PrakashBasta teoria, diamo un'occhiata ad alcuni esempi pratici ora.
Capire la differenza con un esempio pratico
Se vuoi seguire gli esempi, assicurati di avere già il programma di installazione Docker e Docker Compose.
Diciamo che stai usando una configurazione del blog Ghost basata su Docker Compose in esecuzione sul tuo server Linux.
In tutti i nostri tutorial sull'hosting automatico, tendo principalmente a usare -d
flag ogni volta che distribuiamo le nostre configurazioni sui nostri server. Ma cosa succede se non lo specifichi?
[email protected]:~/ghost$ docker-compose up
Pulling ghost (ghost:4.20.3)...
4.20.3: Pulling from library/ghost
b380bbd43752: Pull complete
8d36a6ce056a: Pull complete
f75fe68b8e22: Pull complete
44f6d143e12f: Pull complete
0ebe8063dedd: Pull complete
f984e0e37c5a: Pull complete
ce2320facea8: Pull complete
898c3dbc1716: Pull complete
45c37559f24a: Pull complete
Digest: sha256:b332684117bfa05329298712ad0ffcfc4a83ce6314332e073978f46be3c05e81
Status: Downloaded newer image for ghost:4.20.3
Creating ghost_ghost_1 ... done
Attaching to ghost_ghost_1
ghost_1 | [2021-10-26 07:02:05] INFO Ghost is running in production...
ghost_1 | [2021-10-26 07:02:05] INFO Your site is now available on https://ghost.domain.com/
ghost_1 | [2021-10-26 07:02:05] INFO Ctrl+C to shut down
ghost_1 | [2021-10-26 07:02:05] INFO Ghost server started in 0.369s
ghost_1 | [2021-10-26 07:02:06] WARN Database state requires initialisation.
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: posts
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: posts_meta
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: users
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: oauth
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: posts_authors
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: roles
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: roles_users
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: permissions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: permissions_users
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: permissions_roles
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: settings
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: tags
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: posts_tags
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: invites
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: brute
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: sessions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: integrations
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: webhooks
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: api_keys
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: mobiledoc_revisions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: products
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: offers
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: benefits
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: products_benefits
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_products
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_payment_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_login_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_email_change_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_status_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_product_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_paid_subscription_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: labels
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_labels
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_stripe_customers
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_stripe_customers_subscriptions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: offer_redemptions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: members_subscribe_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: stripe_products
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: stripe_prices
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: actions
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: emails
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: email_batches
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: email_recipients
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: tokens
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: snippets
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: temp_member_analytic_events
ghost_1 | [2021-10-26 07:02:06] INFO Creating table: custom_theme_settings
ghost_1 | [2021-10-26 07:02:06] INFO Model: Product
ghost_1 | [2021-10-26 07:02:06] INFO Model: Tag
ghost_1 | [2021-10-26 07:02:06] INFO Model: Role
ghost_1 | [2021-10-26 07:02:06] INFO Model: Permission
ghost_1 | [2021-10-26 07:02:07] INFO Model: User
ghost_1 | [2021-10-26 07:02:07] INFO Model: Post
ghost_1 | [2021-10-26 07:02:08] INFO Model: Integration
ghost_1 | [2021-10-26 07:02:08] INFO Relation: Role to Permission
ghost_1 | [2021-10-26 07:02:08] INFO Relation: Post to Tag
ghost_1 | [2021-10-26 07:02:08] INFO Relation: User to Role
ghost_1 | [2021-10-26 07:02:08] INFO Database is in a ready state.
ghost_1 | [2021-10-26 07:02:08] INFO Ghost database ready in 3.309s
ghost_1 | [2021-10-26 07:02:09] INFO Ghost booted in 4.457s
ghost_1 | [2021-10-26 07:02:09] INFO Adding offloaded job to the queue
ghost_1 | [2021-10-26 07:02:09] INFO Scheduling job update-check at 49 27 22 * * *. Next run on: Tue Oct 26 2021 22:27:49 GMT+0000 (Coordinated Universal Time)
ghost_1 | [2021-10-26 07:02:51] INFO "GET /favicon.ico" 200 7ms
ghost_1 | [2021-10-26 07:02:51] INFO "GET /" 200 605ms
ghost_1 | [2021-10-26 07:02:51] INFO "GET /assets/built/screen.css?v=dde6c321bb" 200 5ms
ghost_1 | [2021-10-26 07:02:51] INFO "GET /assets/built/casper.js?v=dde6c321bb" 200 3ms
ghost_1 | [2021-10-26 07:02:52] INFO "GET /members/api/member/" 204 1ms
ghost_1 | [2021-10-26 07:02:52] INFO "GET /members/api/site/" 200 14ms
ghost_1 | [2021-10-26 07:02:52] INFO "GET /favicon.ico" 200 2ms
Come vedi? Senza il -d
opzione, avvii la tua configurazione, ma si verifica in una modalità dettagliata senza tornare al prompt del terminale. Un po' d'aiuto, vero? Quando apri il browser e accedi al blog fantasma, lo troverai accessibile in pochi istanti. Ma cosa succede se esci dalla console con Ctrl+Z? Manterrà il processo in esecuzione in background e potrai verificarlo utilizzando il comando docker ps :
[email protected]:~/ghost$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
563a45d049cf ghost:4.20.3 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 2368/tcp ghost_ghost_1
Ma cosa succede al contenitore se invece hai usato Ctrl+C? Il processo viene immediatamente interrotto.
[email protected]:~/ghost$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Quando usi -d
opzione, quello che fa è molto simile a Ctrl+Z:si stacca dalla console e continua a eseguire il contenitore in background e stampa anche il nuovo nome del contenitore (ghost_ghost_1
in questo caso).
Ora, invece di usare docker-compose down
, usiamo docker-compose stop
:
[email protected]:~/ghost$ docker-compose stop
[email protected]:~/ghost$
Ora controlliamo i nostri contenitori in esecuzione. Previsto, non dovrebbe essercene nessuno:
[email protected]:~/ghost$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------
ghost_ghost_1 docker-entrypoint.sh node ... Exit 0
Nota che non ho usato docker ps
. Invece, ho eseguito docker-compose ps
perché volevo mostrarti un altro modo per verificare l'Exit 0
stato. Ciò significa che il contenitore è uscito/arrestato.
Ricontrolliamo questo con docker ps -a
. Il -a
flag cercherà anche i contenitori fermi:
[email protected]:~/ghost$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44d09e778a91 ghost:4.20.3 "docker-entrypoint.s…" 8 minutes ago Exited (0) 7 minutes ago ghost_ghost_1
Che cos'è docker-compose start
allora?
Docker Compose Start ha senso solo quando non hai rimosso alcun contenitore con docker-compose down
(che non ho ancora fatto in questa riga di comando del tutorial). Quindi, in pratica, la differenza qui è che avvia i contenitori che sono stati fermati e non rimossi.
Quindi, per prima cosa, usiamo start
invece di up
ora e guarda cosa succede:
[email protected]:~/ghost$ docker-compose start
Starting ghost ... done
[email protected]:~/ghost$
Quello che succede ora è che il contenitore interrotto viene riavviato:
[email protected]:~/ghost$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------
ghost_ghost_1 docker-entrypoint.sh node ... Up 2368/tcp
Ecco qua. Lo stato ora è Up
torna da Exit 0
. Puoi anche ricontrollare con la docker
versione del comando:
[email protected]:~/ghost$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44d09e778a91 ghost:4.20.3 "docker-entrypoint.s…" 22 minutes ago Up About a minute 2368/tcp ghost_ghost_1
Ora eseguiamo stop
comando di nuovo.
[email protected]:~/ghost$ docker-compose stop
Stopping ghost_ghost_1 ... done
Ora sai qual è lo stato del contenitore. Puoi usare sia il up
o start
comando per farlo funzionare di nuovo. Nota che puoi eseguire il down
anche in questo stato senza riavviare i servizi:
[email protected]:~/ghost$ docker-compose down
Removing ghost_ghost_1 ... done
Network net is external, skipping
Il contenitore è stato rimosso ora. Se c'erano reti interne specificate all'interno del file Docker Compose, sarebbero state rimosse anche loro. Da net
è esterno, viene ignorato dalla rimozione. Avevi specificato il -v
flag in aggiunta, sarebbe stato anche rimosso!
[email protected]:~/ghost$ docker-compose down -v
Stopping ghost_ghost_1 ... done
Removing ghost_ghost_1 ... done
Network net is external, skipping
Volume ghost is external, skipping
Mantieni sempre la doppia cautela con i tuoi dati!
Suggerimento bonus:tieni presente che poiché sto utilizzando un volume esterno (creato in precedenza tramite "volume docker crea nome volume"), l'utilizzo di "-v" non lo rimuove. È pensato solo per i volumi creati dalle specifiche Docker Compose. Ma al contrario, "sfoltimento volume Docker" rimuove un volume esterno anche se viene utilizzato da un container! Guida definitiva al backup e al ripristino dei container Docker Sfrutta sia il cloud che il sistema locale per eseguire il backup e il ripristino dei container Docker. Manuale LinuxAvimanyu Bandyopadhyay
Inoltre, non puoi usare start
in questa fase. Funziona solo per stop
configurazioni ped:
[email protected]:~/ghost$ docker-compose start
Starting ghost ... failed
ERROR: No containers to start
In tal caso, devi utilizzare docker-compose up
o docker-compose up -d
ancora una volta.
[email protected]:~/ghost$ docker-compose up -d
Creating ghost_ghost_1 ... done
[email protected]:~/ghost$
Riepilogo
Spero che questo articolo ti abbia dato una migliore comprensione di up
vs up -d
vs start
così come stop
vs down
e down -v
per Docker Componi.
Questa ampia guida esplicativa dovrebbe rendere la gestione quotidiana del Docker molto più semplice e molto meno opprimente d'ora in poi. A seconda dello scenario in scenario, specialmente nei sistemi di produzione, quale comando particolare scegli per risolvere una situazione, ovviamente, differirà nel modo in cui lo implementerai.
Se hai pensieri, domande o suggerimenti da condividere, lascia un commento qui sotto.