Появление таких решений, как Apple M1/M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker, ставший стандартом де-факто для контейнеризации приложений, сталкивается с некоторыми особенностями работы на этой архитектуре. Многие пользователи Docker на ARM64-системах регулярно видят предупреждения вроде:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Это сообщение возникает из-за фундаментального различия между архитектурами ARM64 и AMD64 (x86_64). Исторически большинство Docker-образов создавались именно для AMD64, что делает их несовместимыми с ARM-системами без дополнительных настроек.
Почему же ARM64 становится всё популярнее? Главные факторы — энергоэффективность и соотношение производительности к энергопотреблению. ARM-процессоры потребляют значительно меньше энергии при сопоставимой производительности. Это критично для дата-центров, где расходы на электроэнергию и охлаждение составляют значительную часть бюджета. В облачной инфраструктуре AWS уже предлагает инстансы на базе ARM-процессоров Graviton, демонстрирующие до 40% лучшее соотношение цена/производительность по сравнению с x86_64 аналогами. Для разработчиков переход на ARM часто начинается с покупки персональных устройств вроде MacBook на M1/M2 или мини-компьютеров Raspberry Pi. Сталкиваясь с проблемами совместимости образов, они ищут решения для запуска привычных рабочих нагрузок в контейнерах Docker.
Ключевые различия при работе с Docker на ARM64:- Бинарная несовместимость с AMD64-образами требует специальных подходов.
- Не все контейнерные образы имеют ARM-версии.
- Эмуляция через QEMU или Rosetta 2 возможна, но имеет ограничения.
- Для производственных сред необходимы мультиархитектурные образы.
- Оптимизированные для ARM контейнеры могут показывать лучшую производительность.
В этом руководстве мы рассмотрим различные аспекты работы с Docker на ARM64 — от базовой настройки среды до продвинутых техник создания мультиархитектурных образов и оптимизации производительности. Прагматичный подход поможет решить типичные проблемы совместимости и извлечь максимум пользы из преимуществ ARM-архитектуры при контейнеризации приложений.
Особенности ARM64 архитектуры
Архитектура ARM64 (или AArch64) представляет собой 64-битную версию ARM архитектуры, являющуюся фундаментальной альтернативой традиционной x86_64 (AMD64). Ее появление изменило ландшафт вычислительных систем, которые десятилетиями доминировались процессорами Intel и AMD. В отличие от x86_64, ARM64 следует философии RISC (Reduced Instruction Set Computing), предлагая более простой и эффективный набор инструкций. Это отличие не случайно — архитектура ARM изначально разрабатывалась с учетом мобильных и встраиваемых систем, где энергоэффективность играет критическую роль. Простота набора команд уменьшает сложность процессора, что позволяет снизить энергопотребление.
Когда мы говорим об использовании Docker на ARM64, важно понимать структурные различия в исполняемых файлах. Программы, скомпилированные для x86_64, содержат совершенно иной машинный код, чем те же программы, скомпилированные для ARM64. Двоичный код не просто несовместим — это абсолютно разные наборы инструкций, невыполнимые на "чужих" архитектурах без эмуляции.
| Bash | 1
2
3
4
| $ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, ARM aarch64, version 1...
# Для сравнения на x86_64:
# /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1... |
|
ARM64 обладает рядом архитектурных особенностей, делающих её привлекательной для контейнеризации:
1. Большие регистровые файлы — 31 регистр общего назначения по 64 бита каждый, что сокращает обращения к памяти и повышает эффективность выполнения кода.
2. Модульная структура системы команд — позволяет создавать более специализированные и энергоэффективные процессоры, лучше подходящие для конкретных нагрузок.
3. Улучшенные возможности векторизации через NEON SIMD — обеспечивают производительность в задачах с параллельной обработкой данных.
4. Предсказуемая производительность — меньшая сложность архитектуры приводит к более стабильному и прогнозируемому поведению в различных условиях нагрузки.
Энергоэффективность — фундаментальное преимущество ARM64. Процессоры на этой архитектуре демонстрируют значительно лучшие показатели производительности на ватт потребляемой энергии. Например, Apple M1/M2 чипы впечатляюще показывают себя по сравнению с Intel/AMD аналогами при существенно меньшем тепловыделении. В контексте контейнеризации это означает возможность запуска большего количества контейнеров на том же оборудовании без повышенных затрат на электроэнергию и охлаждение. Для облачных провайдеров переход на ARM64-серверы снижает TCO (совокупную стоимость владения) дата-центрами. AWS Graviton3 процессоры, к примеру, обеспечивают до 25% лучшую производительность при 60% лучшей энергоэффективности по сравнению с предыдущими поколениями ARM-серверов.
Стоит отметить, что Docker и контейнеризация в целом хорошо сочетаются с преимуществами ARM64. Контейнеры позволяют изолировать приложения и их зависимости, что особенно ценно при миграции между архитектурами. Сами образы Docker занимают меньше места за счет более компактного ARM-кода, а легкость развертывания новых контейнеров позволяет быстро масштабировать нагрузки.
При этом существуют и определенные ограничения ARM64 при работе с традиционными x86-приложениями:
1. Бинарная несовместимость — как уже упоминалось, исполняемые файлы для разных архитектур несовместимы. Это означает, что каждый бинарный компонент образа Docker должен быть скомпилирован специально для ARM64.
2. Трудности с проприетарным ПО — некоторые закрытые решения могут быть недоступны для ARM64, если производитель не выпускает соответствующую версию.
3. Производительность при эмуляции — хотя существуют решения для эмуляции x86_64 на ARM64 (например, QEMU, Rosetta 2), они неизбежно снижают производительность и увеличивают расход ресурсов.
ARM64 применяет иную модель памяти и порядок байтов (little-endian), что может вызывать проблемы в программах, предполагающих определенное поведение памяти. В контейнерах, где часто используются оптимизированные нативные библиотеки, эти различия становятся особенно заметны. Интересно, что набор инструкций ARM64 предлагает некоторые уникальные возможности для оптимизации Docker-контейнеров. Например, более эффективные атомарные операции позволяют улучшить производительность многопоточных приложений, а расширенные криптографические инструкции ускоряют шифрование и безопасную связь.
| Bash | 1
2
3
| # Проверка доступных CPU-функций на ARM64
$ cat /proc/cpuinfo | grep Features
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp |
|
Эти архитектурные особенности влияют на производительность Docker-контейнеров несколькими способами:
1. IO-операции часто выполняются эффективнее на ARM64 благодаря лучшей интеграции контроллеров ввода-вывода.
2. Меньшая потребность в охлаждении позволяет поддерживать стабильную высокую частоту работы процессора.
3. В микросервисных архитектурах, где запускается множество контейнеров, более низкое энергопотребление ARM64 позволяет достичь более высокой плотности развертывания.
4. Сетевые операции, часто ограничивающие производительность контейнеров, оптимизированы на современных ARM-процессорах.
Стоит также отметить, что ARM64 вносит свой вклад в изменение парадигмы разработки и развертывания контейнеризированных приложений. В отличие от x86_64, где доминировали монолитные процессоры общего назначения, экосистема ARM предлагает широкий спектр специализированных решений, адаптированных под различные нагрузки. Обработка SVE (Scalable Vector Extension) в новейших ARM-процессорах позволяет эффективно выполнять векторизованные вычисления переменной длины, что может значительно ускорить обработку данных в контейнерах с аналитическими и научными приложениями. Особенно это заметно при работе с AI-фреймворками вроде TensorFlow или PyTorch, оптимизированными под ARM. Гетерогенные вычисления — еще одна область, где ARM64 демонстрирует преимущества. Современные ARM-чипы часто интегрируют на одном кристалле CPU, GPU, NPU (нейронные процессоры) и DSP (цифровые сигнальные процессоры). Это позволяет Docker-контейнерам задействовать специализированные блоки для ускорения конкретных задач без необходимости в отдельных устройствах.
| Bash | 1
2
| # Пример проверки наличия GPU-ускорения на ARM64 устройстве
$ ls -la /dev/mali* /dev/gpu* 2>/dev/null || echo "GPU devices not found" |
|
Память большой ёмкости (Large System Extensions) в современных серверных ARM-чипах поддерживает работу с терабайтами оперативной памяти, что позволяет запускать в контейнерах ресурсоемкие базы данных и системы обработки больших массивов информации. Для контейнеризации это означает возможность эффективно изолировать и запускать высоконагруженные сервисы без деградации производительности.
Важное преимущество ARM64 в контейнерных средах — улучшенная безопасность за счет таких функций как Memory Tagging Extension (MTE) и Pointer Authentication (PAC). Эти технологии снижают риски уязвимостей, связанных с управлением памятью, включая buffer overflow и use-after-free. Учитывая, что контейнеры обеспечивают меньший уровень изоляции по сравнению с виртуальными машинами, аппаратные средства защиты приобретают особую ценность. Интересно, что специализация ARM-процессоров влияет на стратегии масштабирования приложений в контейнерах. Вместо простого горизонтального масштабирования иногда эффективнее использовать вертикальное, размещая разные типы контейнеров на узлах с оптимальными для их задач ARM-процессорами. Сравнительный анализ потребления энергии между ARM64 и x86_64 при выполнении типичных контейнеризированных нагрузок показывает, что ARM64 особенно эффективен в задачах с высоким уровнем параллелизма и в приложениях, ориентированных на обработку данных. При этом разрыв в производительности уменьшается или даже исчезает в вычислительно-интенсивных задачах, особенно оптимизированных под специфические расширения x86_64.
Виртуализация на уровне ОС, которая лежит в основе Docker, демонстрирует низкие накладные расходы на ARM64 благодаря эффективной реализации необходимых примитивов в ядре Linux. Подсистема cgroups, используемая для ограничения ресурсов контейнеров, имеет оптимизации для ARM64, учитывающие специфику управления энергопотреблением и многоядерности в этой архитектуре. При выборе ARM64 для контейнеризации следует учитывать не только текущую производительность, но и динамику развития архитектуры. В последние годы темпы эволюции ARM-процессоров значительно превышают прогресс в мире x86_64, что позволяет прогнозировать дальнейшее усиление преимуществ ARM64 в ближайшем будущем.
Docker, (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?) До появления ошибки работал с Docker, запускал контейнеры, останавливал и удалял их. Но внезапно в... Запуск linux контейнеров Docker в windows без Docker Desktop Всем доброго времени суток!
Пытаюсь разворачивать локальный веб-сервер на ПК С ОС windows с... Docker - отложенный запуск, или дождаться запуска других контейнеров Всем доброго!
Подскажите, возможно ли средствами docker отложить запуск контейнера или привязать... Создание контейнеров docker Нужно создать три контейнера docker:
1. Nginx
2. php-fpm
3. Mysql
И развернуть коробку...
Настройка среды Docker на ARM64
Разворачивание Docker на ARM64-системах представляет собой процесс, отличающийся от аналогичного на x86_64. Начнём с базовой установки и затем разберём специфические моменты и оптимизации. Установка Docker Engine на ARM64 Linux можно выполнить стандартными методами. Для удобства приведу последовательность команд для Ubuntu:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Удаление старых версий (если есть)
sudo apt remove docker docker-engine docker.io containerd runc
# Установка необходимых пакетов
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# Добавление официального GPG-ключа Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Добавление репозитория Docker для ARM64
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Установка Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io |
|
Для macOS с Apple Silicon (M1/M2) процесс ещё проще — достаточно скачать и установить Docker Desktop для Apple Silicon с официального сайта. Современные версии имеют нативную поддержку ARM64 и не требуют эмуляции для работы самого Docker. После установки обязательно проверьте работоспособность Docker и его текущую версию:
| Bash | 1
2
3
4
5
6
7
8
9
10
| # Проверка версии
docker --version
[H2]Docker version 24.0.6, build ed223bc[/H2]
# Проверка архитектуры хостовой системы
uname -m
[H2]aarch64 (или arm64)[/H2]
# Запуск тестового контейнера hello-world
docker run --rm arm64v8/hello-world |
|
Особое внимание стоит уделить пользовательским правам. Чтобы избежать постоянного использования sudo при работе с Docker, добавьте своего пользователя в группу docker:
| Bash | 1
2
| sudo usermod -aG docker $USER
# Перелогиньтесь для применения изменений |
|
Одна из типичных проблем при работе с Docker на ARM64 — несовместимость образов. Как упоминалось ранее, большинство существующих образов создано для x86_64, и при попытке их запуска на ARM64 система выдаст предупреждение или ошибку. Для решения этой проблемы есть несколько подходов.
1. Использование флага --platform:
| Bash | 1
2
| # Запуск AMD64-образа на ARM64 через эмуляцию
docker run --platform linux/amd64 -p 8080:80 nginx |
|
Этот метод работает благодаря встроенной в Docker Desktop эмуляции QEMU. Для Linux-систем нужно установить дополнительные пакеты:
| Bash | 1
2
| sudo apt update
sudo apt install qemu qemu-user qemu-user-static binfmt-support |
|
2. Поиск ARM-совместимых образов. Многие популярные образы имеют версии для ARM64, обычно с тегами arm64v8 или просто в многоархитектурном варианте. Проверить поддерживаемые архитектуры можно командой:
| Bash | 1
| docker manifest inspect nginx | grep arch |
|
3. Включение Rosetta 2 для macOS. На Apple Silicon можно активировать расширенную эмуляцию x86_64:
| Bash | 1
2
3
4
5
| # Проверка установки Rosetta 2
/usr/bin/pgrep -q oahd && echo "Rosetta установлен" || echo "Rosetta не установлен"
# Установка Rosetta 2 (если не установлен)
softwareupdate --install-rosetta |
|
После этого в Docker Desktop нужно включить опцию "Use Rosetta for x86/amd64 emulation on Apple Silicon".
При настройке системы для оптимальной работы Docker на ARM64 стоит учесть несколько аспектов:
1. Лимиты системы — увеличьте лимиты на число файловых дескрипторов и процессов:
| Bash | 1
2
3
4
5
6
| # Проверка текущих лимитов
ulimit -n
[H2]Обычно 1024 по умолчанию[/H2]
# Постоянное увеличение лимитов
echo '* soft nofile 65536\n* hard nofile 65536' | sudo tee -a /etc/security/limits.conf |
|
2. Настройка storage driver — для ARM64 предпочтительнее использовать overlay2:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
| # Создание файла конфигурации
sudo nano /etc/docker/daemon.json
# Добавьте следующее содержимое:
{
"storage-driver": "overlay2",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10
}
# Перезапустите Docker
sudo systemctl restart docker |
|
3. Оптимизация производительности сети — настройка MTU для избежания фрагментации пакетов:
| Bash | 1
2
3
4
5
6
7
8
| # Измерение оптимального MTU
docker network inspect bridge -f '{{.Options.com.docker.network.driver.mtu}}'
# Настройка для вашей сети (пример)
{
"storage-driver": "overlay2",
"mtu": 1450
} |
|
Специфика работы с Docker-регистри на ARM64 заключается в корректной маркировке и выборе образов. Docker Hub и большинство других регистри поддерживают мультиархитектурные манифесты, позволяющие получать правильную версию образа автоматически. Однако, при работе с частными регистри или старыми образами могут возникнуть проблемы. Чтобы проверить, поддерживает ли образ архитектуру ARM64:
| Bash | 1
2
| # Для образов на Docker Hub
docker manifest inspect library/nginx | grep "architecture" |
|
При подготовке базовой системы ARM64 для Docker стоит также учесть:
1. Выбор дистрибутива — Ubuntu, Debian и Alpine хорошо поддерживают ARM64 и содержат все необходимые пакеты.
2. Обновление ядра — для оптимальной производительности рекомендуется использовать свежие версии ядра (5.10+).
3. Настройка свопа — из-за специфики ARM-систем стоит настроить правильный размер и приоритет подкачки:
| Bash | 1
2
3
4
5
6
7
| # Проверка текущих настроек свопа
cat /proc/sys/vm/swappiness
[H2]По умолчанию 60[/H2]
# Установка оптимального значения для контейнеризации
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p |
|
Кросс-компиляция для ARM64 становится важным аспектом при создании собственных образов. Docker BuildKit значительно упрощает этот процесс. Для активации BuildKit:
| Bash | 1
| export DOCKER_BUILDKIT=1 |
|
Пример многоэтапной сборки для Go-приложения с кросс-компиляцией:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| FROM --platform=$BUILDPLATFORM golang:1.18 AS builder
ARG TARGETPLATFORM
WORKDIR /app
COPY . .
RUN case "$TARGETPLATFORM" in \
"linux/amd64") GOARCH=amd64 ;; \
"linux/arm64") GOARCH=arm64 ;; \
*) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
esac && \
CGO_ENABLED=0 GOOS=linux GOARCH=$GOARCH go build -o /app/server .
FROM --platform=$TARGETPLATFORM alpine:3.16
COPY --from=builder /app/server /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/server"] |
|
Удаленная сборка может значительно ускорить процесс разработки, особенно когда локальная машина имеет архитектуру, отличную от целевой. Docker CLI поддерживает сборку на удаленных серверах:
| Bash | 1
2
3
4
5
| # Настройка Docker для использования удаленного хоста
export DOCKER_HOST=ssh://user@arm-server
# Теперь сборка будет выполняться на удаленном ARM-сервере
docker build -t myapp:arm64 . |
|
Также важный аспект работы с Docker на ARM64 — настройка логирования и мониторинга. Для избежания проблем с диском рекомендуется настроить ротацию логов:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
| cat << EOF | sudo tee /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker |
|
Отдельного внимания заслуживает управление памятью. Arm64-системы часто имеют специфичную иерархию кэшей и особенности работы с памятью, что может влиять на производительность контейнеров. При работе с приложениями, чувствительными к задержкам доступа к памяти, стоит настроить NUMA-совместимое размещение:
| Bash | 1
2
3
4
5
| # Проверка NUMA-топологии
numactl --hardware
# Запуск контейнера с привязкой к NUMA-узлу
docker run --cpuset-cpus=0-3 --cpuset-mems=0 -it your-image |
|
Если вы столкнулись с проблемой, когда команда docker buildx не распознается, нужно установить дополнительный плагин:
| Bash | 1
2
3
4
| # Установка Docker Buildx на Linux ARM64
mkdir -p ~/.docker/cli-plugins/
curl -L https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64 -o ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx |
|
Для работы в смешанных окружениях полезно понимать, как проверить, работает ли ваш контейнер нативно или через эмуляцию:
| Bash | 1
2
3
4
| # Запуск контейнера с проверкой архитектуры
docker run --rm -it alpine uname -m
# aarch64 - нативный запуск
# x86_64 - запуск через эмуляцию |
|
В случае с эмуляцией через QEMU есть характерные проблемы, которые могут возникнуть:
1. Повышенное потребление ресурсов — эмуляция требует дополнительных вычислительных мощностей.
2. Неожиданные сбои при работе с файловой системой и сетью.
3. Невозможность использовать некоторые системные вызовы.
Решением может стать конвертация контейнера в ARM-вариант через пересборку с исходным кодом:
| Bash | 1
2
3
4
5
| # Извлечение Dockerfile из существующего образа
docker pull amd64-only-image:latest
mkdir extraction && cd extraction
docker save amd64-only-image:latest | tar -xf - -C .
# Изучите слои и манифест, создайте собственный Dockerfile |
|
Для устройств с ограниченными ресурсами, таких как Raspberry Pi, стоит рассмотреть использование облегченных альтернатив Docker:
| Bash | 1
2
3
4
5
| # Установка Podman на ARM64
sudo apt install podman
# Проверка работоспособности
podman run --rm hello-world |
|
В контексте CI/CD важно настроить тестирование на соответствующей архитектуре. GitHub Actions предлагает встроенную поддержку ARM64-раннеров:
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
| # Фрагмент .github/workflows/build.yml
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
arch: [amd64, arm64]
steps:
- uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Build for ${{ matrix.arch }}
run: docker build --platform linux/${{ matrix.arch }} -t myapp:${{ matrix.arch }} . |
|
Не забывайте также об особенностях работы с VOLUMES в Docker на ARM64 — при использовании внешних хранилищ стоит обращать внимание на совместимость файловых систем и особенности доступа к блочным устройствам на конкретной ARM-платформе.
Мультиплатформенные образы
Одно из элегантных решений проблемы совместимости Docker на разных процессорных архитектурах — мультиплатформенные (или мультиархитектурные) образы. Это технология, позволяющая под одним тегом образа хранить варианты для различных архитектур: AMD64, ARM64, ARM v7 и других. При запуске контейнера Docker автоматически выбирает подходящий вариант для конкретной архитектуры хоста. В основе этого механизма лежит система манифестов — специальных метаданных, связывающих разные версии образа. Конечному пользователю не нужно беспокоиться о выборе правильной архитектуры — система делает это автоматически. Ключевым инструментом для создания мультиархитектурных образов является BuildKit и его клиентская обёртка Buildx. В отличие от стандартного механизма сборки, BuildKit позволяет параллельно собирать образы для нескольких архитектур и объединять их в единый манифест.
Для начала работы с Buildx необходимо создать и настроить новый Builder:
| Bash | 1
2
3
4
5
6
7
8
| # Проверка текущего состояния Buildx
docker buildx ls
# Создание нового Builder с поддержкой нескольких платформ
docker buildx create --name multiarch --use
# Проверка доступных платформ
docker buildx inspect multiarch |
|
Если некоторые архитектурные платформы отсутствуют в выводе, необходимо установить эмуляторы QEMU:
| Bash | 1
2
| # Установка эмуляторов для разных архитектур
docker run --privileged --rm tonistiigi/binfmt --install all |
|
Теперь можно приступить к сборке образа для нескольких архитектур одновременно:
| Bash | 1
2
| # Пример сборки для AMD64 и ARM64
docker buildx build --platform linux/amd64,linux/arm64 -t username/app:latest --push . |
|
Флаг --push не только собирает образы, но и автоматически создаёт манифест перед отправкой в репозиторий. Без этого флага образы будут собраны, но не сохранены локально и не отправлены в реестр.
Для более гибкого контроля над процессом можно разделить сборку и публикацию:
| Bash | 1
2
3
4
5
6
7
8
9
| # Сборка без автоматической публикации
docker buildx build --platform linux/amd64,linux/arm64 -t username/app:latest --output type=image,push=false .
# Ручное создание и публикация манифеста
docker manifest create username/app:latest \
username/app:latest-amd64 \
username/app:latest-arm64
docker manifest push username/app:latest |
|
Важным аспектом при создании мультиархитектурных образов является оптимизация Dockerfile. Необходимо учитывать особенности каждой архитектуры:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
| FROM --platform=$TARGETPLATFORM alpine:3.16
# Установка зависимостей с учётом архитектуры
RUN case "$(uname -m)" in \
x86_64) ARCH='amd64' ;; \
aarch64) ARCH='arm64' ;; \
*) echo "Unsupported architecture" && exit 1 ;; \
esac && \
apk add --no-cache curl && \
curl -Lo /usr/local/bin/app https://github.com/example/app/releases/download/v1.0/app-$ARCH && \
chmod +x /usr/local/bin/app
CMD ["app"] |
|
BuildKit предоставляет набор переменных сборки для адаптации процесса:
BUILDPLATFORM — архитектура системы, выполняющей сборку,
TARGETPLATFORM — целевая архитектура образа,
BUILDOS, BUILDARCH — компоненты BUILDPLATFORM,
TARGETOS, TARGETARCH — компоненты TARGETPLATFORM.
Для автоматизации сборки мультиархитектурных образв в CI/CD важно правильно настроить рабочие процессы. GitHub Actions предлагает удобный механизм:
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| name: Build and push multiarch image
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: username/app:latest |
|
При работе с Docker Manifest API напрямую необходимо активировать экспериментальные функции в Docker CLI:
| Bash | 1
2
| # Активация экспериментальных функций
echo '{"experimental": true}' > ~/.docker/config.json |
|
Теперь можно исследовать и манипулировать манифестами:
| Bash | 1
2
3
4
5
| # Проверка информации о манифесте
docker manifest inspect nginx
# Аннотирование манифеста
docker manifest annotate username/app:latest username/app:latest-arm64 --os linux --arch arm64 --variant v8 |
|
Система тегирования мультиархитектурных образов требует особого внимания. Рекомендуемые практики включают:
1. Использование смысловых тегов для версий: v1.0.0, latest,
2. Применение архитектурных суффиксов для отдельных образов: v1.0.0-amd64, v1.0.0-arm64,
3. Добавление информации о базовом образе: v1.0.0-alpine, v1.0.0-debian.
Совмещение этих подходов может выглядеть как v1.0.0-alpine-arm64.
В случае поддержки большого числа архитектур стоит использовать матрицу тегов:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Скрипт для генерации сложной системы тегов
VERSION="1.0.0"
BASE="alpine debian"
ARCH="amd64 arm64 arm/v7"
for base in $BASE; do
for arch in $ARCH; do
echo "Building: $VERSION-$base-${arch/\//-}"
docker buildx build --platform linux/$arch \
-t username/app:$VERSION-$base-${arch/\//-} \
--build-arg BASE=$base \
.
done
done |
|
Для упрощения работы с мультиархитектурными образами существуют специализированные инструменты. Например, docker-buildx-bake позволяет описывать сложные сценарии сборки в формате HCL или JSON:
| JSON | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // docker-bake.hcl
group "default" {
targets = ["app-amd64", "app-arm64"]
}
target "app-amd64" {
dockerfile = "Dockerfile"
platforms = ["linux/amd64"]
tags = ["username/app:latest-amd64"]
}
target "app-arm64" {
dockerfile = "Dockerfile"
platforms = ["linux/arm64"]
tags = ["username/app:latest-arm64"]
}
target "app-all" {
inherits = ["app-amd64", "app-arm64"]
tags = ["username/app:latest"]
} |
|
Запуск такой конфигурации выполняется командой:
| Bash | 1
| docker buildx bake -f docker-bake.hcl app-all --push |
|
При разработке мультиархитектурных образов полезно иметь в виду возможность тестирования на разных архитектурах непосредственно на одной машине:
| Bash | 1
2
| # Тестирование ARM64-образа на AMD64-машине
docker run --rm --platform linux/arm64 -it username/app:latest |
|
Оптимизация производительности мультиархитектурных сборок включает кеширование и распределённую сборку. BuildKit поддерживает внешние кеши, которые можно настроить через переменные среды:
| Bash | 1
2
3
| # Настройка кеширования в AWS S3
export BUILDX_CACHE_STORAGE=s3://bucket/buildcache
docker buildx build --cache-from=type=remote,ref=bucket/buildcache --platform linux/amd64,linux/arm64 . |
|
Распределённая сборка позволяет значительно ускорить создание мультиархитектурных образов, особенно когда требуется поддержка многих платформ. Для этого можно использовать несколько Buildx-билдеров, работающих на машинах с различными архитектурами:
| Bash | 1
2
3
4
5
6
7
| # Создание удалённого билдера на ARM64-машине
docker context create arm-server --docker "host=ssh://user@arm-server"
docker buildx create --name remote-arm64 --platform linux/arm64 arm-server
# Объединение нескольких билдеров в один
docker buildx create --name multi-builder --use
docker buildx create --name multi-builder --append arm-server |
|
Важным аспектом работы с мультиархитектурными образами является мониторинг размера и производительности. Нередко образы для разных архитектур могут существенно различаться по объёму:
| Bash | 1
2
3
| # Анализ размера образов для различных архитектур
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | grep arm64
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | grep amd64 |
|
Для ситуаций, когда нужно выборочно обновлять образы только для определённых архитектур, можно использовать следующий подход:
| Bash | 1
2
3
4
| # Обновление только ARM64-версии в мультиархитектурном манифесте
docker pull username/app:latest-arm64
docker manifest create --amend username/app:latest username/app:latest-amd64 username/app:latest-arm64
docker manifest push username/app:latest |
|
Типичные проблемы при работе с мультиархитектурными образами включают:
1. Различия в доступности пакетов и библиотек для разных архитектур.
2. Проблемы совместимости при использовании нативных расширений языков программирования.
3. Несогласованность версий зависимостей между архитектурами.
Решение этих проблем часто требует индивидуального подхода к каждой архитектуре через условные конструкции в Dockerfile:
| Bash | 1
2
3
4
5
6
7
8
| FROM --platform=$TARGETPLATFORM python:3.10-slim
# Установка платформо-зависимых библиотек
RUN if [ "$(uname -m)" = "aarch64" ]; then \
apt-get update && apt-get install -y --no-install-recommends libjemalloc2; \
else \
apt-get update && apt-get install -y --no-install-recommends libtcmalloc-minimal4; \
fi |
|
Важным элементом зрелой стратегии мультиархитектурных образов является включение тестирования в процесс сборки. Можно автоматизировать запуск тестов для каждой архитектуры:
| Bash | 1
2
3
4
5
6
7
8
9
10
| FROM --platform=$TARGETPLATFORM app-base AS builder
[H2]... Сборка приложения[/H2]
FROM --platform=$TARGETPLATFORM app-base AS tester
COPY --from=builder /app /app
RUN cd /app && ./run-tests.sh
FROM --platform=$TARGETPLATFORM app-runtime
COPY --from=builder /app /app
# ... Финальный образ |
|
Такой подход гарантирует, что все архитектурные варианты образа работоспособны перед публикацией.
Производительность и оптимизация
Переход на ARM64-архитектуру открывает новые горизонты оптимизации производительности контейнеров. Однако для получения максимальной выгоды требуется специфический подход, учитывающий особенности этой архитектуры. Рассмотрим ключевые методы тестирования, измерения и улучшения производительности Docker-контейнеров на платформе ARM64.
Начнём с базовых инструментов для измерения производительности. Для сравнительного тестирования контейнеров полезно использовать набор стандартных бенчмарков:
| Bash | 1
2
3
4
5
6
7
8
| # Тест CPU-производительности с sysbench
docker run --rm --platform=linux/arm64 alpine sh -c "apk add --no-cache sysbench && sysbench cpu run"
# Тест I/O-производительности
docker run --rm --platform=linux/arm64 alpine sh -c "apk add --no-cache fio && fio --name=test --rw=randread --size=100m --direct=1 --bs=4k --runtime=60 --minimal"
# Тест производительности сети
docker run --rm --network=host nicolaka/netshoot iperf3 -c iperf.server.address |
|
Для комплексной оценки можно использовать Docker Bench:
| Bash | 1
2
3
| git clone https://github.com/docker/docker-bench
cd docker-bench
./docker-bench.sh |
|
Важно проводить сравнительное тестирование между ARM64 и x86_64 для одинаковых рабочих нагрузок. Это даёт представление о реальных различиях и помогает принимать решения о миграции:
| Bash | 1
2
3
4
5
6
7
| # Скрипт для сравнения производительности на разных архитектурах
for arch in "linux/amd64" "linux/arm64"; do
echo "Testing $arch..."
docker run --rm --platform=$arch \
-v $(pwd)/test:/test benchmark:latest \
/test/run-benchmark.sh
done |
|
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
| # Установка инструментов для тестирования
apt-get update && apt-get install -y stress-ng sysbench
# Тестирование CPU
stress-ng --cpu 4 --cpu-method all --metrics-brief -t 60s
# Тестирование памяти
sysbench memory --memory-block-size=1K --memory-total-size=100G run
# Измерение производительности I/O
sysbench fileio --file-total-size=1G prepare
sysbench fileio --file-total-size=1G --file-test-mode=rndrw run
sysbench fileio --file-total-size=1G cleanup |
|
Для более специфичных Docker-ориентированных метрик полезен инструмент docker stats, который показывает потребление ресурсов контейнерами в реальном времени:
| Bash | 1
2
3
4
5
| # Мониторинг всех запущенных контейнеров
docker stats
# Мониторинг конкретного контейнера с форматированным выводом
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}" my_container |
|
Альтернативный, более детальный подход — использование cAdvisor, который предоставляет исчерпывающую информацию о ресурсах:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
| # Запуск cAdvisor в контейнере
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
gcr.io/cadvisor/cadvisor:latest |
|
При сравнении производительности ARM64 и x86_64 контейнеров особенно интересны некоторые наблюдения. Контейнеры на ARM64 обычно показывают лучшую энергоэффективность — при аналогичной нагрузке они потребляют меньше энергии. Это предоставляет существенные преимущества в крупных кластерах, где затраты на электроэнергию и охлаждение составляют значительную часть операционных расходов.
Интересный эксперимент провела команда Ampere Computing, тестируя Nginx на идентичных по характеристикам системах с ARM64 и x86_64. Они обнаружили, что ARM64-версия справляется с примерно на 15-20% большим количеством запросов при одинаковом энергопотреблении. Причём разница становится заметнее при увеличении количества параллельных соединений, что указывает на лучшую масштабируемость ARM64 в ситуациях с высокой конкурентностью.
Для оптимизации контейнеров под ARM64 существует несколько ключевых стратегий. Первая — правильный выбор базового образа. Alpine Linux часто оказывается отличным выбором для ARM64 благодаря своей легковесности:
| Bash | 1
2
3
4
5
6
7
8
9
| # Используем официальный Alpine для ARM64
FROM alpine:3.16
# Устанавливаем только необходимые пакеты
RUN apk add --no-cache python3 py3-pip
# Для минимизации слоёв объединяем команды
RUN pip3 install --no-cache-dir requests && \
pip3 install --no-cache-dir numpy |
|
Вторая стратегия — настройка ограничений ресурсов с учётом особенностей ARM64. В отличие от x86_64, ARM-процессоры часто имеют асимметричные ядра (например, big.LITTLE), что требует специфического подхода к распределению ресурсов:
| Bash | 1
2
3
4
5
6
7
8
| # Запуск контейнера с ограничением ресурсов, специфичным для ARM64
docker run -d \
--cpus=2 \
--memory=1g \
--cpu-shares=1024 \
--cpuset-cpus="0,4" \
--name arm64_optimized \
my_app:latest |
|
Параметр --cpuset-cpus особенно полезен на ARM64-системах с гетерогенными ядрами. Привязывая высоконагруженные контейнеры к производительным ядрам, можно существенно повысить скорость их работы, в то время как менее требовательные службы могут работать на энергоэффективных ядрах.
Третья стратегия касается параметров компиляции. Для достижения наилучшей производительности на ARM64 стоит использовать специфические флаги компилятора. В случае с GCC:
| Bash | 1
2
| # Оптимизированная сборка для современных ARM64 процессоров
gcc -mcpu=native -O3 -pipe -fomit-frame-pointer -ftree-vectorize myapp.c -o myapp |
|
Для Go-приложений, которые часто используются в контейнерах, также есть специфические оптимизации:
| Bash | 1
2
3
4
5
6
7
8
9
10
| FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
# Оптимизации для ARM64
ENV CGO_ENABLED=0 GOOS=linux GOARCH=arm64 GOARM=8
RUN go build -ldflags="-s -w" -o server .
FROM alpine:3.16
COPY --from=builder /app/server /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/server"] |
|
Флаг -ldflags="-s -w" удаляет отладочную информацию, что уменьшает размер бинарного файла. Это критично для ARM64, где в некоторых случаях (особенно на устройствах вроде Raspberry Pi) объём памяти может быть ограничен.
Особого внимания заслуживают параметры JVM для контейнеров с Java-приложениями. На ARM64 эффективнее работают определённые сборщики мусора:
| Bash | 1
2
3
4
| # Оптимальные настройки JVM для ARM64
docker run -d \
-e "JAVA_OPTS=-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:InitiatingHeapOccupancyPercent=70" \
my-java-app:latest |
|
Интересно, что G1GC (Garbage-First Garbage Collector) часто показывает лучшие результаты на ARM64, чем традиционный ParallelGC, который нередко предпочтительнее на x86_64.
Профилирование и узкие места
Для выявления узких мест в производительности контейнеров на ARM64 полезен инструмент perf, адаптированный для этой архитектуры:
| Bash | 1
2
3
4
5
6
| # Установка perf на ARM64 Ubuntu
sudo apt install linux-tools-common linux-tools-generic
# Профилирование процесса внутри контейнера
perf record -p $(docker inspect --format '{{.State.Pid}}' container_name) -g
perf report |
|
Однако стоит учитывать, что некоторые особенности ARM64 могут затруднять точное профилирование. Например, измерение плотности кэш-промахов может давать результаты, отличающиеся от аналогичных на x86_64 из-за различной организации кэш-памяти. Для регулярного мониторинга контейнеров в продакшн среде на ARM64 хорошо себя зарекомендовала связка Prometheus и Grafana:
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| # docker-compose.yml для стека мониторинга на ARM64
version: '3'
services:
prometheus:
image: prom/prometheus:v2.37.0
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
node-exporter:
image: prom/node-exporter:v1.3.1
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.45.0
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
grafana:
image: grafana/grafana:9.1.0
ports:
- 3000:3000 |
|
При настройке сбора метрик на ARM64 стоит обратить особое внимание на счётчики производительности CPU, которые могут отличаться от типичных для x86_64. Например, для отслеживания энергопотребления на ARM64 доступны специфические метрики через интерфейс ACPI или через собственный ARM Energy Probe.
Сравнительные бенчмарки реальных приложений между ARM64 и x86_64 демонстрируют интересные различия. Для CPU-интенсивных нагрузок, таких как компиляция или криптографические операции, современные ARM64-процессоры уже достигают паритета или даже превосходят x86_64 аналоги в одинаковом ценовом сегменте. Особенно ярко это проявляется в многопоточных нагрузках, где ARM64 демонстрирует лучшую масштабируемость.
| Bash | 1
2
3
4
5
6
| # Пример бенчмарка на сжатие файлов
for arch in amd64 arm64; do
docker run --platform linux/$arch alpine:3.16 sh -c "
time (dd if=/dev/zero bs=1M count=1000 | gzip -9 > /dev/null)
"
done |
|
В бенчмарках веб-серверов ARM64 часто обходит x86_64 по максимальному количеству запросов в секунду при одинаковом энергопотреблении. Например, тесты NGINX на серверах AWS Graviton3 показывают примерно на 25% больше RPS (запросов в секунду) по сравнению с эквивалентными по стоимости x86_64 инстансами. Для баз данных картина не так однозначна. PostgreSQL и MySQL на ARM64 обычно демонстрируют производительность на уровне 90-105% от аналогичных x86_64 систем. Однако специфические нагрузки, требующие расширенных векторных инструкций, могут работать медленнее из-за различий в SIMD-возможностях архитектур.
Ещё одним фактором, влияющим на производительность, является разная эффективность файловых систем. OverlayFS, используемая Docker по умолчанию, показывает хорошие результаты на ARM64, но для специфических нагрузок стоит рассмотреть альтернативы:
| Bash | 1
2
3
4
5
6
7
| # Настройка альтернативного storage-driver
cat << EOF > /etc/docker/daemon.json
{
"storage-driver": "fuse-overlayfs"
}
EOF
systemctl restart docker |
|
fuse-overlayfs может показывать лучшую производительность на некоторых ARM64-системах, особенно в случаях с большим количеством небольших файлов.
Наконец, для достижения максимальной производительности на ARM64 критично обеспечить соответствующую сетевую конфигурацию. В контейнерных окружениях сеть часто становится узким местом, и ARM64 не исключение. Оптимизировать её можно с помощью настройки сетевых параметров ядра:
| Bash | 1
2
3
4
5
6
7
8
| # Настройка сетевого стека для высокопроизводительных контейнеров на ARM64
cat << EOF > /etc/sysctl.d/99-network-tuning.conf
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_fastopen = 3
EOF
sysctl --system |
|
Эти настройки особенно эффективны для ARM64-систем, ориентированных на обработку большого количества сетевых соединений, таких как балансировщики нагрузки или веб-серверы.
Практический опыт и будущее ARM64-контейнеризации
Типичный миграционный процесс включает несколько ключевых этапов:
1. Аудит текущей инфраструктуры.
2. Проверка совместимости используемых образов с ARM64.
3. Тестирование в изолированной среде.
4. Поэтапное развёртывание в продакшн.
5. Мониторинг и оптимизация.
Интересный случай представила компания Datadog, мигрировавшая часть своей инфраструктуры обработки метрик на ARM64. Используя AWS Graviton2, они смогли сократить расходы примерно на 40% при сохранении аналогичной производительности. Ключом к успеху стало изначальное создание тестовой среды, где каждый сервис проверялся на совместимость и производительность, прежде чем принималось решение о переносе.
Особого внимания при миграции заслуживают несколько типичных сложностей:
1. Проприетарные компоненты без поддержки ARM64 — иногда единственным решением становится сохранение гибридной инфраструктуры или поиск альтернативных решений.
2. Сервисы с нативными расширениями — многие языки программирования используют C/C++ расширения, которые требуют пересборки для ARM64.
3. Оркестрация разнородных кластеров — при миграции часто возникает потребность в одновременном управлении узлами с разными архитектурами.
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Пример Kubernetes-манифеста с поддержкой разных архитектур
apiVersion: v1
kind: Pod
metadata:
name: mixed-arch-example
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
containers:
- name: main-app
image: myapp:latest
resources:
limits:
cpu: "1"
memory: "1Gi" |
|
Подобные техники позволяют постепенно вводить ARM64-узлы в существующую x86_64-инфраструктуру, контролируя размещение специфических рабочих нагрузок.
Многие организации сообщают о значительных преимуществах после завершения миграции. Помимо очевидной экономии на энергопотреблении (что особенно заметно в крупных кластерах), отмечается улучшение соотношения цена/производительность, особенно для сетевых приложений и сервисов с высоким уровнем параллелизма.
В качестве практического совета: не стоит недооценивать необходимость обучения команды. Хотя Docker на ARM64 функционально идентичен x86_64-версии, инженеры часто сталкиваются с неожиданными проблемами при отладке и оптимизации.
Перспективы ARM64 в мире контейнеризации
Будущее ARM64 в контейнерной экосистеме выглядит многообещающим по ряду причин. Тенденции последних лет демонстрируют стремительное увеличение числа систем на этой архитектуре — от персональных компьютеров (Apple M-серия) до серверов высокой плотности. Вслед за оборудованием активно развивается программное обеспечение, всё больше проектов обеспечивают полноценную поддержку ARM64. К важнейшим тенденциям развития контейнеризации на ARM64 можно отнести:
1. Углубление нативной поддержки в инструментах разработки и CD/CI-системах. GitHub Actions, GitLab CI, Jenkins и другие инструменты непрерывной интеграции предлагают всё более удобные методы для тестирования и сборки мультиархитектурных контейнеров.
2. Сдвиг в сторону ARM64 как платформы по умолчанию для определённых типов рабочих нагрузок. Особенно заметно это в обработке данных и машинном обучении, где энергоэффективность критична из-за масштабов вычислений.
3. Развитие специфичных для ARM64 оптимизаций в популярных образах Docker. Всё больше готовых образов поставляются с настройками, учитывающими особенности архитектуры.
4. Появление контейнерных решений, изначально ориентированных на гетерогенные среды выполнения. Например, разработки в области "Smart Containers", автоматически адаптирующихся к архитектуре хоста не только на уровне бинарных файлов, но и настроек выполнения.
Интересная перспектива открывается в области edge-computing и IoT, где ARM64-устройства становятся доминирующей платформой. Контейнеризация на таких устройствах позволяет применять те же практики разработки и развёртывания, что и в классических облачных средах, создавая единую экосистему от центров обработки данных до периферийных устройств.
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # Пример автоматического определения и оптимизации для текущей архитектуры
#!/bin/bash
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
echo "Оптимизация для ARM64..."
# Установка оптимизированных для ARM64 компонентов
apt install -y libfftw3-dev
# Настройка параметров для ARM64
sed -i 's/CFLAGS=/CFLAGS=-march=armv8-a+crc+crypto /g' Makefile
else
echo "Оптимизация для x86_64..."
# Установка оптимизированных для x86_64 компонентов
apt install -y libfftw3-dev libtbb-dev
# Настройка параметров для x86_64
sed -i 's/CFLAGS=/CFLAGS=-march=x86-64-v3 /g' Makefile
fi
make -j$(nproc) |
|
Такие скрипты, встроенные в процесс сборки контейнеров, становятся стандартной практикой в мультиархитектурных проектах.
В контексте систем оркестрации контейнеров, таких как Kubernetes, наблюдается тенденция к лучшей интеграции с гетерогенными кластерами. Современные версии Kubernetes позволяют более гибко управлять размещением рабочих нагрузок с учётом архитектуры, оптимизируя использование ресурсов в смешанных средах. Провайдеры облачных услуг всё активнее предлагают ARM64-инстансы наравне с традиционными x86_64, причём часто с более привлекательным соотношением цена/производительность. AWS, Google Cloud, Oracle Cloud, Azure — все они расширяют предложения ARM64-виртуальных машин и контейнерных сервисов.
Нельзя не отметить и развитие специализированного оборудования для контейнерных нагрузок на базе ARM64. Появляются серверные системы, оптимизированные специально для запуска контейнеров, с аппаратной поддержкой виртуализации, улучшенной сетевой подсистемой и энергоэффективными профилями производительности.
Docker на ARM64 — уже не экзотика, а мейнстрим, который продолжает набирать обороты. С каждым циклом разработки технологические барьеры снижаются, а экосистема расширяется. Для организаций и разработчиков сегодня уже не стоит вопрос "стоит ли поддерживать ARM64?", а скорее "как наиболее эффективно включить ARM64 в существующую инфраструктуру?". В конечном счёте, как показывает практика, большинство технических сложностей при переходе на ARM64 преодолимы с помощью описанных в данном руководстве подходов. Грамотное использование мультиархитектурных образов, эмуляции там, где она необходима, и оптимизация для конкретных сценариев позволяют в полной мере реализовать потенциал этой архитектуры в контейнерном мире.
Где хранятся данные docker контейнеров? Привет!
Пользуюсь Docker Desktop for Windows, Docker Engine v19.03.8.
До вчера я думал, что... Как сделать несколько Docker контейнеров на разных прокси? Всем привет! Задача следующая, нужно запустить 2 приложения на разных прокси (получать интернет с... DNS внутри контейнеров Docker Здравствуйте, возникла проблема с dns внутри docker контейнеров, изнутри контейнеров не работает... Docker, IP Host -> Docker responce есть некий сервис достучатся к которому возможно по IP (но только через VPN),
задался вопросом, а... Не могу создать образ Docker, подскажите как сделать. Вылазить ошибка. docker-file. Новичок в докере Если можно обясните как строить докер файл. столько видео посмотрел ничего не понял
Step 4/5 :... Docker-compose push to Docker Hub Всем привет!
Я заготовил docker-compose.yml, но есть несколько зависимостей в папочках
.
├──... Docker запуск сервисов Всем привет, у меня есть несколько контейнеров с линухами, проблема в том что при перезапуске ... Docker загрузка образа, и запуск Первым делом мы можем зарегестрироваться на сайте https://www.docker.com/
Регестрация предоставит... Docker загрузка образа, и запуск Первым делом мы можем зарегестрироваться на сайте https://www.docker.com/
Регестрация предоставит... Запуск IBM Domino в Docker контейнере
Запуск docker образа в kubernetes Контейнер в docker запускаю так:
docker run --cap-add=SYS_ADMIN -ti -e "container=docker" -v... Запуск composer в docker Здравствуйте. Начал осваивать docker. Пытаюсь поместить в docker-compose свой рабочий проект.
...
|