Как остановить контейнер docker
Перейти к содержимому

Как остановить контейнер docker

  • автор:

Остановка процесса внутри контейнера Docker и выполнение команды

Всем привет. Суть в том, что у меня есть Докер контейнер с elasticsearch. Так уж вышло, что мне нужно выполнить команду по отвязке эластика от кластера, но для этого нужно остановить сам эластик. Когда я выполняю остановку эластика внутри контейнера, то контейнер останавливатеся. Возможно ли остановить эластик и оставить контейнер запущенным?

Отслеживать
задан 21 апр 2021 в 18:41
9 2 2 бронзовых знака
Это русская версия stackoverflow, вопрос должен быть на русском языке
21 апр 2021 в 18:54
А в чем проблема запустить контейнер заново после остановки?
22 апр 2021 в 8:31
Так после старта и сервис внутри контейнера тоже стартует. А мне нужно, чтобы он был остановлен..
22 апр 2021 в 13:15

В ответе ниже вам все правильно написали, однако строго говоря если родительский процесс не сервис, который вам нужно остановить, то можно сделать то что вы хотите, однако это прям сомнительное решение. Например контейнер с supervisor который поднимает ваш сервис — одно из разрешений вашей задачи.

23 апр 2021 в 9:53

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Прям то, что вы хотите, сделать нельзя.

Фундаментально, докер-контейнер это процесс, к которому применили некие настройки. Подключили файловую систему, ограничили права, создали свое пространство для идентификаторов пользователей/групп, номеров портов и т.п.

Поэтому когда главный процесс в докере остановлен, то и контейнер остановлен.

Можно обойти это создав новый образ основываясь на остановленном контейнере, а потом запустив новый контейнер используя новый образ.

Вот пример. Запускаем

docker run -ti ubuntu:latest /bin/sh -c "while true; do sleep 3; date >> /log; done" 

Можно проверить из другой консоли (тут 2f93a0dc522f это container id) что все работает:

$ docker exec -ti 2f93a0dc522f /bin/bash -c "tail -f /log" Wed Apr 21 20:03:05 UTC 2021 Wed Apr 21 20:03:08 UTC 2021 

Теперь если остановить контейнер, то и exec тоже остановится.

Теперь можно сделать комит:

docker commit 2f93a0dc522f xxx 

И теперь запустить уже новый контейнер:

docker run -ti xxx /bin/bash root@a67f1f72ac62:/# cat /log Wed Apr 21 20:03:02 UTC 2021 Wed Apr 21 20:03:05 UTC 2021 

Из этой консоли можно запускать нужную вам команду.

У вас, вполне возможно, данные или конфигурация хранится в volume-ах. Это значит вы запускали оригинальный docker run с volume-aми. Значит и новый контейнер нужно запускать с теми же volume-ами.

Остановить все контейнеры Docker

Изображение баннера

Флаг q нужен для выполнения в фоновом режиме. Он не является обязательным.

Удалить все контейнеры Docker

Нужно сделать то же самое, но вместо stop выполнить rm

docker rm $( docker ps -a q )

Альтернативный способ это system prune

docker system prune

