После разворачивания приложения однажды что-то непременно с ним пойдёт не так и нужно быть готовым к этому моменту, а значит было бы неплохо научиться отлаживать контейнеры и находить причину неполадок.
Самым простым способом заглянуть внутрь контейнера является команда
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, то есть было изменено.