Usare Docker per arrestare i contenitori senza combinare guai!

Avete problemi con l’arresto dei contenitori Docker? Trovare il modo corretto per fermare un contenitore è difficile con la possibilità di creare molti contenitori diversi. In questo articolo, imparerete i comandi Docker per arrestare un contenitore o tutti i contenitori.

Continuate a leggere per saperne di più!

Prerequisiti

  • Per seguire questo tutorial, assicuratevi di avere quanto segue:
  • Docker Desktop – Questo tutorial utilizza la versione 3.5.2. Il motore Docker è disponibile se siete su Linux poiché l’interfaccia grafica non lo è.
  • A running Docker container or containers.

Arrestare i contenitori con il comando docker stop Containers

Iniziamo con il primo comando: il comando docker stop containers e come ferma i contenitori.

Ad esempio, forse dovete fermare un contenitore in esecuzione con il nome mystifying_hofstadter e un ID di fb66ed502096. Come mostrato nell’esempio sottostante, fermate il contenitore con il comando docker stop containers.

# Arresta il container tramite il nome
docker stop mystifying_hofstadter
# Arresta il container tramite l'ID (stesso container)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

Cosa succede se hai diversi container in esecuzione e vuoi fermarli? Il comando docker stop supporta l’arresto di più ID di container, uno alla volta.

Per prima cosa, elenca tutti i container tramite il comando docker ps e passa gli ID dei container al comando docker stop, come mostrato di seguito.

# Elenca tutti i container in esecuzione
docker ps
# Arresta i seguenti container Docker tramite l'ID del container
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

Cosa fare se desideri arrestare tutti i container in esecuzione senza recuperare manualmente gli ID dei container e passarli a docker stop? Il comando docker ps -q può fare ciò. Il parametro -q del comando docker ps restituisce solo gli ID dei container.

# Crea tre container. Un punto e virgola separa ogni comando
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Elenca tutti i container in esecuzione
docker ps -q
# Recupera tutti gli ID dei container in esecuzione e passali a docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

La costruzione $(docker ps -q) sopra è una sottoespressione sia in Bash su Linux che in PowerShell su Windows. Una sottoespressione istruisce la shell di elaborare prima un insieme di comandi, docker ps -q, e poi restituire l’insieme di risultati al comando originale docker stop.

Il comando docker stop utilizza il comando dei contenitori SIGTERM. I segnali di Linux informano un processo di un evento, ma spetta al processo decidere come agire su un determinato segnale.

Quando si utilizza il segnale SIGTERM, Docker utilizza il segnale per arrestare delicatamente un processo, attendendo un valore predefinito di 10 secondi prima di inviare il segnale SIGKILL, che termina immediatamente il processo.

Arresto di un Container Utilizzando i Segnali di Processo

Hai appreso il comportamento predefinito di Docker (segnale di arresto) con il comando docker stop durante l’arresto di un contenitore. Tuttavia, potresti non volere il comportamento predefinito. In alternativa, puoi istruire Docker a utilizzare segnali di arresto alternativi.

Con il flag --stop-signal del comando docker run, puoi specificare il segnale di arresto durante l’avvio del contenitore. Questo flag imposta il segnale che verrà inviato al contenitore in esecuzione quando desideri arrestarlo.

Nell’esempio qui sotto, il flag --stop-signal assume il valore SIGQUIT, che dice a Docker di inviare il segnale SIGQUIT quando è ora di fermare il contenitore. L’esempio utilizza anche i seguenti parametri:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “nome immagine” – Quale immagine Docker utilizzare per il provisioning del contenitore, in questo caso l’immagine ubuntu.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

Puoi anche specificare il segnale di stop utilizzando un Dockerfile, che dice a Docker come costruire un contenitore. Puoi aggiungere un’entrata al Dockerfile specificando il segnale di stop con STOPSIGNAL SIGQUIT, ad esempio. Puoi sostituire SIGQUIT con qualsiasi segnale di stop desideri.

Uscita immediata dai contenitori con docker kill

Ci saranno momenti in cui vorrai uscire dai contenitori senza concedere loro un periodo di grazia. Il comando docker kill ferma immediatamente un contenitore.

Nell’esempio qui sotto, viene passato il contenitore con ID 2aa318273db5 a docker kill. Il contenitore uscirà immediatamente tramite il segnale SIGKILL. Al contenitore non sarà consentita un’uscita delicata. Come risultato del comando, il contenitore uscirà e verrà mostrato l’ID del contenitore.

