docker stop

Zatrzymuje działający kontener (wysyła SIGTERM, potem SIGKILL).

docker stop grzecznie zatrzymuje działający kontener. Najpierw wysyła do głównego procesu (PID 1) sygnał SIGTERM, żeby aplikacja mogła się posprzątać — zamknąć połączenia, dopisać do pliku, zwolnić zasoby. Jeśli proces nie wyłączy się w wyznaczonym czasie (domyślnie 10 sekund), Docker traci cierpliwość i dobija kontener twardym SIGKILL. To podstawowy sposób na wyłączanie kontenerów, gdy chcesz dać im szansę na łagodne zejście, a nie wyrwać wtyczkę z gniazdka.

Składnia i najważniejsze opcje

Podstawowa składnia wygląda tak:

docker stop [OPCJE] KONTENER [KONTENER...]

  • -t, --time — liczba sekund oczekiwania między SIGTERM a SIGKILL (domyślnie 10). Daj więcej czasu aplikacjom, które długo się zamykają.
  • -s, --signal — sygnał wysyłany zamiast domyślnego SIGTERM (np. SIGINT). Przydatne, gdy aplikacja reaguje na inny sygnał.
  • Kontener możesz wskazać po nazwie albo po ID (wystarczy unikalny prefiks skrótu).
  • Podasz kilka kontenerów po spacji — Docker zatrzyma je po kolei.

Domyślny sygnał bierze się z instrukcji STOPSIGNAL w obrazie (lub --stop-signal ustawionego przy tworzeniu kontenera), o ile nie nadpiszesz go flagą -s.

Przykłady użycia

  • docker stop web — zatrzymuje kontener o nazwie web z domyślnym 10-sekundowym oknem na sprzątanie.
  • docker stop 4f2a — zatrzymuje kontener po prefiksie jego ID, gdy nie chce ci się przepisywać całego skrótu.
  • docker stop db cache worker — wyłącza trzy kontenery jednym poleceniem.
  • docker stop -t 30 postgres — daje bazie aż 30 sekund na bezpieczne domknięcie zanim padnie SIGKILL.
  • docker stop $(docker ps -q) — zatrzymuje wszystkie aktualnie działające kontenery (lista ID z docker ps -q).

Częste błędy i pułapki

Najczęstsza pomyłka to mylenie docker stop z docker kill. stop jest uprzejmy i daje czas na sprzątanie, kill od razu wali SIGKILL bez ostrzeżenia. Jeśli zależy ci na integralności danych, używaj stop.

Druga pułapka: jeśli twoja aplikacja w ogóle nie reaguje na SIGTERM (bo np. działa jako podproces shella, który nie przekazuje sygnałów), to i tak będziesz czekać pełne 10 sekund, a potem dostaniesz twardy SIGKILL — z utratą niezapisanych danych. Zadbaj, by twój proces był PID 1 i obsługiwał sygnały, albo użyj --init przy starcie kontenera.

Pamiętaj też, że docker stop tylko zatrzymuje kontener — nie usuwa go. Kontener nadal istnieje (zobaczysz go w docker ps -a) i możesz go wskrzesić poleceniem docker start.

Powiązane komendy: docker start, docker restart, docker kill, docker rm, docker ps, docker pause.