Deploy WebAPI .NET dengan Docker

Dalam era digital saat ini, kebutuhan akan pengembangan aplikasi yang cepat, fleksibel, dan dapat dengan mudah di-deploy ke berbagai lingkungan menjadi semakin penting. Menurut laporan dari RightScale pada tahun 2023, sebanyak 77% perusahaan menggunakan kontainer sebagai bagian dari strategi pengembangan dan deployment mereka, dengan Docker menjadi salah satu platform kontainer paling populer. Docker memungkinkan developer untuk mengemas aplikasi beserta dependensinya dalam satu image yang dapat dijalankan konsisten di berbagai lingkungan, dari lokal hingga produksi.

Artikel ini akan membahas langkah-langkah untuk melakukan deployment aplikasi WebAPI .NET menggunakan Docker, mulai dari pembuatan Dockerfile hingga menjalankan kontainer di server production. Dengan memanfaatkan Docker, Anda tidak hanya mendapatkan konsistensi dalam deployment, tetapi juga efisiensi yang lebih tinggi dalam pengelolaan aplikasi.

Mengapa Menggunakan Docker untuk Deployment?

Docker telah menjadi pilihan populer dalam deployment aplikasi, termasuk WebAPI .NET, karena sejumlah alasan penting yang berkaitan dengan efisiensi, konsistensi, dan skalabilitas. Berikut beberapa alasan utama mengapa menggunakan Docker untuk deployment menjadi solusi yang banyak diminati oleh pengembang:

  1. Konsistensi Lingkungan
    Salah satu tantangan dalam pengembangan dan deployment adalah perbedaan lingkungan antara lokal, staging, dan production. Docker mengatasi masalah ini dengan menyediakan container yang mengisolasi aplikasi beserta seluruh dependensinya. Dengan Docker, Anda dapat memastikan bahwa aplikasi yang berjalan di lokal akan berfungsi sama baiknya ketika di-deploy ke server, mengurangi masalah seperti “it works on my machine” yang sering dihadapi developer.
  2. Portabilitas yang Tinggi
    Aplikasi yang dikemas dalam container Docker dapat dijalankan di berbagai lingkungan, baik itu di server fisik, virtual, cloud, atau hybrid. Hal ini memudahkan deployment ke berbagai platform tanpa perlu melakukan perubahan signifikan pada konfigurasi atau infrastruktur.
  3. Efisiensi Penggunaan Sumber Daya
    Docker menggunakan containerization, yang lebih ringan daripada virtual machines (VM). Alih-alih memvirtualisasi seluruh sistem operasi, Docker hanya mengisolasi aplikasi dan dependensinya. Hal ini memungkinkan penggunaan sumber daya yang lebih efisien, sehingga beberapa container dapat berjalan secara bersamaan pada satu host dengan overhead yang minimal.
  4. Skalabilitas dan Pengelolaan yang Mudah
    Dalam konteks aplikasi berskala besar, Docker mempermudah skalabilitas. Dengan Docker Compose dan orchestrator seperti Kubernetes, Anda dapat mengelola, menskalakan, dan memantau aplikasi dengan mudah. Anda juga dapat dengan cepat menduplikasi container untuk kebutuhan horizontal scaling atau mengelola rolling updates tanpa downtime yang signifikan.
  5. Proses Deployment yang Otomatis dan Terstandarisasi
    Docker memungkinkan developer untuk mengotomatisasi deployment dengan pipeline CI/CD (Continuous Integration/Continuous Deployment). Integrasi Docker dalam proses CI/CD memastikan bahwa setiap perubahan kode yang di-push dapat langsung diuji, dikemas, dan di-deploy dalam bentuk container, mempercepat siklus rilis aplikasi.
  6. Isolasi dan Keamanan
    Docker menyediakan lingkungan terisolasi untuk aplikasi, sehingga mengurangi risiko konflik antara aplikasi yang berjalan pada satu server. Selain itu, dengan dukungan untuk praktik keamanan seperti pemindaian image dan kebijakan akses berbasis peran, Docker membantu meningkatkan keamanan dalam deployment aplikasi.

