Как Docker работает с разными архитектурами?



И что происходит, когда на разных архитектурах мы пулим один и тот же образ? Скажем, node:15.4.0-alpine3.12?



Если открыть ссылку, то можно увидеть информацию об образе. Но что более важно, можно увидеть переключатель OS/ARCH. На самом деле под каждую архитектуру собирается и публикуется отдельный образ, а затем эти они объединяются общим тегом. Саму структуру манифеста можно посмотреть через docker manifest inspect --verbose node:15.4.0-alpine3.12. Чтобы упростить работу с такими образами, докер будут использовать buildx. Подробней можно почитать вот здесь.



Докер сам выберет подходящий образ под текущую архитектуру, но на собственных процессорах эпл так же будет поддержка и amd64 через QEMU, но, само-собой, работать в разы медленнее, т.к. это эмуляция. На текущий момент, если нет образа под arm64, то докер просто падает и говорит, что не нашёл подходящий образ. Это решается через явное указание платформы --platform linux/amd64. Пока что непонятно как они будут решать этот момент, т.к. указывать явно не очень удобно.



Что ещё более непонятно, так это насколько безопасно (с точки зрения стабильности) разрабатывать на одной архитектуре, а в проде использовать другую? ARM инстансы, хоть и существуют (у amazon есть тип A1, который стоит дешевле EC2 и при этом эффективней), но пока что не пользуются популярностью. Во многом это обусловленно как раз таки архитектурой, которую мы используем для локальной разработки, так что здесь сложно определить где курица, а где яйцо.