Сценарные вопросы и вопросы по устранению неполадок
Ваш контейнер Docker запущен, но приложение внутри недоступно. Каковы первые шаги для устранения этой проблемы?
Ответ:
Сначала проверьте docker logs <container_id> на наличие ошибок в приложении. Затем проверьте сопоставление портов с помощью docker ps, чтобы убедиться, что порт хоста правильно опубликован. Наконец, используйте docker exec -it <container_id> bash, чтобы войти в контейнер и проверить, запущено ли приложение и слушает ли оно ожидаемый порт (например, netstat -tulnp).
Контейнер Docker постоянно перезапускается сразу после запуска. Каковы возможные причины и как бы вы их расследовали?
Ответ:
Распространенные причины включают ошибку в скрипте точки входа приложения, отсутствие зависимости или необработанное исключение, вызывающее завершение процесса. Я бы использовал docker logs <container_id> для просмотра вывода перед сбоем и docker inspect <container_id> для проверки RestartCount и ExitCode.
Вы пытаетесь собрать образ Docker, но сборка завершается ошибкой во время инструкции RUN с ошибкой "command not found". Как это отладить?
Ответ:
Обычно это означает, что команда недоступна в базовом образе или не была правильно установлена на предыдущем шаге RUN. Я бы добавил операторы echo перед проблемной командой для проверки путей или временно изменил команду RUN на sh -c 'set -x; <original_command>', чтобы увидеть детали выполнения команды. Альтернативно, можно собрать образ до проблемного слоя, а затем запустить этот промежуточный образ с помощью docker run для интерактивной отладки.
Размер вашего образа Docker чрезмерно велик. Какие стратегии вы бы использовали для его уменьшения?
Ответ:
Я бы использовал многоэтапные сборки (multi-stage builds) для разделения зависимостей времени сборки от артефактов времени выполнения. Я бы также выбрал меньший базовый образ (например, Alpine), удалил ненужные файлы и кэши, а также объединил команды RUN с помощью && для минимизации слоев. Использование .dockerignore для исключения нерелевантных файлов также имеет решающее значение.
Вам нужно обмениваться данными между несколькими контейнерами Docker. Каковы ваши варианты и когда следует выбирать каждый из них?
Ответ:
Варианты включают Docker volumes, bind mounts и общие сетевые хранилища. Docker volumes предпочтительны для постоянных данных и управления жизненным циклом данных, особенно для баз данных. Bind mounts хороши для разработки, позволяя изменениям файлов хоста отражаться мгновенно. Общие сетевые хранилища (например, NFS) предназначены для распределенных приложений, требующих общего доступа между несколькими хостами.
Контейнер Docker потребляет слишком много ЦП/памяти. Как бы вы определили виновника и смягчили проблему?
Ответ:
Я бы использовал docker stats для мониторинга использования ресурсов в реальном времени. Если проблема в конкретном контейнере, я бы использовал docker exec, чтобы войти в него, и инструменты вроде top или htop для идентификации процесса. Смягчение проблемы включает оптимизацию приложения, установку ограничений ресурсов (--cpus, --memory) во время docker run или масштабирование сервиса.
Вы обновили свой образ Docker, но docker run по-прежнему запускает старую версию. Что происходит?
Ответ:
Обычно это означает, что тег образа, который вы используете (например, myimage:latest), не был обновлен локально. Сначала я бы выполнил команду docker pull myimage:latest, чтобы убедиться, что последний образ загружен. Если проблема сохраняется, проверьте идентификатор образа с помощью docker images, чтобы подтвердить, что вы загружаете правильный образ.
Как бы вы гарантировали, что ваши контейнеры Docker автоматически перезапускаются, если сам демон Docker перезапускается или перезагружается хост-машина?
Ответ:
Я бы использовал политику перезапуска при запуске контейнера, например --restart unless-stopped или --restart always. unless-stopped перезапустит контейнер, если он не был явно остановлен, в то время как always всегда будет перезапускать его независимо от его предыдущего состояния, даже если он был остановлен вручную.
Вы испытываете проблемы с сетевой связью между двумя контейнерами Docker на одном хосте. Какие шаги вы бы предприняли для диагностики?
Ответ:
Сначала проверьте, находятся ли оба контейнера в одной сети Docker, используя docker inspect <container_id>. Затем попробуйте пропинговать один контейнер из другого, используя его имя контейнера или IP-адрес. Проверьте правила брандмауэра на хосте и внутри контейнеров, а также убедитесь в отсутствии конфликтов портов, если они публикуют порты.
Ваш контейнер Docker запущен, но вы не можете записывать данные в определенный каталог внутри него. В чем может быть проблема?
Ответ:
Это часто проблема с правами доступа. Я бы выполнил docker exec в контейнер и проверил владельца и права доступа к каталогу с помощью ls -ld <directory>. Пользователь, запускающий приложение внутри контейнера, может не иметь прав на запись. Изменение прав с помощью chmod или chown в Dockerfile или скрипте точки входа может решить эту проблему.