Docker Multi Architecture Builds Running Containers on Different CPU Architectures
Learn how to build and run Docker images across ARM, x86, and other CPU architectures using Docker Buildx and multi-platform tooling
As containers become ubiquitous in development and deployment pipelines, the need to support multiple CPU architectures has grown — especially with the rise of ARM-based systems like Apple Silicon (M1/M2) and Raspberry Pi.
Docker offers powerful tools like Buildx and multi-platform support to build images that run seamlessly on different architectures like x86_64, arm64, and arm/v7.
In this post, we’ll explore how to create multi-architecture Docker builds, run them locally or in CI/CD, and publish universal images to Docker Hub or private registries.
Why Multi-Architecture Support?
- Cross-platform development (e.g., M1 Macs developing for x86)
- IoT and embedded devices (ARMv7/ARM64)
- Cloud-native portability across AWS Graviton, Azure ARM, etc.
- Unified images reduce image sprawl and simplify deployments
Tools You’ll Need
- Docker CLI (v20.10+ recommended)
- Docker Buildx (enabled by default in recent Docker versions)
- QEMU for emulation (used behind the scenes)
Install QEMU on Linux:
sudo apt install qemu-user-static
Step 1: Enable Buildx
To list and use Buildx:
docker buildx ls
docker buildx create --use --name multiarch-builder
docker buildx inspect --bootstrap
This ensures that Buildx uses a builder instance that supports cross-compilation.
Step 2: Build for Multiple Architectures
Use the --platform
flag with docker buildx build
:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t yourname/myimage:latest \
--push .
--push
: pushes the manifest and images to Docker Hub--load
: use this if you’re not pushing and want to load locally (for single-arch)
Step 3: Validate the Multi-Arch Image
Check the platforms included in your Docker image:
docker buildx imagetools inspect yourname/myimage:latest
You’ll see output listing all supported platforms.
Step 4: Emulate Different Architectures Locally
You can run ARM64 images on x86 (or vice versa) using QEMU:
docker run --rm --platform linux/arm64 yourname/myimage
Note: Performance may vary due to emulation overhead. Native builds are faster.
Example: Multi-Architecture Dockerfile
FROM alpine:3.18
RUN apk add --no-cache curl
CMD ["sh", "-c", "echo Running on $(uname -m); curl --version"]
Build it:
docker buildx build --platform linux/amd64,linux/arm64 -t yourname/testimage --push .
Optional: Build with GitHub Actions
Use Docker/setup-buildx-action in CI:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: $
password: $
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
tags: yourname/myimage:latest
Troubleshooting Tips
- Ensure QEMU is properly registered:
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- Use
--no-cache
to avoid architecture-specific layer reuse - Ensure base images support multiple architectures (e.g.,
alpine
,debian
)
Conclusion
Docker multi-architecture builds enable true platform portability — allowing developers to build once and run anywhere. Whether you’re targeting cloud ARM instances, edge devices, or hybrid environments, using Docker Buildx and the right strategies ensures consistent deployments across all CPU types.
Start building universal containers today to future-proof your applications for the heterogeneous infrastructure world.