Как фильтровать контейнеры Docker по имени

DockerBeginner
Практиковаться сейчас

Введение

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

Просмотр контейнеров Docker с помощью docker ps

Прежде чем мы сможем фильтровать контейнеры Docker, нам сначала нужно понять, как просматривать контейнеры, которые запущены в нашей системе. Самая основная команда для этой цели — docker ps.

Понимание команды docker ps

Команда docker ps выводит список всех запущенных контейнеров Docker в вашей системе. Когда вы запускаете эту команду, вы увидите информацию о каждом контейнере, включая:

  • Container ID (ID контейнера): Уникальный идентификатор контейнера
  • Image (Образ): Образ Docker, используемый для создания контейнера
  • Command (Команда): Команда, которая выполняется внутри контейнера
  • Created (Создан): Когда был создан контейнер
  • Status (Статус): Текущий статус контейнера
  • Ports (Порты): Любые сопоставления портов
  • Names (Имена): Имя контейнера

Давайте запустим команду docker ps, чтобы увидеть все запущенные контейнеры:

docker ps

Вы должны увидеть вывод, похожий на этот:

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
54a76e95d987   alpine    "sleep 1000"             About a minute ago   Up About a minute             db-server
26f8c661f7a5   alpine    "sleep 1000"             About a minute ago   Up About a minute             utility-alpine
a3bb567cc561   redis     "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp  cache-server
f1d07c98e753   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web-frontend

Просмотр всех контейнеров

По умолчанию docker ps показывает только запущенные контейнеры. Чтобы увидеть все контейнеры, включая те, которые были остановлены, используйте флаг -a:

docker ps -a

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

Просмотр только ID контейнеров

Если вам нужны только ID контейнеров, вы можете использовать флаг -q:

docker ps -q

Это выводит только ID контейнеров, что может быть полезно, когда вам нужно передать их другим командам.

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

Базовая фильтрация контейнеров по имени

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

Использование опции --filter

Команда docker ps поддерживает фильтрацию с помощью опции --filter или -f. Основной синтаксис для фильтрации по имени:

docker ps --filter name=<container-name>

Давайте попробуем отфильтровать контейнеры, в имени которых есть "web":

docker ps --filter name=web

Вы должны увидеть вывод, похожий на этот:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   80/tcp    web-frontend

Обратите внимание, что отображаются оба контейнера web-frontend и web-backend, поскольку в их именах есть слово "web".

Фильтрация по точным именам

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

docker ps --filter name=web-frontend

Эта команда покажет только контейнер с именем "web-frontend":

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
d6fe891c1f04   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 12 minutes   80/tcp    web-frontend

Использование нескольких фильтров

Вы можете применить несколько фильтров, добавив несколько опций --filter. Например, чтобы найти все контейнеры с "web" в имени И построенные из образа "nginx":

docker ps --filter name=web --filter ancestor=nginx

Результат должен быть таким же, как и при нашей первой фильтрации, поскольку оба контейнера "web" используют образ nginx:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   80/tcp    web-frontend

Фильтрация контейнеров по началу имени

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

docker ps --filter name=^db

Эта команда покажет контейнеры, имена которых начинаются с "db":

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
54a76e95d987   alpine    "sleep 1000"  16 minutes ago   Up 16 minutes             db-server

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

Расширенная фильтрация и форматирование вывода

Теперь, когда мы освоили базовую фильтрацию по имени, давайте рассмотрим некоторые более продвинутые методы фильтрации и форматирования вывода команды docker ps. Эти навыки помогут вам более эффективно управлять вашей средой Docker.

Комбинирование нескольких критериев фильтрации

Docker позволяет комбинировать несколько критериев фильтрации, чтобы сузить результаты. Например, чтобы найти все контейнеры с "web" в имени, которые в настоящее время запущены:

docker ps --filter name=web --filter status=running

Это отобразит все запущенные контейнеры, в имени которых есть "web":

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   25 minutes ago   Up 25 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   25 minutes ago   Up 25 minutes   80/tcp    web-frontend

