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

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

Введение

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

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

Создание и запуск контейнера Docker

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

Понимание контейнеров Docker

Контейнеры Docker — это легковесные, автономные, исполняемые пакеты программного обеспечения, которые включают в себя все необходимое для запуска приложения: код, среду выполнения, системные инструменты, библиотеки и настройки. Они обеспечивают согласованные среды на разных этапах разработки.

Преимущества использования контейнеров Docker включают:

  • Согласованные среды выполнения
  • Изоляция от других приложений
  • Быстрое развертывание и масштабирование
  • Эффективное использование ресурсов

Проверка установки Docker

Давайте сначала проверим, что Docker правильно установлен в системе:

docker --version

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

Docker version 20.10.21, build baeda1f

Запуск вашего первого контейнера

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

Выполните следующую команду в вашем терминале:

docker run --name my-nginx -d -p 8080:80 nginx

Эта команда:

  • Создает контейнер с именем my-nginx
  • Запускает его в detached mode (-d), что означает, что он работает в фоновом режиме
  • Отображает порт 8080 хоста на порт 80 контейнера (-p 8080:80)
  • Использует официальный образ nginx из Docker Hub

Вы должны увидеть длинную строку символов, которая является ID контейнера:

a72369167c214c20247f786a47b6b0b8581b60324bd2d151a7a0db8ddb024959

Теперь давайте проверим, что контейнер запущен:

docker ps

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

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

Поздравляем! Вы успешно создали и запустили контейнер Docker. На следующем шаге мы рассмотрим, как более подробно проверить статус этого контейнера.

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

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

Использование команды docker ps

Команда docker ps — это самый фундаментальный способ просмотра запущенных контейнеров.

docker ps

Вывод должен выглядеть примерно так:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp   my-nginx

Эта команда показывает:

  • CONTAINER ID (ID контейнера): Уникальный идентификатор контейнера
  • IMAGE (Образ): Образ Docker, используемый для создания контейнера
  • COMMAND (Команда): Команда, выполняемая внутри контейнера
  • CREATED (Создан): Когда контейнер был создан
  • STATUS (Статус): Текущий статус контейнера
  • PORTS (Порты): Отображение портов между хостом и контейнером
  • NAMES (Имена): Присвоенное имя контейнера

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

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

docker ps -a

Это отобразит все контейнеры, независимо от их состояния:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    0.0.0.0:8080->80/tcp   my-nginx

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

Статус контейнера с форматированием

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

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

Это отобразит упрощенную таблицу только с именами контейнеров, статусом и портами:

NAMES       STATUS          PORTS
my-nginx    Up 7 minutes    0.0.0.0:8080->80/tcp

Остановка контейнера

Давайте остановим наш контейнер, чтобы увидеть, как изменится его статус:

docker stop my-nginx

Вывод:

my-nginx

Теперь снова проверьте статус:

docker ps

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

docker ps -a

Вывод:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 minutes ago   Exited (0) 10 seconds ago             my-nginx

Статус контейнера изменился на "Exited" (Вышел), что указывает на то, что он больше не запущен.

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

Давайте снова запустим контейнер:

docker start my-nginx

Вывод:

my-nginx

Проверьте статус, чтобы убедиться, что он запущен:

docker ps

Вывод:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 5 seconds    0.0.0.0:8080->80/tcp   my-nginx

Отлично! Теперь вы понимаете, как проверить базовый статус контейнеров Docker, используя команду docker ps, а также как останавливать и запускать контейнеры.

Расширенный мониторинг контейнеров

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

Подробная информация о контейнере с помощью docker inspect

Команда docker inspect предоставляет подробную информацию о конфигурации и времени выполнения контейнера:

docker inspect my-nginx

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

  • Настройки сети
  • Монтирование томов
  • Переменные окружения
  • Ограничения ресурсов
  • Состояние контейнера
  • И многое другое

Давайте рассмотрим конкретный раздел, используя опцию --format:

docker inspect --format='{{.State.Status}}' my-nginx

Вывод:

running

Вы можете извлечь другие конкретные части информации:

docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx

Это покажет внутренний IP-адрес контейнера.

