«1. Обзор

Docker предоставляет различные параметры для отображения и фильтрации контейнеров в разных состояниях или даже параметры для настройки вывода списка.

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

2. Список контейнеров

Чтобы вывести список контейнеров Docker, мы можем использовать команду «docker ps» или «docker container ls». Эта команда предоставляет различные способы вывода списка и фильтрации всех контейнеров в определенном механизме Docker.

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

2.1. Псевдонимы

Начиная с Docker 1.13, команда Docker перегруппировала каждую команду, чтобы она располагалась под логическим объектом, с которым она взаимодействует. Например, чтобы получить список контейнеров Docker, в дополнение к «docker ps» мы можем использовать команду «docker container list» или даже «docker container ls».

Все эти три псевдонима поддерживают одну и ту же группу опций. Однако рекомендуется принять новый синтаксис.

2.2. Запуск контейнеров

Если мы используем команду «docker container ls» без параметров, она выведет список всех запущенных контейнеров:

$ docker container ls
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                NAMES
1addfea727b3        mysql:5.6            "docker-en.."   2 seconds ago       Up 1 second         0.0.0.0:32801->3306/tcp              dazzling_hellman
09c4105cb356        nats:2.1.0-scratch   "/nats-…"       17 minutes ago      Up 17 minutes       4222/tcp, 6222/tcp, 8222/tcp         nats-1
443fc0c41710        rabbitmq:3.7         "docker-…"      17 minutes ago      Up 17 minutes       4369/tcp, 5671-5672/tcp, 25672/tcp   rabbit-1
b06cfe3053e5        postgres:11          "docker-…"      29 minutes ago      Up 29 minutes       0.0.0.0:32789->5432/tcp              pg-2
4cf774b9e4a4        redis:5              "docker-…"      30 minutes ago      Up 30 minutes       0.0.0.0:32787->6379/tcp              redis-2

Как показано выше, у нас пока запущено пять контейнеров — Nats, RabbitMQ, PostgreSQL, MySQL и Redis.

По умолчанию выходные данные показывают несколько сведений о каждом запущенном контейнере:

    «ИДЕНТИФИКАТОР КОНТЕЙНЕРА» — это уникальный идентификатор контейнера. Этот идентификатор представляет собой усеченную версию довольно длинного хэша SHA-256. «IMAGE» — это имя образа контейнера и его тег, разделенные двоеточием, например postgres:11. «COMMAND» — это команда, отвечающая за запуск контейнера «CREATED». € показывает, когда контейнер был создан. «STATUS» показывает статус контейнера. Как упоминалось выше, все эти контейнеры работают. «ПОРТЫ» показывают сопоставление портов между хост-компьютером и внутри контейнера. Например, «0.0.0.0:32789-\u003e5432/tcp» означает, что порт 32789 на хосте сопоставляется с портом 5432 внутри контейнера. Кроме того, мы можем видеть, что мы не сопоставили ни одного порта для контейнера Nats — «4222/tcp, 6222/tcp, 8222/tcp» «NAMES» представляет удобочитаемое имя контейнера Docker, например as pg-2

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

2.3. Все контейнеры

По умолчанию команда «docker container ls» показывает только запущенные контейнеры. Однако, если мы передаем опцию -a или —all, будут перечислены все (остановленные и работающие) контейнеры:

$ docker container ls -a
CONTAINER ID        IMAGE                STATUS
1addfea727b3        mysql:5.6            Up 4 hours
32928d81a65f        mysql:5.6            Exited (1) 4 hours ago
09c4105cb356        nats:2.1.0-scratch   Up 4 hours
443fc0c41710        rabbitmq:3.7         Up 4 hours
b06cfe3053e5        postgres:11          Up 4 hours
16d3c67ebd40        postgres:11          Exited (0) 4 hours ago
4cf774b9e4a4        redis:5              Up 4 hours
99c537a3dd86        redis:5              Exited (0) 4 hours ago

Как показано выше, теперь у нас есть три контейнера, которые были остановлены несколько часов назад â — Redis, MySQL и PostgreSQL.

