Skip to content

Multi-Architecture Builds

Multi-Architecture Builds

Guide for building and deploying Cbox images across AMD64 (x86_64) and ARM64 (aarch64) platforms.

Platform Support

Cbox Base Images are built for both architectures:

Platform Architecture Examples
AMD64 x86_64 Intel/AMD servers, most cloud VMs
ARM64 aarch64 Apple Silicon (M1/M2/M3), AWS Graviton, Raspberry Pi 4+

Quick Start

Pull Multi-Arch Images

Docker automatically selects the correct architecture:

# Works on both AMD64 and ARM64
docker pull ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm

Build Multi-Platform Images

Use Docker Buildx for multi-architecture builds:

# Create builder instance (one-time setup)
docker buildx create --name multiarch --driver docker-container --use

# Build for both platforms
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myapp:latest \
  --push .

ARM64 Optimization

Apple Silicon (M1/M2/M3) Development

Cbox images run natively on Apple Silicon without emulation:

# docker-compose.yml for Apple Silicon
version: '3.8'

services:
  app:
    image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm
    platform: linux/arm64  # Native ARM64
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www/html

Performance tip: Native ARM64 images are 2-3x faster than emulated AMD64 on Apple Silicon.

AWS Graviton Deployment

For cost-effective AWS deployments on Graviton instances:

# ECS Task Definition
{
  "family": "cbox-app",
  "runtimePlatform": {
    "cpuArchitecture": "ARM64",
    "operatingSystemFamily": "LINUX"
  },
  "containerDefinitions": [
    {
      "name": "app",
      "image": "ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm",
      "portMappings": [
        { "containerPort": 80, "protocol": "tcp" }
      ]
    }
  ]
}

Cost savings: Graviton instances typically offer 20-40% better price/performance.

Building Custom Multi-Arch Images

Using Dockerfile.production Template

The production template supports multi-architecture builds out of the box:

# Build and push multi-platform image
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --target production \
  -t ghcr.io/yourorg/myapp:latest \
  -f templates/Dockerfile.production \
  --push .

CI/CD Multi-Platform Builds

GitHub Actions

name: Build Multi-Platform

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: linux-latest  # Use your CI provider's Linux runner
    steps:
      - uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to GHCR
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ghcr.io/${{ github.repository }}:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

GitLab CI

build:
  stage: build
  image: docker:24
  services:
    - docker:24-dind
  variables:
    DOCKER_BUILDKIT: 1
  before_script:
    - docker buildx create --use
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker buildx build
        --platform linux/amd64,linux/arm64
        --push
        -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        -t $CI_REGISTRY_IMAGE:latest .

Architecture-Specific Considerations

Extension Compatibility

All Cbox extensions are available on both architectures:

Extension AMD64 ARM64 Notes
OPcache Built-in
Redis PECL
APCu PECL
ImageMagick System package
GD Built-in
Xdebug PECL

Performance Differences

Workload AMD64 ARM64 Winner
PHP Execution Baseline ~5-15% faster ARM64
String Operations Baseline Similar Tie
JSON Processing Baseline ~10% faster ARM64
Image Processing Baseline Similar Tie
Memory Efficiency Baseline ~10-20% better ARM64

Image Sizes

Image AMD64 ARM64 Difference
php-fpm-nginx:8.4-bookworm ~70MB ~68MB ARM64 slightly smaller
php-fpm-nginx:8.4-debian ~150MB ~145MB ARM64 slightly smaller
php-fpm-nginx:8.4-bookworm-dev ~180MB ~175MB ARM64 slightly smaller

Troubleshooting

Emulation Performance Issues

If you see slow performance on Apple Silicon:

# Check if running under emulation
docker run --rm ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm uname -m
# Should output: aarch64 (not x86_64)

Fix: Ensure you're pulling ARM64 images:

# Force ARM64 architecture
docker pull --platform linux/arm64 ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm

Build Failures on ARM64

Some PECL extensions may need source compilation on ARM64:

# Example: Building custom extension for ARM64
FROM ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm

# Ensure build tools are available
RUN apt-get update && apt-get install -y $PHPIZE_DEPS

# Install extension from source
RUN pecl install some-extension && \
    docker-php-ext-enable some-extension && \
    apk del $PHPIZE_DEPS

Cross-Platform Testing

Test your image on both architectures locally:

# Test AMD64 build (on ARM64 machine)
docker run --platform linux/amd64 --rm myapp:latest php -v

# Test ARM64 build (on AMD64 machine)
docker run --platform linux/arm64 --rm myapp:latest php -v

Best Practices

1. Use Multi-Platform Manifests

Always build and push multi-platform images:

# Build manifest with both architectures
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myapp:v1.0.0 \
  --push .

2. Pin Architecture When Needed

For reproducibility in production:

# docker-compose.prod.yml
services:
  app:
    image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm
    platform: linux/amd64  # Pin to specific architecture

3. Cache Multi-Platform Builds

Use registry caching for faster CI builds:

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --cache-from type=registry,ref=myapp:cache \
  --cache-to type=registry,ref=myapp:cache,mode=max \
  -t myapp:latest \
  --push .

4. Test on Target Architecture

Always test on the deployment architecture:

# GitHub Actions: Test on ARM64 runner
jobs:
  test-arm64:
    runs-on: linux-arm64  # Use your CI provider's ARM64 runner
    steps:
      - uses: actions/checkout@v4
      - name: Test
        run: docker run --rm myapp:latest php artisan test

Kubernetes Multi-Architecture

Mixed Architecture Clusters

For clusters with both AMD64 and ARM64 nodes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cbox-app
spec:
  template:
    spec:
      # Allow scheduling on any architecture
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - amd64
                      - arm64
      containers:
        - name: app
          image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.4-bookworm

Architecture-Specific Scheduling

For workloads that perform better on specific architectures:

# Schedule on ARM64 nodes for cost optimization
spec:
  nodeSelector:
    kubernetes.io/arch: arm64

References


Need help? GitHub Discussions | Performance Tuning