Иногда при работе с MySQL пользователи замечают, как контейнер Docker не работает, обычно он падает сразу после запуска или работает, но крайне нестабильно. В результате такой проблемы в логах можно найти ошибки разного содержания, в худшем случае - контейнер постоянно перезапускается, что делает работу с MySQL практически невозможной.
Как проявляется ошибка?
Один из самых очевидных признаков наличия проблемы, вы заходите в журнал ошибок Docker и видите там сообщение со следующим содержанием:
level=error msg="stream copy error: read /proc/self/fd/27: file already closed"
level=error msg="<id_контейнера> cleanup: failed to delete container from containerd: cannot delete running task <id_контейнера>: failed precondition"
Это один из самых очевидных симптомов наличия проблемы, но есть и другие тревожные сигналы, которые должны как минимум насторожить, как максимум - привести к действиям по устранению ошибки:
- контейнер сразу выходит;
- в случае подключения к базе данных появляется ошибка;
- порт 3306 чаще всего оказывается недоступным;
- в логах есть ошибки инициализации.
Чтобы проверить Docker, выполняем следующую команду:
docker ps -a
docker logs <container_name>
Если вы обнаружили один или сразу несколько симптомов, то это ваш случай. Дальше разберем, как устранить такую проблему, как не загружается контейнер Docker.
Почему контейнер не прогружается?
Среди основных причин появления данной проблемы стоит отметить:
- Отсутствует пароль root, хотя MySQL каждый раз запрашивает пароль при запуске контейнера.
- Порт 3306 постоянно занят. На практике встречается и такое. Происходит это по причине, когда порт уже занят локальным MySQL или другим контейнером.
- MySQL не готов к работе и контейнер не успевает инициализироваться.
- В случае недостатка памяти контейнер будет прекращен системой (ООМ).
Решение проблемы зависит от характера возникновения ошибки.
Убираем симптомы и устраняем корень проблемы
В самом начале определяем точное имя контейнера с помощью команды:
docker ps -a | grep <id_контейнера>
Для устранения бесконечной перезагрузки, необходимо сначала остановить и удалить контейнер:
docker stop <имя_контейнера>
docker rm <имя_контейнера>
После этого можно пересоздать контейнер:
/usr/local/mgr5/sbin/mgrctl -m ispmgr db.server.edit reinstall=on elid=<имя_контейнера> sok=ok
Что есть ничего не помогает? Тогда возможно вы столкнулись с нетипичной причиной. Рассмотрим другие способы.
Если способ выше не помог
Вы можете поменять порт 3306, если он оказался занятым. Для этого нужно выполнить следующую команду:
Isof -i :3306
Полная замена порта по команде:
-p 3307:3306
Если же причина кроется в volume или характер проблемы, по которой падает контейнер, не ясен, тогда попробуйте выполнить команду:
docker volume rm <volume_name>
Также вы можете использовать уже комплексный рабочий пример команды:
docker run -d \
--name mysql-test \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0
Чаще всего после всех выше приведенных действий ошибка устраняется.