title: “78. Men-deploy gRPC Service di Docker” date: 2024-06-13 author: Software Engineer Senior
gRPC belakangan menjadi semakin populer sebagai salah satu teknologi RPC (Remote Procedure Call) yang cepat, efisien, dan sangat cocok digunakan pada arsitektur berbasis microservices. Namun, membangun gRPC Service saja tidak cukup tanpa tahu cara packaging dan deployment yang baik, terutama ke dalam lingkungan tercontainerisasi seperti Docker.
Di artikel ini saya akan membagikan pengalaman dan best-practice untuk men-deploy gRPC Service menggunakan Docker, dilengkapi dengan contoh kode, simulasi, tabel, dan diagram alur deployment via mermaid. Kita akan menggunakan bahasa Go sebagai contoh implementasi, karena sintaks yang jelas dan kecepatan build-nya, tapi konsepnya sangat bisa diterapkan pada stack manapun (Python, Java, Node.js, dsb).
1. Mengenal gRPC dan Docker secara Singkat
Apa itu gRPC?
gRPC adalah framework open-source yang dikembangkan Google, memungkinkan aplikasi berkomunikasi antar perangkat dengan definisi API (interaktif, berbasis Protobuf) yang efisien. Kelebihan gRPC antara lain:
- Mendukung Multilanguage (Go, Java, C#, Python, dsb)
- Fast onder-the-hood HTTP/2 (bukan HTTP/1.1)
- Mendukung streaming bidirectional dan unary
- Mendukung Autogenerate Stubs dari *.proto
Apa itu Docker?
Docker adalah tools containerization yang memudahkan kita untuk mengemas aplikasi beserta seluruh dependensi agar dapat berjalan konsisten di mana saja—di laptop, server, atau cloud tanpa khawatir dependency hell.
2. Struktur Proyek Minimal
Sebelum masuk ke deployment, berikut struktur minimal sebuah proyek gRPC berbasis Go yang akan kita gunakan:
grpc-docker-demo/
│
├── proto/
│ └── hello.proto
├── server/
│ └── main.go
├── client/
│ └── main.go
├── Dockerfile
└── go.mod
Penjelasan singkat:
proto/hello.proto: File Protobuf untuk mendefinisikan service & messageserver/main.go: Service implementation (Go)client/main.go: Simulasi client gRPC (opsional)Dockerfile: Setup image Dockergo.mod: Modul Golang dependency management
3. Menyiapkan Service gRPC Sederhana
Langkah 1: Definisikan Service di Protobuf
Buat file proto/hello.proto
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
Langkah 2: Generate Code Go
Instal protoc dan plugin Go:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
Generate kode:
protoc --go_out=. --go-grpc_out=. proto/hello.proto
Langkah 3: Implementasi Server
Buat file server/main.go:
package main
import (
"context"
"log"
"net"
pb "grpc-docker-demo/proto"
"google.golang.org/grpc"
)
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello " + req.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Println("gRPC server listening on :50051")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
4. Membuat Dockerfile Untuk gRPC Service
Agar aplikasi Go kita bisa berjalan di mana saja, kita kemas menggunakan Docker. Berikut contoh Dockerfile yang cukup optimal:
# Stage 1: Build binary
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server ./server
# Stage 2: Final image
FROM scratch
WORKDIR /root/
COPY --from=builder /app/server .
COPY proto/ ./proto/
EXPOSE 50051
ENTRYPOINT ["./server"]
Catatan:
- Kita menggunakan multi-stage build (
builderdanscratch) agar image hasilnya kecil dan hanya berisi binary release.- Hanya port 50051 (default gRPC) yang diekspos.
5. Build & Simulasi Deploy Docker
Simulasi Build
Jalankan perintah berikut di root folder:
docker build -t grpc-docker-demo:latest .
Menjalankan Container
docker run -p 50051:50051 grpc-docker-demo:latest
Service sekarang sudah bisa diakses di localhost:50051 (untuk client gRPC).
6. Testing Lokal Dengan gRPC Client
Jika ingin menguji lewat client sederhana:
package main
import (
"context"
"log"
"time"
pb "grpc-docker-demo/proto"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "Dunia"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Server Response: %s", r.Message)
}
7. Deployment Flow Diagram
Berikut adalah diagram alur deployment gRPC Service di Docker:
flowchart TD
A[dev: Implementasi gRPC Service]
B[Build Docker Image]
C[Test Lokal Docker Run]
D[Push ke Docker Registry]
E[Deploy ke Server/Cloud (k8s, ECS, dll)]
A --> B
B --> C
C --> D
D --> E
8. Tabel Perbandingan: Docker vs Native Run
| Aspek | Native Run | Dockerized Run |
|---|---|---|
| Dependency | Manual install | Imaged, self-contained |
| Portability | OS/machine dependent | Multi-platform |
| Isolasi | Tidak ada | Full (namespace, fs) |
| Deploy Speed | Lebih cepat di satu host | Rollout lebih mudah |
| Management | Sulit scale | Orchestration-friendly |
9. Tips Profesional Deploy gRPC di Docker
Beberapa best-practices yang wajib diperhatikan:
- Gunakan multi-stage build untuk mengurangi size image
- Nonaktifkan
CGO(CGO_ENABLED=0) supaya binary lebih portable - Pisahkan credentials/secrets dari image, gunakan ENV variable atau secret manager
- Automate build/test dengan CI/CD (contoh: GitHub Actions, GitLab CI)
- Monitoring & Health Check: gRPC tidak expose HTTP endpoint, gunakan sidecar/liveness probe custom
10. Kesimpulan
Men-deploy gRPC Service ke dalam Docker bukan hanya praktik modern, tetapi juga menjamin aplikasi kita siap untuk scale up ke production environment modern seperti Kubernetes atau cloud platform lain. Prosesnya cukup straightforward jika project terstruktur dengan baik, dependencies tertata, dan kita disiplin mengikuti best-practice.
Dengan langkah-langkah di atas, Anda sudah bisa mengemas, menjalankan, dan men-deploy gRPC Service secara konsisten di mana pun.
Selamat mencoba, dan semoga service Anda mulus tanpa drama dependency lagi!
Referensi:
- Official gRPC Go Docs
- Mengoptimalkan Layer di Dockerfile
- Production Best Practice: gRPC Health Checking
Jika Anda ingin membahas topik seputar monitoring, observability, atau CI/CD untuk layanan gRPC di Docker, silakan request di kolom komentar!