Çok-Stage Docker Nedir?

Çok aşamalı Docker, Docker 17.05'te tanıtıldıktan sonra birden fazlaİLFLT'yi kullanmanıza olanak sağlayan bir özelliktir.HerurFLT:1'de talimat, kendi temel imajına sahip olan, bağımlılıklara ve komutlara güvenebileceğiniz bir özelliktir. Artifacts, bir aşamadan diğerine seçici olarak kopyalanabilir, son görüntü yalnızca uygulama için gerekli olan şeyleri korur.Bu yaklaşım, manuel zincir Dockerfiles'a ihtiyaç duyar veya karmaşık bir senaryoya güvenebilir ve derlemeler hariç, genişleyen kütüphaneler ve orta dosyalara kadar görüntü boyutunu azaltır.

Ana fikir, iş zamanından itibaren ortamı ayırmaktır. Tipik bir tek aşamalı inşada, geliştirici tüm inşa araçları (örneğin, derleyiciler, paket yöneticileri, test çerçeveleri) aynı görüntüde üretim için kullanılacak.Bu bloklar görüntüyü bağlar ve saldırı yüzeyi kullanarak bunu çözer.

Multi-Stage Faydaları Yapılar

Çok aşamalı inşaların benimsenmesinin avantajları basit boyuttaki azalmanın ötesine geçerler. Güvenlik, muhafaza edilebilirlik ve dağıtım hızı üzerinde derin bir etkiye sahiptir.

1. 1. Görüntü Boyutunu Azladı

Örneğin, tam olarak kullanılan bir kartpostalları kullanarak, yalnızca inşa edilen 20MB'nin altından aşağıya doğru basılır.Bu depolama tasarrufları doğrudan tam olarak zaman çekmeye başlar.

2. Geliştirilmiş Güvenlik Güvenlik

Bir konteyner resmindeki her yüklü paket veya araç potansiyel bir kırılgandır. Multi- aşama inşaları, sadece uygulama ikilisini yürütmek için minimum çıplaklığa izin verir ve son görüntüden gelen kütüphaneler, saldırı yüzeyinin önemli ölçüde azaltılmasını sağlar.You can even use images likeUVT:7 orurFLT:8 for the runtime stage, which contains only the minimum bare to execute the application ikili.

3. Akışkanlık Süreci

Tüm inşa adımları tek bir Dockerfile olarak tanımlanır, süreci kendi kendine yeten ve sürüme kolay hale getirir. CI/CD boru hatları tek bir giriş noktasından yararlanır: Dockerfile. ayrı bir yapım senaryoları veya manuel temizleme adımları bulundurmanız gerekmez.

4. Geliştirilmiş Reproducability ve Consistency

Çünkü tüm inşa bir Dockerfile'de yakalanır, herhangi bir geliştirici veya sistem tam aynı katmanları yeniden üretebilir. Temel görüntüler için özel sürüm etiketlerin kullanımı daha fazla ortamdaki tutarlı yapılar garanti eder.

Çok fazla bir Dockerfile inşa edin: Adım Tarafından Adım

Bu yürüyüş, Node.js ve Reakt uygulaması için bir üretim hazırlı çok aşamalı Dockerfilenin yaratılmasını kapsar. Aynı ilkeler herhangi bir derleyici dil için geçerlidir.

1. Aşamalarınızı Planlayın

