Docker вообще не обрабатывает процессор. Это просто комбинация пространства имен ядра , системного уровня FS (например, UnionFS ) и цитирование процесса .
Когда вы запускаете что-то в Docker-контейнере, это просто исполняемый файл, работающий на вашей ОС , без виртуализации , он имеет доступ только к выбранному набору объектов ядра (например, устройств) и может привязан к иерархии FS в результате наложения различных FS (в том числе в контейнере Docker).
Следовательно, Docker вообще не обрабатывает процессор, он полностью ортогональн к вашей проблеме.
Как прокомментировал Питер 1017 *, существует два основных способа загрузки ЦП:
- Вы загружаете правильную динамическую библиотеку (но каждый вызов функции в библиотеке использует указатель).
- Вы создаете несколько версий одного и того же статически связанного двоичного файла и запускаете правильную.
Основная проблема заключается в том, что иногда расширения ISA являются ортогональными, и это приводит к экспоненциальному росту комбинаций (т.е. количества библиотек / двоичных файлов).
Итак, учитывая, что вы имеете дело с базой данных Докера, вы можете немного упростить подход (если комбинации являются проблемой):
- Либо сделайте несколько расширений ISA необходимыми (если их отсутствие слишком сильно ухудшит производительность). Для дополнительных расширений вы можете использовать один из подходов выше.
- Создайте только несколько базовых контейнеров. Например. Один для общего
amd64
, один для amd64-avx
, один для amd64-avx2-aesni-tsx
и аналогичный. Идея состоит в том, чтобы создать только несколько контейнеров, которые охватывают всех , большинства и нескольких ваших пользователей.
EDIT
Как указывает BeeOnRope в комментариях , докеры имеют версию, работающую на Windows. Он использует Hyper-V для запуска виртуальной машины Linux с версией Linux Docker .
Поскольку Hyper-V является собственным VMM, кроме дополнительного уровня, применяются те же соображения.
Аналогично, есть версия для MacOS. На этот раз он использует каркас гипервизора, основанный на xhyve .