Метрики контейнера в реальном времени с помощью docker stats

Команда docker stats предоставляет живой поток статистики использования ресурсов контейнера:

docker stats my-nginx

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

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
a72369167c21   my-nginx   0.00%     2.312MiB / 7.764GiB   0.03%     1.05kB / 1.51kB   0B / 4.1kB       2

Это показывает:

  • Процент использования CPU
  • Использование памяти
  • Сетевой ввод/вывод (NET I/O)
  • Блочный ввод/вывод (BLOCK I/O)
  • Количество процессов

Нажмите Ctrl+C, чтобы выйти из представления живой статистики.

Чтобы увидеть статистику для всех контейнеров одновременно:

docker stats --no-stream

Это показывает снимок статистики без непрерывных обновлений.

Просмотр журналов контейнера

Для устранения неполадок часто полезно проверить журналы контейнера:

docker logs my-nginx

Вы увидите журналы с сервера Nginx. Если вы обращались к веб-серверу, вы увидите журналы HTTP-запросов.

Чтобы отслеживать журналы в реальном времени (аналогично tail -f):

docker logs -f my-nginx

Нажмите Ctrl+C, чтобы выйти из потока журналов.

Проверка процессов контейнера

Чтобы увидеть процессы, запущенные внутри контейнера:

docker top my-nginx

Вывод будет выглядеть примерно так:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12345               12321               0                   14:15               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            12401               12345               0                   14:15               ?                   00:00:00            nginx: worker process

Это показывает все процессы, запущенные внутри контейнера, их PID и использование ресурсов.

Создание нового контейнера для сравнения

Давайте создадим еще один контейнер для сравнения с существующим:

docker run --name redis-server -d redis

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

docker stats --no-stream my-nginx redis-server

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

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

Управление жизненным циклом контейнера

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

Состояния жизненного цикла контейнера

Контейнер Docker может существовать в нескольких состояниях:

  • Created (Создан): Контейнер создан, но не запущен
  • Running (Запущен): Контейнер в данный момент запущен
  • Paused (Приостановлен): Выполнение контейнера приостановлено
  • Stopped (Остановлен): Контейнер остановлен, но все еще существует
  • Removed (Удален): Контейнер удален

Давайте рассмотрим, как переходить между этими состояниями.

Создание контейнера без его запуска

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

docker create --name test-container nginx

Это создает контейнер, но не запускает его. Проверьте его статус:

docker ps -a

Вы должны увидеть новый контейнер со статусом "Created" (Создан):

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   5 seconds ago    Created                                            test-container
a72369167c21   nginx     "/docker-entrypoint.…"   40 minutes ago   Up 30 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes               6379/tcp               redis-server

Запуск созданного контейнера

Чтобы запустить созданный контейнер:

docker start test-container

Убедитесь, что он запущен:

docker ps

Приостановка и возобновление контейнеров

Docker позволяет приостановить контейнер, что замораживает все процессы внутри него:

docker pause test-container

Проверьте его статус:

docker ps

Вывод:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 1 minute (Paused)                           test-container
a72369167c21   nginx     "/docker-entrypoint.…"   42 minutes ago   Up 32 minutes           0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes           6379/tcp               redis-server

Чтобы возобновить контейнер:

docker unpause test-container

Убедитесь, что он снова запущен:

docker ps

Остановка и перезапуск контейнеров

Чтобы корректно остановить контейнер (отправка SIGTERM, затем SIGKILL после периода ожидания):

docker stop test-container

Чтобы принудительно завершить контейнер (отправка SIGKILL):

docker start test-container ## Start it again first
docker kill test-container  ## Then kill it

Чтобы перезапустить контейнер (останавливает и снова запускает его):

docker start test-container ## Start it again first
docker restart test-container

Удаление контейнеров

Чтобы удалить остановленный контейнер:

docker stop test-container ## Make sure it's stopped first
docker rm test-container

Убедитесь, что он удален:

docker ps -a | grep test-container

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

Удаление запущенного контейнера

Вы можете принудительно удалить запущенный контейнер:

docker run --name temp-container -d nginx
docker rm -f temp-container

Политики перезапуска контейнера

