Обработка логов и мониторинг контейнеров с помощью встроенных средств Docker.

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

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

1. Запуск контейнера с настройками логирования

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

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

[root@waky ~]# docker run -d --name nginx_container -p 8080:80 --log-driver=json-file --log-opt max-size=5m --log-opt max-file=3 nginx
3baf6832bbf0df5075dea34fc82a2268d552e96b1df192d8e1dc88e748e9178e
[root@waky ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
3baf6832bbf0   nginx     "/docker-entrypoint.…"   18 seconds ago   Up 17 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   nginx_container
[root@waky ~]#

Использованные параметры запуска:

-d — запуск в фоновом режиме
–name nginx_container — имя контейнера
-p 8080:80 — проброс порта для доступа к nginx
–log-driver=json-file — используем стандартный драйвер логов Docker
–log-opt max-size=5m — размер файла логов не более 5 Mb
–log-opt max-file=3 — хранить не более 3 файлов логов, старые перезаписываются

2. Просмотр логов контейнера

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

[root@waky ~]# docker logs nginx_container
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/11/04 04:12:45 [notice] 1#1: using the "epoll" event method
2025/11/04 04:12:45 [notice] 1#1: nginx/1.29.2
2025/11/04 04:12:45 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2025/11/04 04:12:45 [notice] 1#1: OS: Linux 5.14.0-592.el9.x86_64
2025/11/04 04:12:45 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2025/11/04 04:12:45 [notice] 1#1: start worker processes
2025/11/04 04:12:45 [notice] 1#1: start worker process 29
[root@waky ~]#

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

 Давайте, с помощью curl, сделаем пару обращений к веб серверу, работающему в контейнере, и проверим, что попадет в логи контейнера. Вывод логов ограничим с командой tail:

[root@waky ~]# curl --silent 'localhost:8080/' > /dev/null
[root@waky ~]# curl --silent 'localhost:8080/not_exist/' > /dev/null
[root@waky ~]# docker logs nginx_container | tail -n 2
2025/11/04 04:12:45 [notice] 1#1: using the "epoll" event method
2025/11/04 04:12:45 [notice] 1#1: nginx/1.29.2
2025/11/04 04:12:45 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2025/11/04 04:12:45 [notice] 1#1: OS: Linux 5.14.0-592.el9.x86_64
2025/11/04 04:12:45 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2025/11/04 04:12:45 [notice] 1#1: start worker processes
2025/11/04 04:12:45 [notice] 1#1: start worker process 29
2025/11/04 04:25:50 [error] 29#29: *5 "/usr/share/nginx/html/not_exist/index.html" is not found (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /not_exist/ HTTP/1.1", host: "localhost:8080"
172.17.0.1 - - [04/Nov/2025:04:25:34 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
172.17.0.1 - - [04/Nov/2025:04:25:50 +0000] "GET /not_exist/ HTTP/1.1" 404 153 "-" "curl/7.76.1" "-"
[root@waky ~]#

Видим, наши два запроса попали в access логи nginx, а так же залогирована ошибка отсутствия файла, так как мы обратились по заведомо неработающей ссылке /not_exist/.

Если нужно следить за новыми записями в логах в режиме реального времени, используйте -f (подобно tail -f):

[root@waky ~]# docker logs -f nginx_container

3. Пример анализа логов

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

Допустим, вы хотите узнать, были ли обращения к несуществующим страницам:

[root@waky ~]# docker logs nginx_container | grep "GET" | grep " 404 "
172.17.0.1 - - [04/Nov/2025:04:25:50 +0000] "GET /not_exist/ HTTP/1.1" 404 153 "-" "curl/7.76.1" "-"
[root@waky ~]# 

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

4. Мониторинг использования ресурсов контейнером

Для оценки загрузки контейнера nginx используйте команду stats:

[root@waky ~]# docker stats nginx_container

Она покажет в реальном времени CPU, память, сетевой трафик и диск I/O. Например:

CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
3baf6832bbf0   nginx_container   0.00%     14.85MiB / 1.667GiB   0.87%     4.54kB / 5.72kB   27.4MB / 16.4kB   2 

Это помогает понять, насколько загружен сервер nginx.

5. Получение внутренней информации о контейнере

Команда inspect даёт подробное описание конфигурации и состояния контейнера:

[root@waky ~]# docker inspect nginx_container
[
    {
        "Id": "3baf6832bbf0df5075dea34fc82a2268d552e96b1df192d8e1dc88e748e9178e",
        "Created": "2025-11-04T04:12:44.141800564Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running", 
…
[root@waky ~]#

Анализируя вывод, можно узнать IP-адрес, порты, переменные окружения и другие настройки.

Заключение

Используя встроенные средства Docker, вы можете:

  • Просматривать логи прямо командой docker logs
  • Настраивать ограничения по размеру лог-файлов
  • Следить за нагрузкой с помощью docker stats
  • Получать подробную информацию командой docker inspect

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

Знание этих инструментов и умение их применять, важно для любого администратора.