WARNING! This will remove: — all stopped containers — all networks not used by at least one container — all dangling images — all dangling build cache Are you sure you want to continue? [y/N] y Deleted Containers: 60136dcc356d794d23aee10d3e6440fd53204ed88ad1c45f9bb70d0f66dd1cc4 85375f0f0e5e3d196ec7b11b4f7834aadee167de6c489ce4bf90b940ddec5ea8 33efc448ad6c67ee7e61336482dd7110a059e0c78d8b0a321f0f192ee26a048e Deleted Images: deleted: sha256:409d2b2d3c0b20cfb9556bb1e8c69c6e8e8b6120c3883396a5015f109f3f25cb deleted: sha256:c26bbf7dc2369c5a9e316dbf6c8c0f79fd81b1dd92d5a4ee343060c96cabebf2 deleted: sha256:fcf59b2324beadaf9fc689bb205bc28915a78da42aee860bbb17bded2c54be13 deleted: sha256:c9952ac8387d7dc94e779d2663120f3e93a61a615b710fd7680f0dde63d0c411 deleted: sha256:7b5a2e67a82fb2512681822bfb4fae0b61c135b55ecc55b8fe0bc41ee7d60b40 deleted: sha256:bbdc7e06675baa525c1a65fbedcc3145f3271d49cf828ecd0f77aed5e31e740d deleted: sha256:08908b45bd8a5b6340e89d9a401e39a04d4c81c66a75b4fc31528c042632bdf9 deleted: sha256:75ed22a7abbe9c23df78263501d5236b7a1dd9649fba94da3aee59ba277fc2c7 deleted: sha256:30f928cfbca4c67e9c284907b304b73a0804fa19b9d8ff22896c6afb79440638 deleted: sha256:b0573c5f42fec17a41f9633532e4f0c1ce77fc111aaec5fa9293bf3975459396 deleted: sha256:a1b7d51ce64b376af6d3e24f10689f04903f7f6174c07f8515127819c4d464f0 deleted: sha256:28115231ced77eebf1e319aacf77c7373f4845f13aa4fd21864cea5b79b5998f deleted: sha256:954454106831e933798549935ed4bebb0683ccb0807cb4a0ce69537242418d4f deleted: sha256:043dfc7ae5ae1671626dc1aa082f66791f8579bdcda25c1ccd9d7938c3a352b1 deleted: sha256:32083ac1bbb41043358d3bdf20d2cf6a2b95ddd583fc5f000e723f9ae508cf46 deleted: sha256:f5578f194936295078b78ff2ba8b14807da8b7df240627f3fb85be07bc69f74d deleted: sha256:1fb565177c22d167b2f0271608e7c2e5a5868e19b36d30fd707604b4f23f0505 deleted: sha256:a1e12e8d24f2e61e9c73c7c29c23b09130fb119cd9672df7f9a03602c0beac84 deleted: sha256:ea493968f3d604b29a929813490d123a8171f2f8a23c67047866b4ee81d4df0c deleted: sha256:285e528ab55c765304d41679ae7f9b69265bf954762f51b84379212d532ad6bd deleted: sha256:b11f4e5c2b7fd12935b558f1c6361def6545574703eda262ca1c812c9e60680c deleted: sha256:af0157c41f52fcf54e4ca265fb5e121b110b66309cebc8ebab09a44eeca21ad0 deleted: sha256:77a594b76fb550d04d4b5a8c2f82bfb7f3cd5b6ac14ac8ab7550de75eb9b86f1 deleted: sha256:1e11339a7869cee0f3b2dd099dd28e1f1f5f987a01639d3e5866efc1f3879cc5 deleted: sha256:dbfcd0b2c04a3ed04f4d99a2b1e65366b43421207230efb9fc30dac37c677fa8 Total reclaimed space: 177.4MB

Удалить все образы

Нужно сделать то же самое, но вместо rm выполнить rmi а вместо ps выполнить images

docker rmi $( docker images -q )

Форсированное удаление выполняется с помощью флага —force

docker rmi —force 8d788d646766

Docker совет №19: docker-compose stop или down?

Mar 29, 2018 07:28 · 135 words · 1 minute read docker docker-compose

Связку контейнеров, описанных в конфигурационном файле docker-compose.yml можно остановить с помощью команд stop или down , однако вторая команда делает гораздо больше, чем просто остановка контейнеров. Давайте разберемся!

Команда docker-compose stop остановит ваши запущенные docker-контейнеры, однако не удалит их. В отличии от нее, команда docker-compose down остановит запущенные docker-контейнеры и удалит их, а также все docker-сети (networks) созданные при запуске связки контейнеров из файла docker-compose.yml .

Можно даже продвинуться дальше — добавить аргумент -v ( —volumes ) при запуске команды для удаления созданных томов. Команда docker-compose down -v отлично подходит для поддержания вашей системы в чистоте и порядке.

C командой down и дополнительными параметрами можно сделать еще несколько полезных вещей — например, удалить docker-образы или контейнеры, которые больше не присутствуют в файле docker-compose.yml (orphans). Чтобы увидеть все доступные аргументы и варианты их использования достаточно запустить команду:

docker-compose down -help 

Как остановить Docker контейнеры

В этой статье по Docker обсуждаются способы остановки одного Docker-контейнера, нескольких Docker-контейнеров или всех запущенных Docker-контейнеров одновременно. Вы также научитесь грациозно останавливать Docker контейнер.

Чтобы остановить контейнер Docker, все, что вам нужно сделать, это использовать идентификатор контейнера или имя контейнера следующим образом:

docker stop container_ID_or_name

Вы также можете использовать команду docker container stop container_id_or_name, но это еще одно слово в команде, которое не дает никаких дополнительных преимуществ, поэтому придерживайтесь docker stop.

Но есть еще кое-что, что нужно знать об остановке Docker-контейнера, особенно если вы новичок в Docker.

Практические примеры остановки Docker-контейнера

В этой статье мы расскажем о различных аспектах остановки Docker-контейнера:

  • Остановка Docker-контейнера
  • Остановка нескольких Docker-контейнеров одновременно
  • Остановка всех Docker-контейнеров с определенным изображением
  • Остановка всех запущенных Docker-контейнеров сразу
  • Изящная остановка Docker контейнера