Использование опции --format для пользовательского вывода

Команда docker ps поддерживает пользовательское форматирование вывода с использованием опции --format с шаблонами Go. Это позволяет отображать только необходимую информацию в нужном формате.

Например, чтобы отобразить только имена контейнеров и их статус:

docker ps --format "table {{.Names}}\t{{.Status}}"

Вы увидите упрощенный вывод, подобный этому:

NAMES               STATUS
db-server           Up 26 minutes
utility-alpine      Up 26 minutes
cache-server        Up 26 minutes
web-backend         Up 26 minutes
web-frontend        Up 26 minutes

Комбинирование фильтрации и форматирования

Вы можете комбинировать фильтрацию и форматирование, чтобы получить именно ту информацию, которая вам нужна:

docker ps --filter name=web --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"

Это отобразит таблицу с именами, образами и статусом для контейнеров с "web" в имени:

NAMES               IMAGE               STATUS
web-backend         nginx               Up 27 minutes
web-frontend        nginx               Up 27 minutes

Использование фильтрации, подобной регулярным выражениям

Система фильтрации Docker поддерживает некоторые шаблоны, подобные регулярным выражениям. Например, чтобы найти контейнеры, имена которых содержат либо "web", ЛИБО "cache":

docker ps --filter name=web --filter name=cache

Это отобразит как web-контейнеры, так и cache-контейнеры:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a3bb567cc561   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes   6379/tcp   cache-server
f1d07c98e753   nginx     "/docker-entrypoint.…"   30 minutes ago   Up 30 minutes   80/tcp     web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   30 minutes ago   Up 30 minutes   80/tcp     web-frontend

Практический пример: Скрипт управления контейнерами

Давайте создадим простой скрипт, который демонстрирует, как фильтрацию можно использовать в практическом сценарии. Создайте новый файл с именем container-stats.sh со следующим содержимым:

nano container-stats.sh

Добавьте следующий скрипт:

#!/bin/bash
## This script displays container names, images and status for a filtered set of containers

echo "Web containers:"
docker ps --filter name=web --format "{{.Names}} - {{.Image}} - {{.Status}}"

echo -e "\nCache and database containers:"
docker ps --filter name=cache --filter name=db --format "{{.Names}} - {{.Image}} - {{.Status}}"

Сохраните файл (Ctrl+O, Enter, затем Ctrl+X) и сделайте его исполняемым:

chmod +x container-stats.sh

Теперь запустите скрипт, чтобы увидеть отфильтрованную и отформатированную информацию о контейнерах:

./container-stats.sh

Вы должны увидеть вывод, похожий на:

Web containers:
web-backend - nginx - Up 35 minutes
web-frontend - nginx - Up 35 minutes

Cache and database containers:
cache-server - redis - Up 35 minutes
db-server - alpine - Up 35 minutes

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

Практическое применение фильтрации контейнеров

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

Поиск и перезапуск конкретных контейнеров

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

## Сначала идентифицируйте web-контейнеры
docker ps --filter name=web

## Теперь перезапустите их по одному
docker restart web-frontend
docker restart web-backend

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

web-frontend
web-backend

Поиск и удаление всех контейнеров с определенным шаблоном имени

Если вам нужно удалить все контейнеры с определенным шаблоном имени, вы можете объединить фильтрацию с удалением контейнеров:

## ВНИМАНИЕ: Это только для демонстрации. В реальной среде,
## убедитесь, что вы знаете, что удаляете!

## Вывести список контейнеров с "utility" в их именах
docker ps -a --filter name=utility

Вы должны увидеть свой utility-контейнер:

CONTAINER ID   IMAGE     COMMAND         CREATED          STATUS          PORTS     NAMES
26f8c661f7a5   alpine    "sleep 1000"    45 minutes ago   Up 45 minutes             utility-alpine

Чтобы удалить его, вы обычно используете:

