Предисловие
В этой статье пойдет речь о том, как останавливать, удалять контейнеры и ограничивать ресурсы на контейнерах.
Остановить и удалить контейнеры
🍑 Остановить контейнер
Во время работы иногда может потребоваться приостановить работу контейнера, например, чтобы сделать снимок файловой системы контейнера. Контейнеры можно приостанавливать и активировать с помощью команд docker-pause и docker unpause, при этом приостановленный контейнер не будет занимать ресурсы ЦП хоста.
Когда бизнес больше не нужен, контейнер необходимо закрыть. В этом случае можно использовать команду остановки докера. Если вы столкнулись с особыми обстоятельствами и не можете закрыть контейнер, вы также можете использовать команду docker kill для принудительного закрытия контейнера. Пример кода выглядит следующим образом:
В приведенном выше примере используется команда docker kill для принудительного завершения работы контейнера.
Предприятия обычно имеют большое количество контейнеров, которые необходимо эксплуатировать, и эксплуатация каждого из них потребует больших затрат рабочей силы и времени. В этом случае вы можете комбинировать команды Docker с регулярными выражениями для реализации пакетных операций с контейнерами.
Сначала проверьте идентификационный номер работающего контейнера. Пример кода выглядит следующим образом:
Затем используйте регулярные выражения, чтобы закрыть работающий контейнер на основе идентификационного номера работающего контейнера. Пример кода выглядит следующим образом:
В приведенном выше примере используется команда остановки Docker и регулярные выражения для пакетного завершения запуска контейнеров. Есть еще один способ написания этой команды. Пример кода выглядит следующим образом:
Кроме того, аналогичные методы можно использовать для пакетного удаления и запуска контейнеров.
Разница между остановкой докера и уничтожением докера заключается в следующем👇
🍑 Удалить контейнер
Контейнеры популярны из-за своего легкого веса. Обычно некоторые контейнеры выходят из строя вскоре после использования. Длительное накопление приводит к ненужной трате ресурсов, поэтому ненужные контейнеры следует своевременно убирать.
и docker rmi разные команды,docker rm Команда используется для удаления контейнера. Ниже будут представлены несколько способов удаления контейнера.
🍇Удалить контейнер, метод 1
Сначала просмотрите все контейнеры и их статус. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, в настоящее время на хосте находятся три контейнера в завершенном состоянии и один контейнер в рабочем состоянии.
Затем в сочетании с обычным и docker rm Команда выводит список контейнеров в завершенном состоянии и удаляет их. Пример кода выглядит следующим образом:
В приведенном выше примере используется команда docker rm в сочетании с регулярными выражениями для пакетного удаления контейнеров и вывода идентификаторов удаленных контейнеров.
Наконец, проверьте и подтвердите, что контейнер был удален. Пример кода выглядит следующим образом:
Как видно из примера, контейнер в завершенном состоянии был удален, но контейнер в рабочем состоянии не удален.
🍇 Способ 2 удаления контейнеров
Сначала просмотрите все контейнеры и их статус. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, три контейнера находятся в завершенном состоянии и один контейнер в рабочем состоянии.
Затем используйте команду docker rm в сочетании с регулярными выражениями, чтобы вывести список всех идентификаторов контейнера и удалить контейнер. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, во время выполнения команды произошла ошибка, указывающая на невозможность удаления работающего контейнера. Для принудительного выполнения можно использовать параметр -f.
Затем проверьте текущий статус контейнера. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера,docker rm Команда в сочетании с регулярными выражениями удалила три контейнера в статусе «завершено», но работающие контейнеры не были удалены.
Наконец, добавьте -f Параметр, указывающий на принудительное удаление. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, работающий контейнер был удален.
🍇 Способ 3 удаления контейнеров
Сначала просмотрите текущий контейнер и его статус. Пример кода выглядит следующим образом:
Затем используйте команду docker rm в сочетании с docker ps -q -f status=exited, чтобы отфильтровать идентификационный номер контейнера в завершенном состоянии и удалить контейнер. Пример кода выглядит следующим образом:
В приведенном выше примере команда выполнена успешно.
Наконец, проверьте, был ли удален контейнер. Пример кода выглядит следующим образом.
Как вы можете видеть в приведенном выше примере, контейнеры в завершенном состоянии были удалены.
🍇 Способ 4 удаления контейнеров
Начиная с версии Docker 1.13, пользователи могут использовать команду сокращения контейнера docker для удаления контейнеров в прекращенном состоянии.
Сначала просмотрите текущий контейнер и его статус. Пример кода выглядит следующим образом:
Затем используйте команду, чтобы начать удаление всех контейнеров в завершенном состоянии. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, когда docker container prune После выполнения команды система выдаст пользователю предупреждающее сообщение и спросит, хотят ли они продолжить.
docker container prune Сразу удалю все в прекращенном состоянии изконтейнер,для Для предотвращения неправильной работы пользователей,Удалить полезный изконтейнер,При выполнении команды будет отображаться предупреждающая информация и информация запроса.
В настоящее время, если вы подтвердите удаление, вы можете ввести “y” , в противном случае введите “n” для предотвращения выполнения команды. В примере удаляются все контейнеры в завершенном состоянии и возвращается значение, которое освобождает память после успешного выполнения команды.
Наконец, просмотрите текущий контейнер и его статус. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, контейнер в завершенном состоянии был удален, но контейнер в рабочем состоянии не был затронут.
Ограничения ресурсов контейнера
существуют по умолчанию,Docker Контейнеры не имеют ограничений по аппаратным ресурсам. использовать Dcoker При запуске контейнеров на одном хосте могут работать сотни или тысячи контейнеров. Хотя эти контейнеры изолированы друг от друга, они используют одну и ту же основу. Процессор, память и диск и другие ресурсы.
Если ресурсы, используемые контейнером, не ограничены, потребление контейнером ресурсов хоста может привести к тому, что другие контейнеры или процессы не смогут нормально работать, а в серьезных случаях служба может быть полностью недоступна.
В этом разделе рассказывается, как настроить ограничения ресурсов для контейнеров, таких как ЦП, память и блок ввода-вывода.
🍑 Ограничить ресурсы памяти контейнера
На сервере Linux, если ядро обнаруживает, что памяти (Память) недостаточно для выполнения важных системных функций, ядро выдает сообщение OOME (Ошибка нехватки памяти, переполнение памяти) и начинает завершать процесс для освобождения памяти. называется операцией ООМ.
Любой процесс можно убить, включая Docker и другие важные приложения. Если критические системные процессы завершаются, вся система может быть парализована.
Хотя установка ограниченного лимита памяти может защитить хост, она также может привести к плохой работе служб в контейнере. Если лимит памяти, установленный для службы, слишком мал, при нормальной работе службы могут не хватить ресурсов;
Если установлено слишком большое значение, память будет расходоваться алгоритмом планировщика. Поэтому разумно следовать следующим принципам.
Ниже представлены параметры ограничения памяти в параметрах запуска Docker.
Установите максимальный объем памяти, который может использовать контейнер. Минимальное значение — 4 МБ.
Установите максимальное значение памяти + Swap, которое может использовать контейнер.
По умолчанию,Пользователь может настроить значение от 0~100из.,Представляет допустимое соотношение замены раздела подкачки Памяти.
Установите мягкое ограничение (необязательное ограничение) на использование памяти. Если Docker обнаружит, что на хосте недостаточно памяти, он выполнит операцию OOM. Это значение должно быть меньше значения, установленного параметром –memory.
Размер памяти ядра, которую может использовать контейнер. Минимальное значение — 4 МБ.
Установите, следует ли завершать процесс контейнера при запуске OOM.
Хост будет случайным образом завершать некоторые процессы при нехватке памяти, и этот параметр защитит процесс контейнера от завершения. Этот параметр можно использовать только путем установки параметра -memory для ограничения памяти контейнера, в противном случае контейнер исчерпает память хоста и приведет к завершению хост-приложения.
❗Примечание: --memory-swap имеет смысл только тогда, когда установлена -memory.
Использование Swap позволяет контейнеру использовать всю доступную из Память и записывать избыточные требования к из Память на диск. Связь между ними показана в таблице.
Значения по умолчанию для двух вышеуказанных параметров: -1,Верноконтейнериспользовать Память и Swap Нет предела.
подиспользовать progrium/stress Зеркало, чтобы показать, как форконтейнер распространяет Память, какой контейнер можно смоделировать для стресс-тестирования. Пример кода выглядит следующим образом:
В приведенном выше примере выполняетсяконтейнер,Выделить доступный максимум Памятьдля 300 МБ, доступно Swap для 100MB。
Среди них параметр –vm 1 указывает на запуск рабочего потока Память
–vm-bytes 280M Параметр представляет распределение для каждого потока. 280MB Память。
Вы можете видеть, что система постоянно выделяет Память и отправляет Память в контейнер.,Цикл продолжается. Потому что использовать Из Память 380МБ, в пределах максимального существованияиспользовать (400МБ), контейнер работает нормально.
Следующий пример проверяет ситуацию, когда Памятьиспользовать превышает лимит. Пример кода выглядит следующим образом:
Как видно из приведенного выше примера, Квота была превышена, и процесс был прекращен. 9 Это сигнал к завершению процесса и, наконец, выход контейнера.
Если при создании контейнера указан только параметр -m и параметр -memory-swap не установлен, то значение -memory-swap по умолчанию равно удвоенному значению -m. Пример кода выглядит следующим образом:
существовать В приведенном выше примере,контейнербольшинствоиспользовать 100MB Памятьи 100MB Swap。
🍑 Ограничить ресурсы процессора контейнера
Процесс на хосте будет использовать механизм разделения временииспользовать CPU。CPU Количественно определяется частотой, то есть количеством операций, выполняемых в секунду. лимит дляконтейнера CPU Ресурсы — это не изменения CPU из частоты, но изменить каждый контейнер можноиспользоватьиз CPU срез времени.
В идеале ЦП должен все время находиться в вычислительном состоянии, и вычислительная нагрузка процесса не будет превышать вычислительные возможности ЦП.
Docker Разрешить пользователю один номер для каждой настройки контейнера, который представляет собой контейнеризацию. CPU доля, по контейнеру по умолчанию share значение 1000. этот share Значение относительно из и само по себе не представляет какого-либо определенного значения. Когда на хосте работает несколько контейнеров, каждый контейнер занимает CPU соотношение времени для итиз share Стоимость как доля от общей суммы.
Например, на хосте есть две машины, которые были CPU изконтейнер (для простоты понимания, независимо от других процессов, запущенных на хосте), и его CPU share Вседля 1000,затем два контейнера CPU использовать Ставка Вседа 50%;
Если вы поставите один из контейнеров share ценитьнастраиватьдля 500,то оба CPU изиспользовать Сравниватьдля 2:1 при удалении; share ценитьдля 1000 контейнер, оставшийся контейнер CPU использовать скорость будет 100%。
Docker дляконтейнернастраивать CPU Параметры ограничения ресурсов: -c или –cpu-shares, которое является целым числом. запустить два контейнера test01 и test02 и установите CPU Вес, пример кода следующий:
В приведенном выше примересоответственнодля test01 и test02 настраивать CPU share для 1000 и 2000。
затем,использовать docker stats Посмотреть заполняемость контейнера CPU В этом случае пример кода выглядит следующим образом:
Как видно из приведенного выше примера, два контейнера CPU изиспользоватьзанимать Сравниватьодля 2:1,иранеенастраиватьиз share Значения совпадают.
В это время это будет share ценитьдля 2000 из test02 Контейнер приостановлен, проверьте еще раз CPU использовать В этом случае пример кода выглядит следующим образом:
настраивать CPU Ограничения ресурсов — это нормальноиспользовать –cpuset-cpus Параметр, он может указывать определенную звезду CPU。здесьиспользовать CPU тестовое изображение agileek/cpuset-test При тестировании его функция заключается в CPU При заполнении пример кода выглядит следующим образом:
использовать Хозяин top Представление команд CPU использовать ситуацию, вы можете видеть CPU1 уже занят, и CPU0 Это не влияет, как показано на рисунке:
🍑 Ограничить контейнер Блокировать IO
Block IO Представляет дискиз чтения и записи, Docker Можно настроить с помощью бит/с (чтение и запись данных в секунду) iops (чтение и запись в секунду) режим Ограничить Контейнер по сравнению с диском. Чтение и запись с использованием пропускной способности.
Далее вводятся ограничения bps и iops изпараметр。
Ограничить чтение определенным устройством в бит/с.
Ограничить запись на определенное устройство в бит/с.
Ограничить чтение iops определенного устройства.
Ограничить запись на определенное устройство в iops.
По умолчанию,Чтение и запись всех дисков пары контейнеров по полосе пропускания одинакова.,через конфигурацию -blkio-weight Параметр из значения (10-1000) может быть указан в контейнере Block IO из Приоритет. –bkio-вес и -cpu-shares Аналогично, значения по умолчанию: 500。
Беги под двумя контейнерами test01 и test02, среди которых test01 Пропускная способность чтения и записи дисков есть. test02 дважды.
Как видно из приведенного выше примера, контейнер test01 относительное значение веса 800, в то время как test02 относительное значение веса 400, так что test01 Пропускная способность чтения и записи дисков есть. test02 дважды.
Запустите контейнер ниже и ограничьте его использование /dev/sda Скорость записи не выше 20 МБ/с. Поскольку файловая система дляконтейнера существует на хосте /dev/sda На компьютере запись файлов в существующемконтейнере эквивалентна записи файлов на хост-машину. /dev/sda Выполните операцию записи.
Пример кода выглядит следующим образом:
В приведенном выше примере выполняется CentOS контейнер и ограничить его запись /dev/sda изставкадля 20MB/s。
подпроходить Представление команд Долженконтейнеризписатьставка,Пример кода выглядит следующим образом:
от Как видно из приведенного выше примера, настройки имеют лимит записи изконтейнер, а скорость записи равна 19,4 МБ/с, лимит записи не превышен. 20MB/s。
Сравнить для,Следующее запускает программу, которая не ограничивает скорость записи изконтейнера,Пример кода выглядит следующим образом:
В приведенном выше примере,Неограниченная скорость чтения и записи изконтейнер,Скорость записи составляет 61,3 МБ/с.
Остальные параметры и методы аналогичны, можете попробовать сами🤗.
Подвести итог
Эти две статьи объясняют работу с помощью большого количества экспериментов. Docker методы контейнеризации, включая Enter, Stop, Удалить контейнер и т. д., а также способы преобразования между различными состояниями контейнера;
Наконец представили Docker контейнериз Ограничения ресурсов, в том числе предел Память、CPU、BLOCK IO Три метода.
- END -