Windows ve Linux için Cross-platform Docker Images
Cross-Platform Konteyner Challenge Challenge
Docker konteynerleri, yazılı-çalı-çözün-her yerde taşınabilirlik vaat ediyor, ancak gerçek şu ki Windows NT çekirdeği, Hyper-V izolasyonu ve NTFS hacimleri zaman daha çıplaktır.Bir Ubuntu ana sayfasında inşa edilmiş bir görüntü, bir Windows Server hostunda başarısız olur ve tam tersi, açık bir şekilde çapraz platform uyumluluğu için tasarlarken.
Bu yetersizlik ortaya çıkıyor çünkü bir konteyner resmi tam bir sanallaştırılmış makine değil. Bir Linux konteyner, ev sahibinin Linux çekirdeğini kullanıyor; Windows konteyneri, ev sahibinin Windows çekirdeğini kullanıyor.
Filo operatörleri ve platform mühendisleri bu nedenle platformda ayrı görüntüler üretip Docker'in çoklu-arşik açık özelliklerinden yararlanan stratejileri benimsemeli ve bu nedenle her host için doğru değişkene karar veren tek bir görüntü referansı sunmak zorundadır. Seçim sizin dağıtım modeliniz, kayıt desteğinize ve CI/CD olgunluğa bağlıdır.
Windows vs. Linux görüntüleri
Anahtarlı Coupling ve Base Image Selection
Her Docker görüntüsü Linux tabanlı (örneğin, işletim sistemi kütüphaneleri mevcut olduğunda) veya Windows tabanlı (e.g., 03) olarak başlar. Windows Server Core görüntüleri yaklaşık 1.5 GB ve Nano Server etrafında çalışırken, Windows'un görüntüyü değiştirir.
Windows konteynerleri aynı zamanda katı sürüm bağlayıcısı vardır: ev sahibi OS'nin bir inşaı için inşa edilen bir Windows konteyner resmi (örneğin, 20H2), farklı bir inşada çalıştırılamaz (örneğin, 21H2). Microsoft, bu şekilde, Linux API'leri ile daha uyumlu hale getirir, çünkü Linux işleme konsepti ile uyumludur.).
Filesystem ve İzinler
Linux görüntüleri POSIX izinlerini (kullanıcı, grup, diğer) kullanır ve durum duyarlı dosya yollarına güvenir. Windows görüntüleri ACL'lere (Eri Kontrol Listeleri) ve vakaya duyarlı yollar. Linux görüntüsü ile bir Windows uygulaması ile ilgili herhangi bir platform tasarımı, uygulama kodunuzu ve yapılandırma dosyalarını kullanarak elde etmek veya yükleme mektuplarına (örneğin, OS'ye uygun yollarınızı) uygun şekilde etkinleştirir.
Docker Buildx ile Çok-Kültürlü Görüntüler
Nasıl Buildx Works
Docker Buildx, her hedef mimarisi için görüntüyü derlemek için önerilen görüntüler oluşturmak için önerilir.Genel olarak Windows ve Linux düğümleri oluşturmanız gerekir, çünkü QEMU tabanlı emulation ( Linux-on-Linux çapraz-compilation) veya yerel inşaatçılara ayrı düğümler sunmak için ayrı düğümler oluşturabilirsiniz.For Windows and Linux cross- platformları için, genellikle yerel Windows ve Linux düğümlere ihtiyacınız vardır, çünkü QEMU Windows çekirdeği taklit edemez.
Buildx çok-arşik bir değişken ortaya çıkarır (ayrıca bir kullanıcı tarafından da adlandırılır:0)Manifest listesinde[Dönetici:2) veya [[Döneticileri:2) bir veya daha fazla görüntü, her biri platformuyla etiketlenir.Bir kullanıcı tarafından çalıştırılırken, Docker otomatik olarak Windows makinesinden Windows'u otomatik olarak seçer.
Cross-Platform için bir Buildx Builder
Hem Linux hem de Windows varyantlarını içeren çok sayıda görüntü oluşturmak için, hem Linux host hem de Windows hostuna erişebilecek bir inşaatçı kayıt olmalısınız.Ortak bir model, bir sürücü olarak uzaktan Windows Node kullanmaktır:
[FONT=FONT=)
[Üye: 9)
(Resulüm)
İnşaatçı yapılandırıldığında, bir adımda ortaya çıkabilir ve açabilirsiniz:
[Üye: 9)
[FONTD:11] Bayrak otomatik olarak hem bireysel görüntüler hem de kayıt defterine açık listeler koyar.
Sınırlar ve Gotchas
- [FONT=0) Windows-on-Linux çapraz-compilasyon mümkün değildir[Dönetici:0) çünkü Windows çekirdeğini taklit etmek için QEMU'yı kullanamazsınız. Buildx sürücüsüne erişilebilir bir yerli Windows inşa etmeniz gerekir.
- [FONT:0)Yönetici desteği, açık listeler içermelidir[Döneticiler:0) Çoğu büyük kayıt (Docker Hub, AWS ECR, Azure ACR, GitHub Konteyner Kayıtları) onları desteklemek için gerekli olabilir. Bazı özel kayıtlar uyumluluk doğrulamanızı gerektirir.
- [FONT:0)Layer caching per-platform[Dönetici]. Linux node üzerinde inşa edilen Caching, Windows inşasına uygulanmaz. Plan ayrı CI adımlarını veya platformu saygı gösteren ortak bir yer kullanır.
- [FONT:0)Etiklenebilirlik[Dönetici: Bir açık liste itdikten sonra, tüm referanslı görüntülerden vazgeçmeden değiştiremezsiniz. Her zaman yeni bir etiket veya bir hayal edilebilir sürüm programı kullanın, geri dönmeniz gerekiyorsa.
Cross-Platform için Dockerfiles
Çok-Stage ile koşullu adımlar Yapılar
İki tamamen ayrı Dockerfiles korumak yerine, tek bir dosya içinde platform farklılıkları ele almak için argümanlar ve multi- aşamalı inşalar yapabilirsiniz.TheurFLT:12). ve [[Dörd||||||||||seçmişler,|seçmişler, s.
ARG BASE_IMAGE
FROM ${BASE_IMAGE} AS base
FROM base AS install-linux
RUN apt-get update && apt-get install -y libfoo
FROM base AS install-windows
RUN powershell -Command Install-Package -Name Foo
FROM install-${TARGETOS} AS final
COPY app /app
CMD ["/app/start"]
Bu modelde, 16.Örnek: 16.Öyleçer veya ÂFFT: 18) ve [[Şerefli yükleme adımını seçersiniz.Ayrıca, Linux veya Windows'a belirli aşamaları pin için [[ŞUygunluk|taraflar) hattını kullanabilirsiniz, ancak bu tamamen farklı temel görüntülere ihtiyacınız varsa ayrı Dockerfiles gerektirir.
Çevre Değişkenleri ve Konig Enjeksiyon
Dosya yolları, çizgi sonları veya komut isimleri gibi soyut platforma özgü değerlere sahip çevre değişkenlerini kullanın.In your Dockerfile, platform-aware: set defaults that are platform-aware:
ARG TARGETOS
ENV CONFIG_DIR=/etc/myapp
ENV CONFIG_DIR=C:\\ProgramData\\MyApp
Ancak, dikkatli olun: Yukarıdaki örnek, bir platform-köpeksel senaryo ile çalışamaz, çünkü platforma özel konfigürasyonlar zamanında değerlendirilir, ancak psişik olarak ayarlandığında, görüntüye bir "kahraman" kullanılmaktadır.
Line Endings'i ve idam edilebilir Bits
Linux, LF çizgilerinin kabuk senaryolarında ve konfigürasyon dosyalarında sonlanmasını bekler; Windows, CRLFT:27'yi kontrol ettiğinizde, aynı anda her iki platformda da çalışan bir komut olarak (gerçekten) bir giriş noktası olarak kullanır.
CI/CD Boru Entegrasyonu
Matrix her Platform için inşa eder
GitHub Actions, GitLab CI, veya Azure Boruları, Linux ve Windows koşucu havuzlarında görüntüyü ayrı bir şekilde test etmek için bir matrix stratejisi kullanın.Her bir inşadan sonra, platformun ekini içeren bir etiketle kayıt altına alın (örneğin, 03.30).
Örnek GitHub Actions Workflow (Sigged)
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
include:
- os: ubuntu-latest
platform: linux/amd64
- os: windows-latest
platform: windows/amd64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Build and push
uses: docker/build-push-action@v5
with:
platforms: ${{ matrix.platform }}
tags: myapp:${{ matrix.platform }}-${{ github.sha }}
push: true
manifest:
needs: build
runs-on: ubuntu-latest
steps:
- uses: docker/setup-buildx-action@v3
- name: Create manifest list
run: |
docker buildx imagetools create \
-t myregistry.io/myapp:latest \
myregistry.io/myapp:linux-amd64-${{ github.sha }} \
myregistry.io/myapp:windows-amd64-${{ github.sha }}
Her iki Platformda Test
Windows'da Windows görüntüsü inşa ettikten sonra, uygulamanın beklenen porta ilişkin duman testini çalıştırın ve yanıt verir.For Linux için, testlerin her iki setinin de ortaya çıkmasını sağlar.
[FONT:0)Tip:[Dönetici:0)[Dönetici test sırasında belirli bir platform değişkenini zorlamak için kullanılır. Bu, yalnızca Linux iş istasyonuna sahip olduğunuz zaman paha biçilmezdir, ancak taahhüt etmeden önce açık yapıyı doğrulamak ister.
Debugging Cross-Platform Issues
Yaygın Başarısızlık Moduları
- [[Dönetici:0)Base image yanlış bir versiyon[[Döntgen: Windows Server Core versiyonu (e.g., ltsc2022 vs. ltsc2019) ev sahibi OS sürümünü asla eşleştirmiyor. Her zaman altyapı ekibinizle koordine etmek ve koordine etmek.
- [FONT=0)Memory limitleri ve çekirdek parametreleri[Dönetici: Windows konteynerleri hafıza sınırlarını uygulamak için Hiper-V izolasyonu gerektirebilir, Linux konteynerleri CFS (Completely Fair Scheduler) Uygulamanız büyük sayfaları veya özel sctl ayarlarını beklerse, bunlar Linux'tır.
- [FONT:0) Ağlama farklılıkları[[[Dönetici: Windows konteynerleri varsayılan olarak NAT tabanlı bir geçiş kullanıyor ve port bağlayıcısı farklı davranır.ASIFLT:33) Windows üzerinde desteklenmez. Uygulamanızın Linux'ta olmadığı sürece ev sahibi ağa güvenmemesini sağlayın.
- [FONT:0]File kilitleme ve sinyalleri[Dönetici: Windows, Linux'un yaptığı gibi POSIX sinyalleri desteklemiyor. Windows konteyneri içinde bir işlem için bir SIGTERM gönderin, uygulamanızı işaret eller olarak ele almak için tasarlayamaz.
Logging ve Introspection Tools
Bir çapraz platform sorunu ararken, görüntünün OS ve mimarisini doğrulamak için kullanılabilir.Ücretsizliğe bakınca, 03.38.000.
[Kırklar)
Platform eksikse veya sadece bir değişken gösterirse, görüntü çok-arşik bir açık değildir. Tüm platformları açık bir şekilde listelemek için:
(Allah’a) yemin ederim.
Bu komut her platform girişi ve onların sindirimi gösterir. Eğer sadece bir giriş görürseniz, açık yaratım adım eksikti veya inşa hem OS aileleri hedef almadı.
Gerçek Dünya Desenleri ve Pitfalls
Desen: Docker Desktop for Local Development
Docker Desktop Windows ile Windows konteyner modları arasında geçiş yapabilir, ancak aynı anda hem platform geliştirme, ayrı uzaktan inşaatçılar veya sanal makineler kullanabilirsiniz. Docker Desktop'ın Linux konteynerlerini yerel olarak çalıştırma yeteneği (WSL 2) geliştirici iş istasyonlarına olan ihtiyaçtır, ancak Windows-yalnızca görüntü özelliklerinin entegrasyonu için Windows konteynerlerine ihtiyacınız var.
Desen: Windows Images için LTS uyumu
Microsoft, Windows kapsayıcı görüntü hedefleriniz için, bir makb2022 ev sahibi ve yaklaşık iki ila üç yıl boyunca çalıştırın.Her LTSC versiyonu, Microsoft'un serbest bırakılmasıyla uyumlu bir konteyner görüntüsüne sahiptir.Eğer Windows konteyner resmi hedefleriniz için maksc20222222 barındırmanız gerekir ve bunu çok eski bir çekirdek üzerinde çalıştırabilirsiniz.[Döneticileri değiştir]
Pitfall: ARM64'i görmezden gelmek
Makale Windows ve Linux'a odaklanırken, hesaplamanın geleceği heterojendir: AWS Graviton, Azure Ampere, Apple Silikon ve Raspberry Pi kümeleri tüm çalıştırılır ARM64 Linux.Eğer Windows ve Linux için çok-arşik bir görüntü inşa ediyorsanız, aynı zamanda ortaya çıkan 12 ay içinde pahalı bir yeniden-mühendislik çabası olabilir.
Pitfall: COPY'de Filesystem İzinleri
Bir Dockerfile'de yer alan Docker, Docker, kaynağın sunucularından gelen dosya sistemi metadatasına saygı duyarsanız, Linux host'tan bir senaryoyu kullanabilirsiniz, eklenebilir bit ve LF hattı sonlarına kadar kontrol edilir.Eğer bir Windows sunucusundan COPY'dan gelen dosya topraklarına saygı duyarsanız, COPY'ye kadar normal bir şekilde izinler eklenir.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Windows ve Linux uyumluluk için çapraz platform Docker görüntüleri artık egzotik bir kullanım durumu değildir.Bu, heterojen altyapıyı, OS ailelerine bağlı olarak, Windows Kubernet'e entegre eden ve tamamen test eden herhangi bir filo için pratik bir zorunluluktur.Docker Buildx'i çok-aritelik açıklığa kavuşturarak, platform-kural Dockerfiles'ı korumak, bir matrix tabanlı CI/CD boru hattını entegre etmek ve tüm AG ailelerinizde sorunsuz bir şekilde test edebilirsiniz.
Anahtar çekleri basittir:
- UseFLT:47), yerli Windows ve Linux ile açık listeler üretmek için düğümler inşa ediyor.
- Dockerfiles withurFLT:48) ve [[DörtÜSÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
- Automate platformu CI'de özel inşalar ve testler; sadece her iki geçişten sonra ortaya çıkıyor.
- Microsoft'un LTSC serbest bırakılması ile mevcut kalın, temel görüntü sürüm yanlış eşleşmelerden kaçınmak için.
Bu uygulamalar yerinde, Microsoft Learn) ile güreşten ziyade uygulama değerini sağlamaya odaklanabilirsiniz.Daha fazla okuma için, [[Uygunluklar için:0)Docker multi- platform oluşturma belgesi)[Ücretsiz altyapının kaçınılmaz evrimi için sizi derinleştirecektir.