Прежде чем вы увидите это, вы должны знать, как получить имя контейнера или идентификатор.

Вы можете получить список всех запущенных контейнеров Docker с помощью команды docker ps. Без каких-либо опций команда docker ps показывает только запущенные контейнеры.

abhishek@linuxhandbook:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bcf775d8cc7 ubuntu "bash" 8 minutes ago Up About a minute container-2 94f92052f55f debian "bash" 10 minutes ago Up 10 minutes container-1

Вывод также дает вам имя контейнера и идентификатор контейнера. Вы можете использовать любой из этих двух, чтобы остановить контейнер.

Теперь давайте остановимся на контейнерах.

1. Остановка Docker контейнера

Чтобы остановить определенный контейнер, используйте его идентификатор или имя с командой docker stop:

docker stop container_name_or_ID

Вывод должен быть более описательным, но он просто показывает имя контейнера или идентификатор, какой бы вы ни указали:

abhishek@itsfoss:~$ docker stop 1bcf775d8cc7 1bcf775d8cc7

Вы можете использовать команду docker stop для уже остановленного контейнера. Он не будет выдавать никаких ошибок или другого выхода.

Читать 10 примеров команды wget

Вы можете проверить, остановлен ли контейнер, с помощью команды docker ps -a. Опция -a показывает все контейнеры, запущены они или остановлены.

abhishek@itsfoss:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bcf775d8cc7 ubuntu "bash" 19 minutes ago Exited (0) About a minute ago container-2 94f92052f55f debian "bash" 29 minutes ago Up 29 minutes container-1

Если статус «Выход», это означает, что контейнер больше не работает.

2. Остановка несколько Docker-контейнеров

Вы также можете остановить несколько Docker-контейнеров одновременно. Вы просто должны предоставить имена контейнеров и идентификаторы.

docker stop container_id_or_name_1 container_id_or_name_2 container_id_or_name_3

Как и ранее, вывод будет просто отображать имя или идентификатор контейнеров:

abhishek@itsfoss:~$ docker stop container-1 container-2 container-3 container-1 container-2 container-3

3. Остановка всех контейнеров, связанные с изображением

До сих пор вы видели, как останавливали контейнеры, явно указав их имя или идентификатор.

Что если вы хотите остановить все запущенные контейнеры определенного образа Docker? Представьте себе сценарий, в котором вы хотите удалить образ докера, но вам придется остановить все связанные запущенные контейнеры.

Вы можете предоставить имена контейнеров или идентификаторы один за другим, но это отнимает много времени. Что вы можете сделать, так это отфильтровать все работающие контейнеры на основе их базового образа.

Просто замените IMAGE_NAME именем вашего образа докера, и вы сможете остановить все запущенные контейнеры, связанные с этим образом.

docker ps -q --filter ancestor=IMAGE_NAME | xargs docker stop

Опция -q показывает только идентификатор контейнера. Благодаря замечательной команде xargs эти идентификаторы контейнера передаются в качестве аргумента до остановки докера.

4. Остановка всех работающих docker -контейнеров.

Вы можете столкнуться с ситуацией, когда вам необходимо остановить все работающие контейнеры.

Для этого вы можете использовать нечто похожее на то, что вы видели в предыдущем разделе. Просто удалите часть изображения.

docker ps -q | xargs docker stop

Читать Команда Timeout в Bash без ненужной задержки

5. Изящная остановка контейнера

Если честно, docker по умолчанию корректно останавливает контейнер. Когда вы используете команду docker stop, она дает контейнеру 10 секунд, прежде чем принудительно убить его.

Это не значит, что для остановки контейнера всегда требуется 10 секунд. Просто если в контейнере запущены некоторые процессы, у него есть 10 секунд, чтобы остановить процесс и выйти.

Команда остановки Docker сначала отправляет команду SIGTERM. Если конейнер останавливается в этот период, он отправляет команду SIGKILL.

Процесс может игнорировать SIGTERM, но SIGKILL немедленно завершит процесс.

Вы можете изменить этот льготный период в 10 секунд с помощью опции -t. Предположим, вы хотите подождать 30 секунд, прежде чем остановить контейнер:

docker stop -t 30 container_name_or_id

Мы думаем, что эта большая информация охватывает тему очень хорошо. Вы знаете много вещей об остановке контейнера докера.

Следите за новыми статьями по docker. Если у вас есть вопросы или предложения, пожалуйста, дайте нам знать в разделе комментариев.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *