Ответ
При работе с Docker часто встречаются однотипные проблемы, связанные с конфигурацией, ресурсами и сетью. Ниже приведены самые распространенные из них и способы их решения.
1. Конфликт портов
Ошибка: Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use.
Причина: Порт на хост-машине, который вы пытаетесь привязать к контейнеру, уже занят другим процессом.
Решение:
- Освободить порт, остановив использующий его процесс.
- Использовать другой порт на хосте.
# Пример: маппинг порта 80 контейнера на порт 8888 хоста
docker run -p 8888:80 nginx
2. Потеря данных после перезапуска контейнера
Проблема: Данные, сгенерированные внутри контейнера (например, файлы базы данных, логи), исчезают после его удаления и пересоздания.
Причина: Данные хранились в файловой системе контейнера, которая является эфемерной.
Решение: Использовать volumes (тома) для хранения данных на хост-машине.
# Создание именованного тома и его монтирование
docker volume create my-data
docker run -v my-data:/path/in/container my-image
# Монтирование директории с хоста
docker run -v /host/path:/container/path my-image
3. Ошибки прав доступа к смонтированным volumes
Ошибка: Permission denied при попытке записи в смонтированную директорию из контейнера.
Причина: UID/GID пользователя внутри контейнера не совпадает с UID/GID владельца файлов на хосте.
Решение:
- Запускать контейнер с указанием нужного пользователя (
--user). - Изменить права на директорию на хосте (
chmod,chown).
4. Неэффективная сборка образа (Dockerfile)
Проблема: Сборка образа занимает много времени, а размер образа неоправданно велик.
Причины:
- Неправильный порядок инструкций, который ломает кэширование слоев.
- Отсутствие файла
.dockerignore, из-за чего в контекст сборки попадают ненужные файлы (например,node_modules,.git).
Решение:
- Размещайте инструкции, которые меняются редко (установка системных пакетов), в начале Dockerfile, а те, что меняются часто (копирование исходного кода), — в конце.
- Всегда создавайте
.dockerignore.
5. Утечки ресурсов
Проблема: Остановленные контейнеры, неиспользуемые образы и тома занимают место на диске.
Решение: Регулярно выполнять очистку с помощью команды docker system prune.
# Удалить все остановленные контейнеры, неиспользуемые сети и образы
docker system prune -a --volumes
Главный инструмент отладки — логи контейнера. Всегда проверяйте их командой docker logs <container_id>.