Önce arm64, gerektiğinde amd64
M serisi bir Mac, Linux konteynerlerini arm64 Linux çekirdeğinde çalıştırır. Çok mimarili bir imajı (postgres, redis, node, python ve çoğu resmi imaj) çektiğinizde Docker otomatik olarak arm64 çeşidini seçer ve yerel hızda çalıştırır.
Bazı imajlar hâlâ yalnızca amd64 için sunulur: eski kurum içi imajlar, tedarikçi araçları ve platform bayrağı olmadan Intel dizüstü bilgisayarda veya CI çalıştırıcısında derlenenler. Bunlar için platformu açıkça belirtin:
services:
legacy-tool:
image: example/amd64-only-tool:1.4
platform: linux/amd64 Oxcart amd64 imajlarını Apple'ın x86-64 çeviricisi Rosetta üzerinden çalıştırır; Buildx, motorun yerel olarak çalıştıracağı amd64 imajlarını derleyip yükleyebilir. Konteynerin gerçekte hangi mimaride çalıştığını docker run --rm --platform linux/amd64 alpine uname -m ile kontrol edin; çıktı x86_64 olur.
| Durum | Yapılması gereken |
|---|---|
| İmajın arm64 sürümü var | Hiçbir şey. Compose arm64 çeşidini çeker. |
| İmaj yalnızca amd64 için | Servise platform: linux/amd64 ekleyin. |
| amd64 sunuculara dağıtım yapıyorsunuz | Göndereceğiniz imajı docker buildx build --platform linux/amd64 ile derleyin; yığınınız izin veriyorsa yerel çalışmada arm64 kullanmaya devam edin. |
| "exec format error" | Bir ikili dosya konteynerin mimarisiyle eşleşmiyor. Platformu ayarlayın veya arm64 için yeniden derleyin. |
Tam bir örnek
Postgres veritabanı, mevcut klasörden derlenen ve veritabanı sağlıklı olana kadar bekleyen bir API ve profil aracılığıyla etkinleştirilen yalnızca amd64 için bir araç:
services:
db:
image: postgres:17-alpine
environment:
POSTGRES_PASSWORD: dev
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 2s
timeout: 3s
retries: 15
api:
build: .
init: true
environment:
DATABASE_URL: postgres://postgres:dev@db:5432/postgres
ports:
- "127.0.0.1:8080:8080"
depends_on:
db:
condition: service_healthy
legacy-tool:
image: example/amd64-only-tool:1.4
platform: linux/amd64
profiles: ["tools"]
volumes:
pgdata: Her bölümün görevi:
healthcheck, Postgres'in yalnızca başlamış olmasını değil, gerçekten bağlantı kabul ettiğini Compose'a bildirir.depends_on: condition: service_healthy, denetim başarılı olana kadar API'yi bekletir.init: true, sinyallerin sürecinize ulaşması ve zombi süreçlerin temizlenmesi için PID 1 olarak küçük bir init çalıştırır. Böylecedocker stop, zaman aşımını beklemek yerine temiz biçimde sonlanır.127.0.0.1:8080:8080, API'yi yalnızca Mac'in loopback adresinde yayınlar. Adres belirtilmezse yayınlanan port Mac'in tüm IPv4 adreslerinde dinler ve ağınızdaki diğer makineler ona erişebilir.pgdataadlandırılmış bir birimdir: verilerdocker compose downsonrasında kalır ve yalnızcadown -vile silinir.
Apple silicon üzerinde Compose yığını çalıştırın
- Araçları kontrol edin.
docker compose versionvedocker context showçalıştırın. Oxcart, docker CLI 29.9.0 ve Buildx 0.38.0 ile birlikte Docker Compose 5.6.0 sunar; bağlamının adıoxcarttır. - Compose dosyasını yazın. Uygulamanızın beklediği her servise
healthcheckekleyin ve bağımlı servisleridepends_on: condition: service_healthyile bekletin. - Başlatın ve sağlıklı durumu bekleyin.
docker compose up -d --build --waitçalıştırın. Komut, tüm servisler çalışır ve sağlıklı duruma geldiğinde döner; herhangi biri değilse başarısız olur. - Portları kontrol edin.
docker compose psçalıştırın veya Oxcart'ta Ports görünümünü açın; yayınlanan her portun hazır, beklemede veya başarısız olduğunu nedeniyle birlikte gösterir. - Geliştirmeye devam edin. Kodu düzenleyin ve
docker compose up -d --build apiçalıştırın. Değişmeyen derleme adımları önbellekten gelir. - Ortamı kaldırın. Konteynerleri durdurup kaldırmak için
docker compose down, adlandırılmış birimleri de silmek içindocker compose down -vçalıştırın.
Daha hızlı yeniden derlemeler
Compose, Buildx ve BuildKit üzerinden derler. Dockerfile'da bağımlılık kurulumlarını COPY . . öncesine yerleştirin; böylece kod değişikliği, bu satırın üzerindeki önbellekli tüm katmanları yeniden kullanır. Oxcart'ta ölçüm projesinin önbellekli derlemesi 121 ms, yerel bağlamla önbelleksiz derlemesi 341 ms sürdü: her ikisinde de test ettiğimiz üç çalışma zamanı arasında en hızlıydı. Kısa geliştirme döngülerinin kazancı birikir: docker run --rm 42 ms, 20 konteyneri durdurup kaldırmak 77 ms sürdü.
Oxcart 0.1.2, beraberindeki docker 29.9 istemcisiyle 2026-10-10 tarihinde ölçüldü; diğer çalışma zamanları aynı günün daha erken saatlerinde, aynı Mac ve test düzeneğinde docker 29.4 ile ölçüldü. Apple M5 Max, her birine 8 CPU ve 12 GiB, çalışma zamanları tek tek çalıştırıldı.
Portlar, Mac ve diğer servisler
- Port sözdizimi Docker'ınkiyle aynıdır: TCP ve UDP, geçici portlar (
"127.0.0.1::8080") ve IPv4 ile IPv6 üzerinde dinlemek için"[::]:8080:80". TCP ve UDP aynı host port numarasını paylaşabilir. - Konteynerden Mac'e erişim:
host.docker.internal, konteynerlerden ve derleme adımlarından TCP üzerinden Mac'in127.0.0.1adresine bağlı servislere ulaşır. - Yerel kayıt deposu: bir kayıt deposu konteynerini 5000 portunda yayınlayın;
docker push localhost:5000/appona ulaşır. - Sidecar'lar:
network_mode: service:api, konteyneri başka bir servisin ağ ad alanına yerleştirir; böylece o servisinlocalhostadresini paylaşır.
VPN, DNS, güvenlik duvarları ve ağ yolunun nasıl korunduğu için Mac'te konteyner ağları rehberine bakın.
Adlandırılmış birimler ve bind mount'lar
Veritabanının veya derlemenin yoğun yazdığı her şey için adlandırılmış birimler kullanın: node_modules, paket önbellekleri, veritabanı dosyaları. Veriler motorun depolama alanında kalır; Oxcart'ta adlandırılmış birim 1.000 küçük dosya oluşturma, stat, okuma ve silme işlemini 17.8 ms içinde tamamladı; test ettiğimiz üç çalışma zamanı arasında en hızlısıydı.
Mac'inizde düzenlediğiniz kaynak kod için bind mount kullanın. Oxcart varsayılan olarak ana klasörünüzü, /private/tmp ve /private/var/folders yollarını konteynerlerle okuma-yazma erişimiyle paylaşır; Mac'teki düzenlemeler konteynerlerde, konteynerlerdeki değişiklikler Mac'te görünür. Bilmeniz gereken bir sınır: Mac'te yapılan dosya değişiklikleri konteynerlerin içinde inotify olayları üretmez; bu yüzden konteynerdeki dosya izleyicisi, editörünüzdeki değişiklikleri görmesi gerekiyorsa periyodik yoklama kullanmalıdır.
Sorun giderme
| Belirti | Neden | Çözüm |
|---|---|---|
exec format error | arm64 konteynerde amd64 ikili dosya veya tersi | platform: linux/amd64 veya arm64 için yeniden derleme |
| "no matching manifest for linux/arm64" | İmajın arm64 çeşidi yok | platform: linux/amd64 |
| "address already in use" | Host portunu başka bir süreç veya konteyner kullanıyor | Host portunu değiştirin veya Oxcart'ın Ports görünümünde sahibini bulun |
| Yayınlanan portta bağlantı reddedildi | Sunucu konteynerin içinde 127.0.0.1 üzerinde dinliyor veya henüz hiçbir şey dinlemiyor | 0.0.0.0 üzerinde dinleyin; sağlık denetimi ekleyin ve --wait kullanın |
| Uygulama veritabanı hazır olmadan başlıyor | Koşulsuz depends_on yalnızca başlamayı bekler | condition: service_healthy ve healthcheck |
docker stop 10 s bekliyor | PID 1, SIGTERM'i yok sayıyor | init: true veya uygulamada SIGTERM işleme |
Sorular
Docker Compose, Apple silicon Mac'lerde çalışır mı?
Evet. Compose arm64 üzerinde yerel olarak çalışır ve çoğu resmi imaj arm64 çeşitleri sunar. Oxcart, Docker Compose 5.6.0 içerir; uyumluluk kontrolleri birden fazla servisi, sağlık denetimi bağımlılıklarını, up --wait, build, down, servis adına göre DNS, init: true ve network_mode: service: özelliklerini kapsar.
M serisi Mac'te amd64 (x86-64) imajı nasıl çalıştırılır?
Serviste platform: linux/amd64 ayarlayın veya docker run komutuna --platform linux/amd64 geçin. Oxcart amd64 imajlarını Rosetta üzerinden çalıştırır. Varsa yerel arm64 imajını tercih edin; arm64 derlemesi olmayan imajlarda amd64 kullanın.
"exec format error" ne demektir?
Konteyner, çalıştığı CPU mimarisinden farklı bir mimari için derlenmiş ikili dosyayı çalıştırmaya çalıştı. Genellikle imaj veya içindeki bir ikili dosya yalnızca amd64 içindir. Servise platform: linux/amd64 ekleyin veya imajı arm64 için yeniden derleyin.
Konteyner çalışırken uygulamam neden "connection refused" diyor?
En yaygın neden, sunucunun konteynerin içinde 127.0.0.1 üzerinde dinlemesidir. Yayınlanan portlar konteynerin loopback adresine değil, ağ arayüzüne ulaşır; bu yüzden sunucu 0.0.0.0 üzerinde dinlemelidir. Oxcart'ın Ports görünümü bu durumu açıkça belirtir.
Bir servisin başka bir servis hazır olana kadar beklemesini nasıl sağlarım?
Bağımlı olunan servise healthcheck, bekleyecek servise depends_on: { db: { condition: service_healthy } } ekleyin. Böylece docker compose up --wait yalnızca tüm servisler sağlıklı olduğunda döner.
Konteynerler Mac'imde çalışan sunucuya ulaşabilir mi?
Evet. host.docker.internal kullanın: Oxcart'ta konteynerlerden ve derlemelerden TCP üzerinden Mac'in 127.0.0.1 adresine bağlı servislere ulaşır.
Veritabanları için adlandırılmış birimler mi, bind mount mu kullanmalıyım?
Veritabanı verileri için adlandırılmış birim kullanın: motorun kendi depolama alanında bulunur. Mac'te düzenlediğiniz kaynak kod için bind mount kullanın. Oxcart'ta adlandırılmış birim 1.000 küçük dosya oluşturma, stat, okuma ve silme işlemini 17.8 ms içinde tamamladı.
Kaynaklar ve yöntem
- Uyumluluk: Oxcart'ın doğrulanmış entegrasyon yolları (docker CLI, sağlık denetimi bağımlılıklarıyla Compose,
up --wait,init: true,network_mode: service:, Buildx, Rosetta üzerinden amd64). - Hız verileri: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU ve 12 GiB, ısınma sonrası beş örneğin medyanları; diğer çalışma zamanları aynı günün daha erken saatlerinde, aynı Mac ve test düzeneğinde docker 29.4 istemcisiyle ölçüldü.
- Birlikte gelen araçlar: docker 29.9.0, Docker Compose 5.6.0, Buildx 0.38.0.