2.4. Последние контейнеры

Чтобы просмотреть последние n контейнеров Docker (как запущенных, так и остановленных), мы можем использовать параметр -n \u003cчисло\u003e или –last \u003cчисло\u003e:

$ docker container ls -n 2
CONTAINER ID        IMAGE               STATUS
1addfea727b3        mysql:5.6           Up 4 hours
32928d81a65f        mysql:5.6           Exited (1) 4 hours ago

Также можно просмотреть последний контейнер с помощью опции -l или —latest:

$ docker container ls --latest
CONTAINER ID        IMAGE               STATUS
1addfea727b3        mysql:5.6           Up 4 hours

Конечно, мы можем добиться того же самого с опцией -n 1.

2.5. Отключение усечения

По умолчанию Docker усекает выходные столбцы, если их значение превышает некоторый порог. На самом деле мы уже видели усеченные значения идентификатора контейнера.

Несмотря на то, что в большинстве случаев это полезная функция, мы можем отключить ее с помощью параметра –no-trunc:

$ docker container ls --latest --no-trunc
CONTAINER ID                                                       COMMAND
1addfea727b38f484a2e0023ed7f47dcb9bbfc6e053f094c349391bb38cb3af7   "docker-entrypoint.sh mysqld"

Как показано выше, выходные столбцы теперь стали намного более подробными.

2.6. Тихий режим

Также можно просто увидеть идентификатор контейнера. Для этого мы можем использовать опцию -q или —quiet:

$ docker container ls -q
1addfea727b3
09c4105cb356
443fc0c41710
b06cfe3053e5
4cf774b9e4a4

Мы можем смешивать и сопоставлять опции и видеть полные идентификаторы контейнера:

$ docker container ls --quiet --no-trunc
1addfea727b38f484a2e0023ed7f47dcb9bbfc6e053f094c349391bb38cb3af7
09c4105cb3567ba0070dacf7381b9946165908c819c0841cffaa1855766537c7
443fc0c41710ee3811e72fe5079bf4696b9318e0754c38eeab1c960f5c5a7007
b06cfe3053e521704c67a1902a7302665ae05f66ef592419f32b8c73b2a066fd
4cf774b9e4a487a2ba658de37273994161378cffe7e69fe5c928ad29e6946372

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

$ docker container rm -f $(docker container ls -aq)

Конечно, такие комбинации следует использовать с особой осторожностью.

2.7. Размер контейнера

Мы можем увидеть размер контейнера и его образа на диске с помощью опций -s или —size:

$ docker container ls --latest -s
CONTAINER ID        IMAGE               SIZE
1addfea727b3        mysql:5.6           2B (virtual 256MB)

«

«Первое значение (2B) представляет количество байтов, которые используются для доступного для записи уровня каждого контейнера. Второе значение — это размер образа на диске, который в данном случае составляет 256 МБ.

2.8. Настраиваемый вывод

$ docker container ls --format "{{.ID}} -> Based on {{.Image}}, named {{.Names}}, ({{.Status}})"
1addfea727b3 -> Based on mysql:5.6, named dazzling_hellman, (Up 3 hours)
09c4105cb356 -> Based on nats:2.1.0-scratch, named nats-1, (Up 4 hours)
443fc0c41710 -> Based on rabbitmq:3.7, named rabbit-1, (Up 4 hours)
b06cfe3053e5 -> Based on postgres:11, named pg-2, (Up 4 hours)
4cf774b9e4a4 -> Based on redis:5, named redis-2, (Up 4 hours)

Если нас не устраивает формат вывода по умолчанию, мы можем настроить вывод с помощью шаблонов Go. Все, что нам нужно сделать, это передать желаемый формат опции -format. Давайте посмотрим на быстрый пример этого в действии:

Здесь мы использовали то, что в основном представляет собой шаблонную строку в формате шаблона Go. Идентификатор, изображение, имена и статус являются заполнителями, а остальной текст отображается как есть.

