The book of Magnus

IT-заметки и знания

Docker. Глава пятая

Tags = [ DevSecOps, Docker ]

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

Самым простым способом заглянуть внутрь контейнера является команда

docker container top

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

Получить более детальную информамцию можно другими способами. Можно использовать стандартные утилиты Linux, например strace, например:

sudo strace -p PROCESS_NUMBER

Подобным образом можно использовать и lsof

sudo lsof -p PROCESS_NUMBER

Все пути в выводе будут указаны относительно вида на файловую систему изнутри контейнера.

Всегда есть возможность завершить в контейнере отдельную службу с помощью kill и контейнер продожит работать, только если таким способом не убить процесс верхнего уровня (PID 1). Но лучше так не делать, в конце концов, проще создать новый контейнер, чтобы не произошло каких-то неожиданных эффектов.

Отладка сетей

Посмотреть существующие сети можно командой docker network ls. Чтобы посмотреть, какие контейнеры подключены к определённой сети, можно подать команду docker network inspect.

История образа

С помощью команды docker image history можно отследить происхождение и базовый образ. Данная команда показывает все слои, их размеры и команды с помощью которых образ собирался. Данная команда поможет определить почему образ получился большего объёма, чем ожидалось и поможет понять как можно его улучшить.

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

На диске есть каталог, который выделяется для контейнера, обычно это /var/lib/docker/containers и в нём лежат очень длинные хэши. Можно ввести команду docker container ls и взять короткий хэш с помощью которого и найти нужный длинный. В каталоге будут файлы, которые монтируются к контейнеру.

Также можно проверить записывает ли контейнер что-либо в свою внутреннюю файловую систему. Сделать это можно с помощью команды docker container diff, например:

docker container diff nginx-fs C /run

В ответе будут выданы строки с литерами A и C в начале. A означает added, то есть было добавлено, а C - changed, то есть было изменено.