Введение
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:
Создание и запуск контейнеров - Вы узнали, как создавать и запускать контейнеры Docker, используя команду
docker run.Базовая проверка статуса - Вы освоили команду
docker psдля вывода списка запущенных контейнеров и проверки их базовой информации о статусе.Расширенный мониторинг - Вы изучили передовые методы мониторинга, используя
docker inspectиdocker stats, чтобы получить подробную информацию о контейнерах и метрики производительности в реальном времени.Управление жизненным циклом контейнера - Вы узнали, как управлять полным жизненным циклом контейнера, включая создание, запуск, остановку, приостановку и удаление контейнеров.
Устранение неполадок - Вы развили навыки диагностики и решения распространенных проблем с контейнерами, используя журналы, мониторинг ресурсов и прямой доступ к контейнерам.
Эти навыки являются основополагающими для эффективной работы с контейнерами Docker в средах разработки, тестирования и производства. Теперь вы можете уверенно отслеживать работоспособность своих контейнеров, управлять их жизненным циклом и устранять возникающие проблемы.
Чтобы продолжить свой путь в Docker, рассмотрите возможность изучения таких тем, как Docker Compose для многоконтейнерных приложений, работа с сетями Docker и оркестрация контейнеров с помощью Kubernetes.



