Анализ журнала контейнера Docker

Docker

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

использовать сначалаdocker run -it --rm -d -p 80:80 nginx:1.15.8-alpineКоманда для запуска контейнера nginx. Если исключения нет, вы получите идентификатор контейнера, напримерd2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00длинная строка. повторное использованиеcurl -i http://127.0.0.1Получите доступ к службе и убедитесь, что контейнер nginx запущен и работает нормально. последнее использованиеdocker logs -f d24Просмотрите вывод журнала контейнера, который примерно выглядит следующим образом:

172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

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

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

Хранение файла журнала контейнера

Журнал контейнера будет храниться на локальном диске в виде файла json.Вы можете использовать следующий метод для просмотра пути к файлуdocker inspect d42 | grep LogВас можно найти:

"LogPath": "/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log",

Примечание 1: На Mac No / var / lib / docker на Mac, поскольку docker для Mac работает по-разному, лучше всего использовать систему Linux для практики.

Примечание 2. Если содержимое LogPath пусто, это, вероятно, связано с версией механизма Docker, и версию Docker можно обновить до docker-ce 18.09.3.

Проверятьd2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.logфайл, вы можете увидеть:

{"log":"172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.29.0\" \"-\"\r\n","stream":"stdout","time":"2019-03-24T03:51:21.982476951Z"}

этой информацииlogСодержимое поля и предыдущий проходdocker logsКонтент, просматриваемый командой, одинаков.

Журнал контейнера будет следовать жизненному циклу контейнера, и журнал также будет уничтожен после уничтожения контейнера. использоватьdocker stop 24Остановите тестовую службу nginx. Потому что он используется, когда контейнер запускается и используется--rmпараметр, он будет автоматически очищен и удален после завершения работы, поэтому будет обнаружено, что каталог /var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00 не существует, а соответствующий файл журнала удален.

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

Журналы контейнера Docker по умолчанию записываются в файлы json, и существует риск того, что диск будет заполнен при работе в сети. Стратегия может быть скорректирована, чтобы заставить ее двигаться. Исправлять/etc/docker/daemon.json(создайте вручную, если это еще не сделано), добавьте следующее:

{
  "log-opts": {
    "max-size": "1m",
    "max-file": "3"
  }
}

После завершения модификации перезапустите службу докеров:

systemctl daemon-reload
systemctl restart docker.service

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

docker run -d --rm alpine:3.6 sh -c "while true; do echo hello world; usleep 10; done"

Этот альпийский контейнер выводит hello world каждые 10 микросекунд, поддерживает высокочастотный вывод и быстро создает файлы журналов.

注:shell中的时间控制
1、sleep : 默认为秒。
sleep 1s 表示延迟一秒  
sleep 1m 表示延迟一分钟  
sleep 1h 表示延迟一小时  
sleep 1d 表示延迟一天    
  
2、usleep : 默认以微秒。  
1s = 1000ms = 1000000us

Просмотрите файл журнала, как описано выше.

# pwd
/var/lib/docker/containers/aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3
# ls -lah
total 2.6M
drwx------ 4 root root 4.0K Mar 24 16:22 .
drwx------ 3 root root 4.0K Mar 24 16:21 ..
-rw-r----- 1 root root 647K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log
-rw-r----- 1 root root 977K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.1
-rw-r----- 1 root root 977K Mar 24 16:21 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.2

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

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

логи контейнера nginx

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

во-первыхdocker run -it --rm -d -p 80:80 nginx:1.15.8-alpineСоздайте контейнер nginx, затемdocker exec -it b6d shВойдите в контейнер и проверьте /etc/nginx/nginx.conf, чтобы увидеть следующее:

error_log  /var/log/nginx/error.log warn;
access_log  /var/log/nginx/access.log  main;

То есть nginx будет писать логи ошибок и логи доступа в соответствующие лог-файлы. Продолжайте просматривать каталог /var/log/nginx:

/var/log/nginx # ls -lah
total 0
drwxr-xr-x    2 root     root          39 Mar  4 07:54 .
drwxr-xr-x    3 root     root          18 Mar  4 07:54 ..
lrwxrwxrwx    1 root     root          11 Jan 31 23:32 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root          11 Jan 31 23:32 error.log -> /dev/stderr

Это находит тайну, файл access.log будет перенаправлен на стандартный вывод через программную ссылку, а журнал ошибок error.log перенаправит стандартную ошибку. использовать вот такdocker logКоманда для просмотра журнала доступа nginx.

Для дополнительной проверки см.nginx dockerfileфайл, который включает в себя:

    # forward request and error logs to docker log collector
	&& ln -sf /dev/stdout /var/log/nginx/access.log \
	&& ln -sf /dev/stderr /var/log/nginx/error.log

Видно, что вывод файла журнала определяется при создании образа nginx.

использовать то же самоеdocker stop 524Очистите сцену, и этот шаг не будет представлен в будущем.

журнал контейнера mysql

запустить контейнер mysql

docker run --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

Нетрудно увидеть вывод журнала контейнера mysql, и его фрагмент выглядит следующим образом:

Initializing database
2019-03-24T08:48:19.102726Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-03-24T08:48:20.241459Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-03-24T08:48:20.414933Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-03-24T08:48:20.509897Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 935a6ee7-4e11-11e9-b135-0242ac110002.
2019-03-24T08:48:20.519148Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-03-24T08:48:20.519843Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2019-03-24T08:48:24.066683Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066730Z 1 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066740Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066756Z 1 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066761Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066772Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066814Z 1 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066822Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
Database initialized
Initializing certificates
Generating a RSA private key

просмотреть mysqlDockerfileфайл, вы можете знать, что запись запуска зеркала mysql находится вentrypoint.sh, нашел из скрипта:

echo 'Initializing database'
"$@" --initialize-insecure
echo 'Database initialized'

Это соответствует выходным данным контейнера mysql при его запуске.entrypoint.shЭто сложнее.Основная функция - запустить mysqld и вывести журнал.Поскольку это не является предметом этой статьи, мы не будем вдаваться в подробности.

Суммировать

  1. Контейнер Docker по умолчанию выводит данные в локальный файл json, и его размер и количество можно контролировать.
  2. Журналы контейнера приложений могут сначала генерировать файлы журналов, а затем программно подключать файлы журналов приложений к стандартному выводу, например nginx, или распечатывать журналы непосредственно в стандартный вывод при запуске, например mysql.

Ссылка на ссылку

Где находятся журналы Docker? Как собрать?

JSON File logging driver

docker mysql