Skip to content

Containers lifecycle

docker pull - завантажує образ з реджістрі

docker create - створює контейнер з образу

docker start - запускає контейнер

docker run - docker pull + docker create + docker start

docker pause - призупиняє роботу контейнера

docker unpause - продовжує роботу контейнера

docker stop - зупиняє контейнер gracefully надсилаючи sig term на pid 1

docker kill - зупиняє примусово

docker rm - видяляє контейнер

Є декілька причин, чому контейнер може бути в статусі Exited:

  • процес усередині контейнера закінчив виконання;
  • процес був закінчений зовнішньою командою, наприклад, docker stop або docker kill;
  • процес усередині контейнера закінчився через баг у коді чи якусь помилку, яка не була оброблена правильно, або, наприклад, закінчилась доступна пам'ять, тоді програма закінчиться з помилкою OutOfMemoryException.

Команда docker stop зупиняє контейнер у так званий graceful way. Docker відправляє termination signal в контейнер, SIGTERM для основного процесу (PID 1) контейнера. Це дозволяє основному процесу завершити роботу безпечно, завершивши всі повʼязані з цим команди. Наприклад, звільнити ресурси, закрити з'єднання до бази даних, зберегти якісь дані. docker stop вважається безпечним способом завершити роботу контейнера.

Є ще інша команда, яка називається docker kill. На відміну від docker stop, ця команда відправляє сигнал SIGKILL та миттєво зупиняє контейнер. Її краще використовувати тоді, коли контейнер перестав відповідати на інші команди.

Щоб дізнатись, чому контейнер закінчив виконання, можна виконати наступну команду:

docker container inspect 709f5e5d73e6

Де 709f5e5d73e6 — це ID контейнера. У виведених даних нас цікавить поле State:

Політика перезапуску (Restart Policy)

Дуже часто нам буде потрібно, щоб контейнер залишався робочим як можна довше, і щоб нам не потрібно було його вручну перезапускати після якоїсь проблеми. Для цього під час виконання docker run треба додати параметр --restart, який контролює поведінку контейнера після того, як він перейшов в стан Exited. Цей параметр може мати 4 значення:

  • no — за замовчуванням, не перезапускати контейнер.
  • on-failure — перезапустити контейнер тільки у випадку, якщо він завершився з помилковим кодом виходу (exit code не дорівнює 0).
  • always — завжди перезапускати контейнер, навіть якщо він був зупинений.
  • unless-stopped — перезапустити контейнер, крім випадків, коли він був зупинений користувачем або якщо Docker daemon перезапускається.

Спробуємо використати always:

docker run -d -p 8080:9090 --restart always server:1.0
docker ps

Download image (and run) e.g nginx

docker run -p 8080:80 nginx

or just download image:

docker pull nginx

History of commands that was used during crating of every layer of image:

docker history nginx
#Delete container
docker ps #shows containers
docker ps -a #shows ALL containers even shutdowned containers
docker rm <id_from_previous_command>
#or
docker container rm <id_from_previous_command> #deletes container

#Delete images
docker images #shows all images with IDs
docker rmi <id_from_previous_command> #e.g nginx