Вопрос или проблема
Я сталкиваюсь с этой ошибкой при запуске даже официального образа Docker, такого как OpenJDK или даже hello-world:
# docker run hello-world
docker: Ответ ошибки от демона: не удалось создать шиму: создание OCI runtime не удалось:
container_linux.go:380: начало процесса контейнера вызвало: process_linux.go:402:
получение pid финального дочернего процесса из канала вызвало: EOF: неизвестно.
Моя ОС:
# rpm --query centos-release
centos-release-7-5.1804.4.el7.centos.x86_64
и моя версия Docker:
# docker -v
Версия Docker 20.10.14, сборка a224086
Ошибка появляется без изменений или обновлений.
Как я могу расследовать причину этой проблемы?
Стандартное ядро CentOS 7 (3.10) имеет некоторые проблемы с последними версиями Docker.
Его необходимо обновить до версии ядра 5+.
https://forums.docker.com/t/centos7-docker-hello-world-fails/68941/4
Я использую CentOS 7.6, но версия ядра была 3.10. Поэтому я увидел то же сообщение после обновления версии docker-ce до версии Docker 18.09.2, сборка 6247962. Чтобы решить эту проблему, я обновил версию ядра до 4.20, тогда Docker заработал хорошо. Я следовал процессу обновления ядра в CentOS на этой странице.
Полезные ссылки для обновления ядра CentOS:
Ответ или решение
Ошибка, с которой вы столкнулись, связана с запуском контейнеров Docker на CentOS 7 с устаревшей версией ядра. Сообщение об ошибке "failed to create shim: OCI runtime create failed" указывает на то, что система не может создать или управлять процессом контейнера, что обычно связано с несовместимостью между версией ядра и используемым Docker. Ваша версия Docker (20.10.14) требует обновления ядра в CentOS до версии 4 или выше.
Поддержка программного обеспечения Docker на CentOS 7
CentOS 7 поставляется с ядром версии 3.10, которое имеет известные проблемы с более новыми версиями Docker. Когда вы пытаетесь запустить контейнер, Docker полагается на ряд функциональных возможностей, доступных только в более свежих версиях ядра.
Ваша система может успешно работать с устаревшим ядром для ряда других задач, однако Docker требует определенных функций, таких как cgroups и namespaces, которые не полностью поддерживаются в версии ядра 3.10. Например, возможности управления ресурсами и изоляции контейнеров были существенным образом улучшены в более поздних версиях ядра.
Шаги по решению проблемы
-
Проверка текущей версии ядра:
Убедитесь, какую версию ядра вы используете в данный момент:uname -r
-
Обновление ядра:
Если версия ядра ниже 4.0, настоятельно рекомендуется обновить ее. Вы можете использовать следующие ресурсы для выполнения обновления:Обычно процесс обновления включает установку нового ядра с помощью пакетов
elrepo
:yum install --enablerepo=elrepo-kernel kernel-ml
После установки перезагрузите систему:
reboot
-
Проверка состояния Docker:
После перезагрузки снова проверьте версию ядра и запустите контейнер:docker run hello-world
Дополнительные устранение неполадок
Если после обновления ядра проблема не решается, есть несколько дополнительных шагов, которые вы можете предпринять:
-
Переустановка Docker:
Убедитесь, что у вас установлена последняя версия Docker. Переустановите Docker для устранения возможных конфигурационных ошибок:yum remove docker docker-common yum install docker
-
Проверка журналов:
Изучите журналы системы для получения дополнительной информации об ошибках Docker:journalctl -u docker.service
-
Проверка конфигурации SELinux:
Убедитесь, что SELinux настроен правильно. Возможные ограничения могут мешать Docker:sudo setenforce 0
Это временно отключит SELinux, чтобы проверить, является ли он причиной проблемы.
Заключение
Регулярное обновление ядра и программного обеспечения имеет критическое значение для поддержания безопасности и производительности вашей системы. Если вышеуказанные шаги не помогут решить проблему, рекомендуется обратиться за поддержкой в сообщества или форумы Docker и CentOS для получения дальнейшей помощи.