Docker bukan hanya sebuah alat, tetapi juga pendekatan yang memungkinkan developer dan tim IT untuk bekerja lebih kolaboratif dan efisien dalam pengembangan dan deployment. Dengan kemampuan yang ditawarkan Docker, tim pengembang dapat fokus pada pengembangan fitur dan perbaikan bug tanpa khawatir terhadap inkonsistensi atau masalah deployment.

Instalasi Docker Desktop

Untuk memulai proses deployment aplikasi WebAPI .NET dengan Docker, langkah pertama yang harus dilakukan adalah meng-install Docker Desktop. Docker Desktop adalah platform yang menyediakan semua alat yang Anda butuhkan untuk membangun, menjalankan, dan mengelola aplikasi containerized. Berikut adalah langkah-langkah untuk menginstal Docker Desktop di sistem operasi Windows.

1. Download Docker Desktop.

2. Instalasi Docker Desktop di Windows.

3. Verifikasi Instalasi.

Setelah Docker Desktop ter-install, buka terminal atau command prompt dan jalankan perintah berikut untuk memverifikasi instalasi:

docker --version

Jika instalasi berhasil, Anda akan melihat versi Docker yang sudah ter-install di sistem.

Membuat Dockerfile

Dockerfile adalah file teks sederhana yang berisi serangkaian instruksi untuk membangun image Docker. Untuk aplikasi WebAPI .NET, Dockerfile akan menginstruksikan Docker tentang bagaimana aplikasi tersebut harus dikemas, dari proses build hingga menjalankan aplikasi di dalam container.

Buat file dengan nama Dockerfile (tanpa ekstensi) dan letakkan di folder yang sama dengan file proyek .csproj. Berikut ini isi Dockerfile untuk aplikasi WebAPI .NET.

# Stage 1: Build the application
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Stage 2: Build the runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build-env /app/out .

# Expose the port your application runs on
EXPOSE 80

# Command to run the application
ENTRYPOINT ["dotnet", "MyApp.dll"]

Ubah MyApp.dll sesuai dengan nama proyek Anda.

Penjelasan Isi Dockerfile

Base Image untuk Build (Stage 1):
Dockerfile memulai dengan base image mcr.microsoft.com/dotnet/sdk:7.0 yang berisi SDK .NET untuk melakukan build aplikasi. Tahap ini dikenal sebagai build stage.

Restore Dependencies:
Baris COPY *.csproj ./ dan RUN dotnet restore berfungsi untuk menyalin file proyek dan melakukan restore dependensi. Ini dilakukan di tahap awal untuk memanfaatkan caching Docker, sehingga perubahan pada file kode lain tidak menyebabkan Docker melakukan restore ulang.

Build Aplikasi:
COPY . ./ menyalin semua file proyek ke dalam container, kemudian RUN dotnet publish -c Release -o out membangun aplikasi dalam mode release dan meng-output hasil build ke folder out.

Base Image untuk Runtime (Stage 2):
Setelah aplikasi dibangun, Dockerfile beralih ke base image runtime mcr.microsoft.com/dotnet/aspnet:7.0. Base image ini lebih ringan karena hanya memuat runtime ASP.NET Core, tanpa SDK.

Menyalin Hasil Build ke Runtime Container:
COPY --from=build-env /app/out . menyalin hasil build dari tahap pertama ke dalam tahap kedua, yang akan menjadi kontainer final.

Expose Port:
EXPOSE 80 memberitahu Docker bahwa aplikasi berjalan di port 80, yang kemudian bisa dipetakan ke port host saat kontainer dijalankan.

Menjalankan Aplikasi:
ENTRYPOINT ["dotnet", "MyApp.dll"] menentukan perintah untuk menjalankan aplikasi. Gantilah MyApp.dll dengan nama file .dll dari aplikasi Anda.

