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

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ı

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:

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.