docker kill 2aa318273db5

Uccidi tutti i contenitori Docker con il comando docker kill $(docker ps -q). Nota che (docker ps -q) è una sottoespressione qui.

Arresto e rimozione di un contenitore con docker rm

Di default, quando si crea un contenitore, quel contenitore viene costruito allo stesso modo di prima: è idempotente. Rimuovere un contenitore avrà un impatto minimo e con questo in mente, docker rm può forzare l’arresto e rimuovere un contenitore. Docker emette un segnale SIGKILL al processo principale e rimuove il contenitore dall’elenco dei contenitori disponibili nell’installazione di Docker.

Se il contenitore deve mantenere i file interni modificati o il suo stato deve essere conservato, allora rimuovere un contenitore distruggerà tali modifiche. Attenzione ai potenziali problemi!

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 arrestato, come mostrato di seguito. Il comando docker ps -a sta visualizzando lo stato di Exited per il contenitore di esempio.

Listing all containers, including stopped containers.

Ora che il contenitore è stato arrestato, emettendo il comando docker rm si rimuove completamente il contenitore.

docker rm kind_galileo

Invece di fermare il contenitore per poi rimuoverlo, la combinazione di --force e docker rm 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 si specifica il comando --force, si incontrerà il messaggio di errore Risposta di errore dal daemon: Non è possibile rimuovere un contenitore in esecuzione...

Stopping and removing a container.

Arrestare i contenitori Docker con Docker Compose

I comandi Docker sono tipicamente utilizzati su un singolo contenitore, ma è possibile creare un servizio con più contenitori che lavorano in concerto tra loro. Lo strumento Docker Compose ti consente di configurare un servizio composto da più contenitori che lavorano insieme.

Dato che i contenitori all’interno di un servizio sono progettati per lavorare insieme, è meglio fermare l’intero servizio in modo grazioso anziché ogni singolo contenitore.

Se hai un servizio in esecuzione con più contenitori, [docker-compose stop] ferma il servizio senza rimuovere i contenitori o il servizio. Segui di seguito per creare un servizio Docker Compose, avviare il servizio e infine fermare il servizio in modo adeguato.

1. Crea una directory per memorizzare il tuo file di configurazione. In questo esempio, la directory C:\Articles\Ubuntu conterrà il file.

mkdir C:\Articles\Ubuntu

2. Successivamente, crea il file docker-compose.yml, contenente la seguente configurazione. Il file Docker Compose qui sotto crea un servizio con due contenitori Ubuntu e, quando viene avviato, i contenitori non escono immediatamente.

# La versione di specifica di docker-compose
version: "3.9"
# La collezione di applicazioni che compongono questo servizio
services:
  # Primo contenitore Ubuntu
  container1:
    image: ubuntu
    # Stessa opzione -t e alloca un Psuedo-TTY, quindi il contenitore non esce immediatamente.
    tty: true
  # Secondo contenitore Ubuntu
  container2:
    image: ubuntu
    tty: true

3. In una sessione di terminale, vai alla directory del tuo file di configurazione Docker personalizzato, che in questo esempio è C:\Articoli\Ubuntu. Esegui il comando docker-compose up -d per generare e avviare il servizio creato nel passaggio precedente in background come indicato dall’opzione -d.

Starting a Docker Compose service.

4. Nella stessa sessione di terminale e directory, emetti il comando docker-compose stop per terminare il servizio e i contenitori in modo delicato.

Stopping a Docker Compose service.

Il comando docker-compose, come il comando docker, ha anche i parametri rm --force e kill. I parametri di docker-compose agiscono sul servizio invece di un singolo contenitore. Il comando docker-compose kill ha anche un’opzione -s per specificare il segnale di stop.

Conclusione

I container Docker sono uno strumento potente per creare ambienti unici e segmentati per lo sviluppo e l’uso in produzione. In questo articolo, hai appreso diversi modi in cui Docker ferma uno o più container, persino tutti. Hai anche appreso quale segnale di stop predefinito utilizza Docker e come modificarlo.

Con questa conoscenza, ora conosci tutti i dettagli su come fermare i container Docker e come evitare problemi quando è il momento di arrestare i container in esecuzione. Come pianifichi di fermare i tuoi container d’ora in poi, avendo acquisito questa nuova conoscenza?

Source:
https://adamtheautomator.com/docker-stop-containers/