Episode ini membahas deployment aplikasi .NET: Dockerizing dengan multi-stage build, deployment ke Azure App Service, AWS, GCP, dan Kubernetes, runtime configuration untuk production, serta strategi blue-green, canary releases, dan rollback.

Kode yang berjalan di mesin developer tidak menjamin apa-apa sampai dia berjalan di production. Deployment yang baik adalah proses yang terdokumentasi, bisa diulang, dan bisa dipulihkan bila terjadi masalah.
Container adalah jawaban atas masalah "berjalan di mesin saya". Image Docker membungkus aplikasi dan semua dependency-nya menjadi satu unit yang bisa dijalankan di mana saja — laptop, server, atau cloud.
Episode 19 ini membahas Dockerizing aplikasi .NET, deployment ke cloud dan Kubernetes, konfigurasi production, serta strategi rilis yang meminimalkan risiko.
Image .NET sebaiknya dibangun dengan multi-stage: stage pertama meng-compile, stage kedua hanya berisi runtime. Hasilnya image kecil dan aman:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY src/Toko.Api/Toko.Api.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /out
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /out .
ENV ASPNETCORE_ENVIRONMENT=Production
ENTRYPOINT ["dotnet", "Toko.Api.dll"]Stage pertama memakai image SDK yang besar untuk meng-compile, lalu stage runtime memakai image aspnet:8.0 yang ramping — hanya berisi runtime ASP.NET. Kalian sudah melihat dotnet publish di episode 2; sekarang hasilnya dikemas ke image.
docker build -t toko-api:1.0 .
docker run -p 8080:8080 toko-api:1.0Perintah docker run -p 8080:8080 toko-api:1.0 memetakan port container ke port host. Konfigurasi production diberikan lewat environment variables saat container dijalankan.
Ketiga cloud utama punya layanan managed untuk ASP.NET Core:
Pola umum: CI membangun image dan mengirimnya ke registry (Azure Container Registry, ECR, atau Artifact Registry), lalu platform cloud menarik dan menjalankannya.
Di Kubernetes, aplikasi dideklarasikan dengan manifest YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: toko-api
spec:
replicas: 3
selector:
matchLabels:
app: toko-api
template:
metadata:
labels:
app: toko-api
spec:
containers:
- name: toko-api
image: registry.contoh.id/toko-api:1.0
ports:
- containerPort: 8080
env:
- name: ASPNETCORE_ENVIRONMENT
value: ProductionTerapkan dengan kubectl:
kubectl apply -f deployment.yaml
kubectl rollout status deployment/toko-apiPerintah kubectl rollout status menunggu deployment selesai. Nilai replicas: 3 membuat tiga pod berjalan — jika satu mati, sisanya tetap melayani.
Di production, jangan menyimpan rahasia di image. Berikan lewat environment variables atau secret store:
docker run -d -p 8080:8080 \
-e ASPNETCORE_ENVIRONMENT=Production \
-e ConnectionStrings__Default="Host=db;Database=toko;Username=app;Password=rahasia" \
toko-api:1.0Perintah docker run -e ConnectionStrings__Default=... menimpa konfigurasi appsettings.json. Format __ ganda (yang kalian pelajari di episode 8) memetakan environment variable ke hierarki konfigurasi.
kubectl rollout undo deployment/toko-apiPerintah kubectl rollout undo mengembalikan deployment ke revisi sebelumnya secara instan. Dengan strategi ini, rilis yang bermasalah tidak pernah menjadi krisis.
Inti yang harus dibawa pulang:
dotnet publish menghasilkan output siap container.Di episode 20 selanjutnya kita memastikan aplikasi yang berjalan bisa dipantau: observability dan monitoring — logging dengan Serilog, metrics dan tracing dengan OpenTelemetry, health checks dan monitoring endpoints, serta incident response dan troubleshooting production.