Kod yazmadan önce, ihtiyacınız olan aşamaları haritalayın. Tipik bir multi- aşama inşa en az iki aşamaya sahiptir:

  • [FONT:0)Yapıcı sahne[[Dönetici:0)[Dönerli aşama[Dönetici:0) - tüm inşa araçları, bağımlılıkları kurmak ve inşa komutunu yürütmek.
  • [FONT:0]Runtime aşaması[[[Dönetici:0][Dönemli bir görüntüyü kullanır, sadece inşaatçı aşamasından inşa edilmiş eserler kopyalar ve runtime davranışını tanımlar.

Testler, statik analiz veya varlık sıkıştırması için orta aşamalar ekleyebilirsiniz.

2. Builder Stage

Gerekli araç zincirlerini içeren bir temel görüntü ile başlayın. UseETHFLT:0) İsimli aşamalar).Onlara daha sonra atıfta bulunmak için.

FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

Anahtar noktaları:

  • Deterministic için, daha hızlı bağımlılık kurulumunu kullanın.
  • KeepFLT:12), katchingten yararlanmak için mümkün olan ayrı katmanlar olarak komutlar.
  • Bu aşamada sadece TypeScript, webpack gibi araçlar inşa etmek.

3. Intermediate Test Aşamasını ekleyin (Oygun)

Kod kalitesini uygulamak için, test eden bir aşama ekleyin. Bu aşama, inşaatçı imajını yeniden kullanabilir veya ek araçları yükleyebilir. Çünkü son aşama değildir, test hataları son görüntüde mevcut olmayacaktır.

FROM builder AS test
RUN npm run test

Bu aşamayı CI boru hattınızda tüm son görüntü inşa etmeden erken başarısızlık yakalamak için çalıştırabilirsiniz.

4. Runtime Stage'i Tanımlayın

Bir Reakt uygulaması için, runtime image bir Nginx sunucusu olabilir.Bir backend API için, Node.js runtime ile en az bir Alp olabilir.Sadece gerekli eserler kullanın.It's backend API, it might be a distroless base image or a minimal Alpine with the Node.js runtime. Copy only the basic works usingENFLT:15).

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Node.js runtime'ya ihtiyacınız varsa, inşaatçıdan kopyalamamak; bunun yerine üretim, iş zamanındaki aşamalara bağlı olarak yeniden yüklemek:

FROM node:14-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

5. Resim inşa etmek ve test edin

Standart komut kullanarak son görüntü oluşturun:

docker build -t myapp:latest .

Boyut doğrulamak için, runurFLT:20) ve tek aşamalı bir yapıya karşı karşılaştırmak için.Kıyı çalıştırın ve uygulamayı doğru doğru doğru doğru doğru doğru doğru doğru doğru doğru doğru doğru şekilde doğrulayın:

docker run -d -p 8080:80 myapp:latest
curl http://localhost:8080

Multi-Stage için en iyi uygulamalar Yapılar

  • [FONT:0) Belirli temel görüntü etiketleri [[Döntgen: 1) kullanın: sürprizleri önlemek için (=FONT) veya [[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=)
  • [FONT=0) Katmanı sıtma[[DÜT 1: 1 ) - · · 9|0| Kaynak kodunun geri kalanından önce, bu nedenle, [[DÜye Olmayanlar İçindekiler Değişimi Değiştirilir.
  • [FONT=0)Leverage buildKit[[Döntilmiş: 1), daha hızlı inşa etmek için, inline caching ve daha iyi paralellik için inşa etmek için, s.
  • [FONT:0) Farklı ortamlar için çok sayıda son aşamayı oluşturun[Dönetici: 1) Örneğin, elzeme aletleri ile bir gelişim aşaması ve sertleştirilmiş bir temel görüntü ile bir üretim aşaması.
  • [FONT:0)UseENFLT:29) Geliştirme için[[Dönetici: 1) Geliştirmede, canlı yük ve kaynak haritaları elde etmek için sahneyi durdurabilirsiniz, sonra üretim için [[Ücretsizler ile yeniden inşa edin.
  • [FONT:0) Görüntülerden sır tut[Döneticileri · 3/FİLMİ 1:0) - Docker BuildKit'sULLFLT:32'i kullanarak, inşa sırasında kimlikleri geçmek zorundaysanız, asla son görüntüde onları dahil etme.

Common Patterns ve Cases Kullan

Tamamlanan Diller (Go, Rust, C++)

Statik binerler için, runtime aşaması, sadece ikili ve belki bir yapılandırma dosyası kopyalanır. Go için Örnek:

FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .

FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]

Python Uygulamaları

Bağımlılığı kurmak ve herhangi bir C uzantıları derlemek için inşaatçı bir sahne kullanın, sonra sadece yükleme paketi bir runtime aşamasına kopyalayın:

FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
COPY . .

FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

API Server ile Frontend

Her iki cephede hem ön hem de arka uç oluşturun. Her biri için ayrı inşaatçı aşamalar kullanın, sonra her iki kitabı tek bir koşu görüntüsüne kopyalayın:

FROM node:14-alpine AS frontend-builder
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ .
RUN npm run build

FROM node:14-alpine AS api-builder
WORKDIR /app
COPY api/package*.json ./
RUN npm ci
COPY api/ .
RUN npm run build

FROM node:14-alpine
WORKDIR /app
COPY --from=frontend-builder /app/build ./public
COPY --from=api-builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

Problemshooting Multi-Stage Builds

  • [FONT=0)Layer, çalışmamayın [DÜDÜT:1) – Kaynak kodundan önce komutlara bağlı olarak komutlar siparişi verir.UseENFLT:39). gereksiz dosyaları dışlamak için.
  • [FONT=0]İşitt bulunamadı [Dönetici: 1 ) – Doğrulamalar (Dönetici) ifadesi.
  • [FONT:0]Gizli sızıntı[DÜT:1] – Hiçbir zaman İLDİYORUMLAR veya DÖRT KİM KİMYA KİM KİM KİMYA KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM KİM ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • [FONT:0) Çok aşamalı olan son görüntülere rağmen, – yanlışlıkla kopyalanırsanız veya tüm kaynak kullanın.UseINGFLT:45).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Multi- stage Docker, modern konteynerizasyon temelleridir. Onlar, inşa işlemi basit tutmak ve tek bir Dockerfile'de belgelenmişken, mevcut Dockerfilelerinizi çok aşamalı inşa etmek, geliştirmek ve CI/CD boru hatları oluşturmak için size olanak sağlarlar. Burada gösterilen teknikler hemen hemen hemen hemen hemen hemen hemen hemen hemen hemen hemen her bir depoya uygulanır - hiçbir şekilde inşa edilirsiniz.

Daha fazla ayrıntı için, [[Dönetici Docker multi- aşamalı belge) ve [[Dönetici:2)Dockerfile en iyi uygulamalar rehberi) mevcuttur. Gerçek dünya örnekleri de mevcuttur.