$ docker container ls --format "table {{.ID}}\t{{.Image}}\t{{.Names}}"
CONTAINER ID        IMAGE                NAMES
1addfea727b3        mysql:5.6            dazzling_hellman
09c4105cb356        nats:2.1.0-scratch   nats-1
443fc0c41710        rabbitmq:3.7         rabbit-1
b06cfe3053e5        postgres:11          pg-2
4cf774b9e4a4        redis:5              redis-2

Кроме того, можно отображать столбцы в табличном формате. Нам просто нужно использовать префикс таблицы:

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

.ID — идентификатор контейнера .Image — имя изображения и tag .Command — команда, отвечающая за запуск этого контейнера .CreatedAt — время создания контейнера .Running — время, прошедшее с момента запуска контейнера .Ports — сопоставление портов .Status — контейнер статус выполнения .Size — размер контейнера и его образа на диске . Names — имя контейнера . Labels — все метки, присвоенные контейнеру . Mounts — тома для контейнера . Networks — все сетевые имена, прикрепленные к контейнеру

2.9. Расширенная фильтрация

До сих пор мы только фильтровали контейнеры на основе состояния работы или остановки. Как оказалось, «docker container ls» предлагает гораздо больше, чем эта рудиментарная фильтрация.

$ docker container ls --filter "status=exited"
CONTAINER ID        IMAGE               STATUS
32928d81a65f        mysql:5.6           Exited (1) 8 hours ago
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago
99c537a3dd86        redis:5             Exited (0) 9 hours ago

Чтобы отфильтровать контейнеры, мы можем использовать опцию -f или —filter. Например, здесь мы собираемся фильтровать контейнеры со статусом exited:

Как показано выше, мы должны передать критерии фильтрации в формате ключ=значение.

$ docker container ls --filter "status=exited" --filter "exited=1"
CONTAINER ID        IMAGE               STATUS
32928d81a65f        mysql:5.6           Exited (1) 8 hours ago

Если мы хотим применить несколько фильтров одновременно, мы должны передать несколько опций фильтра. Например, мы можем пойти еще дальше и оставить только завершенные контейнеры со статусом выхода, равным 1:

$ docker container pause redis-2

Как и следовало ожидать, только MySQL теперь соответствует критериям фильтра. Работает или останавливается — это не единственные состояния контейнера Docker. На самом деле, если мы, скажем, приостановим Docker-контейнер:

$ docker container ls --filter "status=paused"
CONTAINER ID        IMAGE               STATUS
4cf774b9e4a4        redis:5             Up 45 minutes (Paused)

Тогда мы сможем фильтровать все приостановленные контейнеры:

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

$ docker container ls -a --filter "name=pg"
CONTAINER ID        IMAGE               STATUS
b06cfe3053e5        postgres:11         Up 18 minutes
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago

Если мы знаем какую-то часть имени контейнера, мы можем найти ее:

$ docker container ls -a --filter "ancestor=postgres"
CONTAINER ID        IMAGE               STATUS
b06cfe3053e5        postgres:11         Up 28 minutes
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago

Мы также можем отфильтровать контейнеры на основе их базового образа:

Здесь мы только перечисляем контейнеры, основанные на образе postgres.

$ docker container ls --filter "before=nats-1"
CONTAINER ID        IMAGE               STATUS
443fc0c41710        rabbitmq:3.7        Up 52 minutes
b06cfe3053e5        postgres:11         Up 52 minutes
4cf774b9e4a4        redis:5             Up 52 minutes (Paused)

Можно даже фильтровать контейнеры по времени их создания. Например, здесь мы собираемся сохранить только те контейнеры, которые были созданы до контейнера Nats:

$ docker container ls --filter "since=nats-1"
CONTAINER ID        IMAGE               STATUS
2fdc65a6effb        mysql:5.6           Exited (137) 4 days ago
1addfea727b3        postgres:11         Exited (0) 3 days ago

С другой стороны, мы можем перечислить все контейнеры Docker, созданные после контейнера Nats, используя фильтр с тех пор: ~ ~~

3. Заключение

В этом руководстве мы увидели, как отображать и фильтровать контейнеры Docker с помощью команды «docker container ls» и ее полезных параметров.