## Мы на самом деле не будем запускать эту команду, чтобы сохранить нашу лабораторную среду
## docker rm -f $(docker ps -aq --filter name=utility)

Вместо этого давайте посмотрим, как работает эта команда:

## Просто получить идентификаторы, которые будут затронуты
docker ps -aq --filter name=utility

Это выведет идентификатор контейнера:

26f8c661f7a5

Использование фильтрации для мониторинга конкретных групп контейнеров

Фильтрация контейнеров полезна для целевого мониторинга. Давайте создадим простой скрипт мониторинга, который проверяет статус наших web-контейнеров:

nano web-monitor.sh

Добавьте следующий скрипт:

#!/bin/bash
## This script checks the status of web containers and reports if any are not running

echo "=== Web Container Status Check ==="
docker ps -a --filter name=web --format "{{.Names}}: {{.Status}}"

## Count stopped web containers
STOPPED=$(docker ps -a --filter name=web --filter status=exited --format "{{.Names}}" | wc -l)

if [ $STOPPED -gt 0 ]; then
  echo -e "\nWARNING: $STOPPED web containers are not running!"
else
  echo -e "\nAll web containers are running normally."
fi

Сохраните файл (Ctrl+O, Enter, затем Ctrl+X) и сделайте его исполняемым:

chmod +x web-monitor.sh

Теперь запустите скрипт, чтобы увидеть статус ваших web-контейнеров:

./web-monitor.sh

Вы должны увидеть вывод, похожий на:

=== Web Container Status Check ===
web-backend: Up 50 minutes
web-frontend: Up 50 minutes

All web containers are running normally.

Фильтрация в CI/CD-конвейерах

В CI/CD-конвейерах фильтрация контейнеров может быть важна для автоматизированного тестирования и развертывания. Давайте создадим скрипт, который имитирует процесс развертывания, который нацелен только на контейнеры с определенным шаблоном имени:

nano deploy-update.sh

Добавьте следующий скрипт:

#!/bin/bash
## This script simulates updating all containers of a specific type

TARGET_CONTAINERS=$1

if [ -z "$TARGET_CONTAINERS" ]; then
  echo "Usage: $0 <container-name-pattern>"
  exit 1
fi

echo "Preparing to update containers matching pattern: $TARGET_CONTAINERS"
echo "Containers affected:"
docker ps --filter name=$TARGET_CONTAINERS --format "{{.Names}}"

echo -e "\nIn a real deployment, this would:"
echo "1. Pull the latest images"
echo "2. Stop each container"
echo "3. Start new containers with the updated images"
echo "4. Verify the containers are running correctly"

echo -e "\nSimulation completed successfully!"

Сохраните файл (Ctrl+O, Enter, затем Ctrl+X) и сделайте его исполняемым:

chmod +x deploy-update.sh

Теперь давайте смоделируем обновление наших web-контейнеров:

./deploy-update.sh web

Вы должны увидеть вывод, похожий на:

Preparing to update containers matching pattern: web
Containers affected:
web-backend
web-frontend

In a real deployment, this would:
1. Pull the latest images
2. Stop each container
3. Start new containers with the updated images
4. Verify the containers are running correctly

Simulation completed successfully!

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

Резюме

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

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

  2. Базовая фильтрация по имени: Вы узнали, как использовать опцию --filter name= для поиска контейнеров по имени, как точных совпадений, так и частичных совпадений.

  3. Расширенная фильтрация и форматирование: Вы изучили, как комбинировать несколько фильтров и настраивать вывод с помощью опции --format, чтобы отображать только необходимую информацию.

  4. Практическое применение: Вы создали скрипты, демонстрирующие реальное использование фильтрации контейнеров для мониторинга, управления и задач развертывания.

Эти навыки помогут вам более эффективно управлять средами Docker, особенно по мере роста количества контейнеров. Фильтрация контейнеров особенно ценна в средах разработки, тестирования и производства, где вам необходимо быстро идентифицировать и управлять конкретными контейнерами.

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