Arm64 ve x86 sunucularda çok mimarili Docker imajları derleyin
SSH üzerinden iki düğümlü bir Buildx derleyicisiyle Arm64 ve x86 sunucuda yerel derleyerek linux/amd64 ve linux/arm64 için tek bir Docker etiketi yayımlayın.
- İleri
- 25 dk okuma
- Güncellendi
Bu sayfada
Çok platformlu imaj, bir linux/amd64 ve bir linux/arm64 varyantı içeren tek bir etikettir; Docker her sunucuda doğru olanı çeker. Bunu derlemenin en hızlı yolu yereldir: arm64 yarısı bir Arm64 VPS veya VDS'te, amd64 yarısı bir x86 sunucuda, tek bir Buildx derleyicisinin iki düğümü olarak birleştirilir. Bu rehber bunu SSH üzerinden kurar.
Başlamadan önce
- İkisinde de Docker'ın deposundan kurulmuş Docker Engine olan bir Arm64 VPS veya VDS ve bir x86 sunucu (örneğin bir Linux VPS); bkz. Ubuntu'ya Docker kurma.
- İki sunucuda da Docker'ı kullanabilen (
dockergrubunun üyesi), SSH ile anahtarla ulaşılabilen bir kullanıcı; bkz. SSH anahtarları. - Komutları çalıştıracağınız bir derleme makinesi: iki sunucudan biri ya da Docker ve Buildx kurulu kendi bilgisayarınız.
- Bir konteyner kayıt defteri hesabı; bir kez
docker login registry.example.comile giriş yapın.
Örneklerde x86 sunucu 203.0.113.20, Arm64 sunucu 203.0.113.30 ve kullanıcı builder'dır.
1. adım: İki Docker motorunu SSH üzerinden erişilebilir yapın
Derleme makinesinde her sunucu için bir Docker bağlamı (context) oluşturun:
docker context create node-amd64 --docker "host=ssh://builder@203.0.113.20"
docker context create node-arm64 --docker "host=ssh://builder@203.0.113.30"
docker context lsDoğrulama: her bağlam doğru mimariyle yanıt verir:
docker --context node-amd64 info --format '{{.Architecture}}'
docker --context node-arm64 info --format '{{.Architecture}}'İlki x86_64, ikincisi aarch64 yazar.
2. adım: İki yerel düğümlü tek bir derleyici oluşturun
docker buildx create --use --name multi node-amd64
docker buildx create --append --name multi node-arm64
docker buildx inspect --bootstrapDoğrulama: docker buildx inspect biri platformları arasında linux/amd64, diğeri linux/arm64 olan iki düğüm listeler.
3. adım: İki platformu derleyip itin
Dockerfile dosyanızın bulunduğu klasörde:
docker buildx build --platform linux/amd64,linux/arm64 -t registry.example.com/team/app:1.0 --push .Buildx her platformu onu yerel olarak derleyen düğüme gönderir ve iki varyantı içeren tek bir etiketi iter.
Doğrulama:
docker buildx imagetools inspect registry.example.com/team/app:1.0Çıktı linux/amd64 ve linux/arm64 için bildirimleri listeler.
İkinci sunucu olmadan: emülasyon
Yalnızca bir sunucunuz varsa Buildx diğer mimariyi QEMU emülasyonu altında derleyebilir. Emülatörleri bir kez kaydedin, ardından varsayılan derleyiciyle 3. adımdaki gibi derleyin:
docker run --privileged --rm tonistiigi/binfmt --install allDerlenen dillerin ve büyük imajların yerel derlemeden kat kat yavaş derlenmesini bekleyin.
İkisinde de çalışan Dockerfile'lar yazın
- İki platform için de yayımlanmış temel imajlar kullanın (resmi imajların çoğu öyledir).
- Mimariye özel dosyaları
amd64yazarak değil, Buildx'in sağladığıTARGETARCHgibi derleme argümanlarıyla indirin. - Bilgisayarınızda derlenmiş ikili dosyaları kopyalayarak değil, imajın içindeki araç zinciriyle derleyin.
Sorun giderme
Bir bağlam üzerinden permission denied while trying to connect to the Docker daemon socket. SSH kullanıcısı o sunucuda docker grubunda değil; ekleyin ve yeniden oturum açın.
docker buildx inspect yalnızca bir düğüm gösteriyor. --append adımı başarısız oldu; bağlam adını docker context ls ile kontrol edip yeniden çalıştırın.
Bir RUN adımında exec format error. Derleme aşaması yanlış mimari için bir ikili dosya kullanıyor, çoğunlukla indirilmiş bir dosya. Dosyayı TARGETARCH'a göre seçin.
İtme unauthorized ile başarısız oluyor. Derleme makinesinde kayıt defteri için docker login çalıştırın.
Sonraki adımlar
- Arm64 temelleri: Arm64 VPS ve VDS: başlangıç.
- İmajları çalıştırın: Docker Compose temelleri.
Sık sorulan sorular
Neden her şeyi QEMU emülasyonuyla derlemiyoruz?
Emülasyon ikinci bir sunucu olmadan çalışır, ama emülasyon altında derlemek kat kat yavaştır. Her mimari için bir yerel düğümle imajın her yarısı tam hızda derlenir.
Docker Desktop gerekli mi?
Hayır. Derleme makinesinde ve iki düğümde de Ubuntu ve Debian'da Docker'ın deposundan kurulan Buildx eklentili Docker Engine yeterlidir.
İmajlar nerede saklanır?
Bir konteyner kayıt defterinde (registry). Çok platformlu bir derleme her iki varyantı içeren tek bir bildirim listesini kayıt defterine iter; bu yüzden derleme --push ve kayıt defteri girişi gerektirir.
Bir CI sistemi aynı derleyiciyi kullanabilir mi?
Evet. Derleme makinesindeki kendi barındırdığınız bir CI çalıştırıcısı, kullanıcısı iki düğüme de anahtarla SSH üzerinden ulaşabildiği sürece derleyiciyi adıyla kullanabilir.