Membuat Docker Image & Menjalankan Kontainer

Setelah Anda membuat Dockerfile, langkah selanjutnya adalah membangun Docker image dari aplikasi WebAPI .NET dan menjalankannya dalam kontainer.

Docker image adalah blueprint dari aplikasi yang mencakup semua yang diperlukan untuk menjalankan aplikasi, seperti kode aplikasi, dependensi, runtime, dan konfigurasi. Untuk membangun image dari Dockerfile yang telah Anda buat, Anda dapat menggunakan perintah berikut.

docker build -t nama-image:tag .

Parameter -t digunakan untuk menentukan nama image dan tag. Tag berfungsi sebagai penanda image. Anda dapat menggunakan tag yang berisi versi aplikasi, seperti: dev, latest, v1, dll. Contoh perintahnya adalah sebagai berikut.

docker build -t calculator-image:v1 .

Setelah menjalankan perintah ini, Docker akan membaca Dockerfile dan memulai proses build. Jika berhasil, Anda akan melihat pesan yang menunjukkan bahwa image berhasil dibangun, beserta ID dari image tersebut.

Setelah image berhasil dibuat, Anda dapat memeriksa daftar image yang tersedia dengan menjalankan perintah berikut:

docker images

Perintah ini akan menampilkan daftar image yang telah dibuat, termasuk nama, tag, dan ukuran image. Pastikan image Anda muncul di daftar ini.

Setelah image selesai dibangun, langkah berikutnya adalah menjalankan kontainer dari image tersebut. Gunakan perintah berikut:

docker run -d -p 8080:80 --name nama-kontainer nama-image:tag

Penjelasan perintah:

  • -d: Menjalankan container di background (detached mode).
  • -p 8080:80: Memetakan port 8080 di dalam perangkat lokal Anda ke port 80 di kontainer. Anda dapat mengakses aplikasi melalui http://localhost:8080.
  • --name: Memberikan nama pada kontainer yang berjalan, misalnya myapp-container.nama-image:tag: Nama dan tag image yang akan dijalankan, misalnya calculator-image:v1.

Contoh perintah lengkapnya adalah sebagai berikut:

docker run -d -p 8080:80 --name calulcator-container calculator-image:v1

Untuk memeriksa apakah container berjalan dengan benar, Anda bisa menggunakan perintah berikut:

docker ps

Perintah ini akan menampilkan daftar kontainer yang berjalan beserta informasi penting seperti nama, ID container, port mapping, dan status. Pastikan kontainer Anda muncul dalam daftar ini dengan status “Up”.

Anda juga dapat melihat daftar kontainer ini melalui aplikasi GUI Docker Desktop.

Penutup

Menggunakan Docker untuk deployment aplikasi WebAPI .NET membawa banyak keuntungan, mulai dari konsistensi lingkungan, portabilitas yang tinggi, hingga efisiensi dalam penggunaan sumber daya. Dengan Docker, Anda dapat mengemas aplikasi beserta seluruh dependensinya dalam satu container yang dapat dengan mudah di-deploy di berbagai platform, baik di server lokal maupun cloud. Proses yang dimulai dari pembuatan Dockerfile, membangun Docker image, hingga menjalankan container menunjukkan betapa fleksibelnya pendekatan ini dalam menjaga aplikasi tetap ringan, scalable, dan mudah dikelola.

Sebagai penutup, Docker tidak hanya memberikan solusi teknis, tetapi juga mengubah cara kita melihat dan menjalankan aplikasi di berbagai lingkungan. Dengan mengadopsi teknologi ini, Anda dapat memastikan bahwa aplikasi yang dikembangkan dan di-deploy tidak hanya berjalan dengan baik, tetapi juga siap untuk menghadapi tantangan masa depan dalam pengembangan perangkat lunak.