Docker позволяет вам установить политики перезапуска для контейнеров:

docker run --name always-restart --restart always -d nginx

Этот контейнер будет перезапускаться автоматически, если он завершит работу или если Docker перезапустится.

Проверьте политику перезапуска:

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' always-restart

Вывод:

always

Давайте остановим и удалим этот контейнер:

docker rm -f always-restart

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

Устранение неполадок с контейнерами

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

Распространенные проблемы с контейнерами

Контейнеры могут выходить из строя по разным причинам:

  • Сбои приложений
  • Ограничения ресурсов
  • Проблемы с конфигурацией
  • Проблемы с сетью
  • Ошибки разрешений

Давайте рассмотрим, как выявлять и диагностировать эти проблемы.

Создание проблемного контейнера

Давайте создадим контейнер, который немедленно завершит работу из-за неверной команды:

docker run --name problematic -d nginx sleep 5

Этот контейнер запустит команду sleep 5, а затем завершит работу через 5 секунд.

Подождите несколько секунд, затем проверьте его статус:

docker ps -a

Вывод:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
1a2b3c4d5e6f   nginx     "sleep 5"                10 seconds ago   Exited (0) 5 seconds ago                           problematic
a72369167c21   nginx     "/docker-entrypoint.…"   1 hour ago       Up 50 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes               6379/tcp               redis-server

Контейнер завершил работу с кодом 0 (успех), но он больше не запущен.

Проверка кодов выхода контейнера

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

  • 0: Успех
  • Ненулевой: Произошла ошибка

Чтобы увидеть код выхода:

docker inspect problematic --format='{{.State.ExitCode}}'

Вывод:

0

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

Изучение журналов контейнера

Журналы имеют решающее значение для устранения неполадок:

docker logs problematic

В этом случае вы можете не увидеть никакого вывода, потому что наша команда sleep не создает журналы.

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

docker run --name crash-test -d nginx sh -c "echo 'Starting container'; sleep 2; echo 'About to crash'; exit 1"

Через несколько секунд проверьте его статус и журналы:

docker ps -a | grep crash-test

Вывод:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
f1e2d3c4b5a6   nginx     "sh -c 'echo 'Starti…"   10 seconds ago   Exited (1) 7 seconds ago              crash-test

Теперь проверьте журналы:

docker logs crash-test

Вывод:

Starting container
About to crash

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

Проверка использования ресурсов

Ограничения ресурсов могут привести к сбою контейнеров или низкой производительности:

docker stats --no-stream my-nginx

Это показывает использование CPU, памяти и ввода/вывода, что может помочь выявить узкие места по ресурсам.

Проверка конфигурации контейнера

Неправильная конфигурация является распространенным источником проблем:

docker inspect my-nginx

Ищите:

  • Монтирование томов
  • Переменные окружения
  • Настройки сети
  • Ограничения ресурсов

Доступ к запущенному контейнеру

Для отладки проблем внутри запущенного контейнера:

docker exec -it my-nginx bash

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

ls -la
ps aux
cat /etc/nginx/nginx.conf
exit ## To leave the container shell

Очистка

Давайте очистим наши проблемные контейнеры:

docker rm problematic crash-test

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

Резюме

В этой практической лабораторной работе вы приобрели необходимые навыки для мониторинга и управления контейнерами Docker:

  1. Создание и запуск контейнеров - Вы узнали, как создавать и запускать контейнеры Docker, используя команду docker run.

  2. Базовая проверка статуса - Вы освоили команду docker ps для вывода списка запущенных контейнеров и проверки их базовой информации о статусе.

  3. Расширенный мониторинг - Вы изучили передовые методы мониторинга, используя docker inspect и docker stats, чтобы получить подробную информацию о контейнерах и метрики производительности в реальном времени.

  4. Управление жизненным циклом контейнера - Вы узнали, как управлять полным жизненным циклом контейнера, включая создание, запуск, остановку, приостановку и удаление контейнеров.

  5. Устранение неполадок - Вы развили навыки диагностики и решения распространенных проблем с контейнерами, используя журналы, мониторинг ресурсов и прямой доступ к контейнерам.

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

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