Hai problemi con i contenitori di arresto Docker? Trovare il modo corretto per fermare un container è difficile grazie alla possibilità di creare molti container diversi. In questo articolo imparerai i comandi Docker per arrestare un contenitore o tutti i contenitori.
Continua a leggere per saperne di più!
Prerequisiti
Per seguire questo tutorial, assicurati di avere quanto segue:
- Windows 10:il tutorial utilizza Windows per eseguire Docker, ma puoi anche applicare gli stessi passaggi generali a Linux o macOS.
- Docker Desktop – Questo tutorial utilizza la versione 3.5.2. Il motore Docker è disponibile se sei su Linux poiché la GUI non lo è.
- Uno o più contenitori Docker in esecuzione.
Termina Container con il comando Docker stop Container
Iniziamo con il primo comando:il docker stop
container e come esegue l'arresto dei container.
Ad esempio, forse è necessario interrompere un container in esecuzione con il nome mystifying_hofstadter
e un ID di fb66ed502096
. Come mostrato nell'esempio seguente, arresta il contenitore con docker stop
comando contenitori.
# Stop the container via the name
docker stop mystifying_hofstadter
# Stop the container via the ID (same container)
docker stop fb66ed50209
Cosa succede se hai più container in esecuzione e desideri interromperli? Il docker stop
Il comando containers supporta l'arresto di più ID container, uno alla volta.
Innanzitutto, elenca tutti i contenitori tramite la docker ps
comando e passa gli ID del contenitore a docker stop
comando container, come mostrato di seguito.
# List all running containers
docker ps
# Stop the following Docker containers via the container ID
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Che cosa succede se desideri interrompere tutti i contenitori in esecuzione senza recuperare manualmente gli ID contenitore e passarli a docker stop
? La docker ps -q
il comando lo realizzerà. Il -q
parametro di docker ps
comando restituisce solo gli ID dei contenitori.
# Create three containers. A semi-colon separates each command
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# List all running containers
docker ps -q
# Retrieve all running container IDs and pass those to docker stop
docker stop $(docker ps -q)
Il
$(docker ps -q)
costrutto sopra è una sottoespressione sia in Bash su Linux che in PowerShell su Windows. Una sottoespressione indica alla shell di elaborare una serie di comandi,docker ps -q
, prima e poi restituisci il set di risultati al comando originaledocker stop
.
Il docker stop
Il comando containers utilizza il segnale SIGTERM. I segnali Linux informano un processo di un evento, ma spetta al processo decidere come agire su un dato segnale.
Quando si utilizza il segnale SIGTERM, Docker utilizza il segnale per interrompere con grazia un processo attendendo un 10
predefinito secondi prima di inviare il segnale SIGKILL, che interrompe immediatamente il processo.
Arresto di un container utilizzando i segnali di processo
Hai appreso del comportamento predefinito di Docker (segnale di arresto), con il docker stop
comando container, quando si arresta un container. Ma potresti non volere il comportamento predefinito. Puoi invece indicare a Docker di utilizzare segnali di arresto alternativi.
Con la docker run
comandi --stop-signal
flag, è possibile specificare il segnale di arresto all'avvio del container. Questo flag imposta il segnale che verrà inviato al contenitore in esecuzione quando desideri che si interrompa.
Nell'esempio seguente, il --stop-signal
flag assume il valore SIGQUIT
, che dice a Docker di inviare il segnale SIGQUIT quando è il momento di fermare il container. L'esempio utilizza anche i seguenti parametri:
d
– Esegue il contenitore in modalità scollegata (in background). La modalità separata non consentirà all'utente di interagire immediatamente con il contenitore poiché il processo è in esecuzione in background.t
– alloca una console Pseudo-TTY (PTY), che emula una vera console terminale nel container e impedisce al container Ubuntu di uscire immediatamente. Il contenitore Ubuntu nell'esempio richiede una console PTY per rimanere attiva in background.- "nome immagine" – Da quale immagine Docker eseguire il provisioning del contenitore, in questo caso,
ubuntu
immagine.
docker run -d -t --stop-signal SIGQUIT ubuntu
Puoi anche specificare il segnale di arresto utilizzando un Dockerfile, che indica a Docker come creare un container. Puoi aggiungere una voce al Dockerfile specificando il segnale di stop con
STOPSIGNAL SIGQUIT
, Per esempio. Puoi cambiare ilSIGQUIT
con qualsiasi segnale di stop desideri.
Uscita immediata dai container con docker kill
Ci saranno momenti in cui vorrai uscire dai contenitori senza concedere loro un periodo di grazia. La docker kill
il comando arresta immediatamente un contenitore.
L'esempio seguente passa il contenitore con ID 2aa318273db5
a docker kill
. Il container uscirà immediatamente tramite il segnale SIGKILL. Il contenitore non potrà avere un'uscita aggraziata. Come risultato del comando, il container uscirà e verrà mostrato l'ID del container.
docker kill 2aa318273db5
Docker elimina tutti i contenitori con il comando
docker kill $(docker ps -q)
. Nota che(docker ps -q
) è una sottoespressione qui.
Arresto e rimozione di un container con docker rm
Per impostazione predefinita, quando crei un contenitore, quel contenitore viene creato come prima:è idempotente. La rimozione di un contenitore avrà un impatto minimo e, tenendo presente ciò, docker rm
può forzare l'arresto e rimuovere un contenitore. Docker emette un SIGKILL
segnala al processo principale e rimuove il contenitore dall'elenco dei contenitori disponibili sull'installazione Docker.
Se il contenitore deve conservare i file interni modificati o il suo stato deve essere mantenuto, la rimozione di un contenitore distruggerà tali modifiche. Attenzione ai potenziali errori!
Nell'esempio seguente, forse hai avviato un contenitore a cui è stato assegnato il nome kind_galileo
. Prima di rimuovere un contenitore, il contenitore deve essere fermato, come mostrato di seguito. La docker ps -a
il comando sta visualizzando lo stato di Exited
per il contenitore di esempio.
Ora che il contenitore ha smesso di emettere il docker rm
il comando rimuoverà completamente il contenitore.
docker rm kind_galileo
Invece di fermare il contenitore per poi rimuoverlo, la combinazione di --force
e docker rm
si fermerà e rimuoverà il contenitore in un'unica operazione. Il contenitore, laughing_elion
, non sarà più disponibile per l'esecuzione.
docker rm --force laughing_elion
Se non specifichi il
--force
comando, verrà visualizzato il messaggio di erroreError response from daemon: You cannot remove a running container...
Interruzione dei contenitori Docker con Docker Compose
I comandi Docker vengono in genere utilizzati su un singolo contenitore, ma puoi creare un servizio con più contenitori che funzionano insieme. Lo strumento Docker Compose ti consente di configurare un servizio composto da più contenitori per lavorare insieme.
Poiché i contenitori all'interno di un servizio sono progettati per funzionare insieme, è meglio interrompere l'intero servizio stesso in modo corretto anziché qualsiasi singolo contenitore.
Se hai un servizio in esecuzione con più contenitori, [docker-compose stop]
interrompe il servizio senza rimuovere i contenitori o il servizio. Segui di seguito per creare un servizio Docker Compose, avviare il servizio e infine interrompere il servizio in modo regolare.
1. Creare una directory in cui memorizzare il file di configurazione. In questo esempio, la directory C:\Articoli\Ubuntu memorizzerà il file.
mkdir C:\Articles\Ubuntu
2. Quindi, crea il file docker-compose.yml file, contenente la seguente configurazione. Il file Docker Compose sottostante crea un servizio con due contenitori Ubuntu e, una volta aperti, i contenitori non escono immediatamente.
# The specification version of docker-compose
version: "3.9"
# The collection of applications composing this service
services:
# First Ubuntu Container
container1:
image: ubuntu
# Same as the -t option and allocates a Psuedo-TTY, so the container does not immediately exit.
tty: true
# Second Ubuntu Container
container2:
image: ubuntu
tty: true
3. In una sessione del terminale, vai alla directory del file di configurazione Docker personalizzato, che in questo esempio è C:\Articoli\Ubuntu . Esegui docker-compose up -d
per generare e avviare il servizio creato nel passaggio precedente in background come indicato dal -d
opzione.
4. Nella stessa sessione del terminale e nella stessa directory, emettere il comando docker-compose stop
per terminare il servizio e contenitori con grazia.
Il
docker-compose
comando, come ladocker
comando, ha anche ilrm --force
ekill
parametri. Ladocker-compose
i parametri funzionano sul servizio anziché su un singolo contenitore. Ladocker-compose kill
il comando accetta anche un'opzione-s
opzione per specificare il segnale di arresto.
Conclusione
I container Docker sono un potente strumento per creare ambienti unici e segmentati per lo sviluppo e l'uso in produzione. In questo articolo, hai appreso diversi modi in cui Docker interrompe uno o più, anche tutti, i contenitori. Hai anche imparato a conoscere il segnale di arresto predefinito utilizzato da Docker e come modificarlo.
Con questa conoscenza, ora conosci i dettagli dell'arresto dei container Docker e come non sbagliare quando è il momento di interrompere l'esecuzione dei container. Come pensi di fermare i tuoi container d'ora in poi, avendo questa nuova conoscenza?