Docker وGo: دليل شامل لحاويات تطبيقات Golang
أصبحت الحاويات المعيار الفعلي لنشر التطبيقات الحديثة. لغة Go (Golang) مثالية للبيئة الحاوية: ملفاتها الثنائية المترجمة لا تتطلب بيئة تشغيل، والربط الثابت يسمح بإنشاء صور Docker صغيرة الحجم. في هذه المقالة، سنشرح عملية حاويات تطبيقات Go بدءًا من كتابة Dockerfile وصولاً إلى تحسين حجم الصورة النهائية.
لماذا Go وDocker زوج مثالي
يتم ترجمة Go إلى ملف ثنائي ثابت واحد لا يعتمد على المكتبات النظامية. هذا يعني أنه لتشغيل تطبيق Go في حاوية، لا تحتاج إلى تثبيت Go Runtime أو مفسرات أو تبعيات إضافية. ونتيجة لذلك، تحصل على:
- حجم صورة ضئيل — غالبًا أقل من 10-15 ميجابايت
- تشغيل سريع — بالميلي ثواني وليس الثواني
- أمان عالي — مكونات أقل = ثغرات أقل
- سهولة النشر — ملف ثنائي واحد بدلاً من نصوص وبرمجيات متعددة
لننظر إلى ذلك من خلال مثال خادم HTTP بسيط بلغة Go.
الخطوة 1: إنشاء تطبيق Go
في البداية، سنكتب تطبيق ويب بسيط سنقوم بحاوته. أنشئ ملف main.go:
package main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "مرحبًا من حاوية Go! 🐳") })
log.Printf("الخادم يعمل على المنفذ %s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}هذا هو خادم HTTP أدنى يستمع إلى المنفذ المحدد بواسطة متغير البيئة PORT (الافتراضي 8080).
الخطوة 2: البناء متعدد المراحل (Multi-stage build)
لإنشاء صورة Docker ضئيلة، يتم استخدام البناء متعدد المراحل. المرحلة الأولى هي ترجمة التطبيق، والثانية هي إنشاء الصورة النهائية مع الملف الثنائي فقط. أنشئ Dockerfile:
# المرحلة 1: بناء التطبيقFROM golang:1.22-alpine AS builder
WORKDIR /app
# نسخ go.mod و go.sum لتخزين التبعيات مؤقتًاCOPY go.mod go.sum ./RUN go mod download
# نسخ الكود المصدريCOPY . .
# بناء الملف الثنائي الثابتRUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .
# المرحلة 2: الصورة النهائية الضئيلةFROM alpine:3.19
# إضافة شهادات CA لـ HTTPSRUN apk --no-cache add ca-certificates
WORKDIR /root/
# نسخ الملف الثنائي من المرحلة الأولىCOPY --from=builder /app/server .
# فتح المنفذEXPOSE 8080
# تشغيل التطبيقCMD ["./server"]لاحظ النقاط الرئيسية:
golang:1.22-alpine— صورة خفيفة للبناءCGO_ENABLED=0— تعطيل CGO للربط الثابتalpine:3.19— صورة Linux ضئيلة (~5 ميجابايت)ca-certificates— ضرورية إذا كان التطبيق يستخدم HTTPS
الخطوة 3: بناء وتشغيل الحاوية
قم ببناء صورة Docker وتشغيل الحاوية:
# بناء الصورةdocker build -t go-hello:latest .
# تشغيل الحاويةdocker run -d -p 8080:8080 --name go-app go-hello:latest
# التحققcurl http://localhost:8080# الإخراج: مرحبًا من حاوية Go! 🐳تحقق من حجم الصورة الناتجة:
docker images go-hello# REPOSITORY TAG IMAGE ID CREATED SIZE# go-hello latest abc123def456 10 seconds ago 14.2 MBفقط 14.2 ميجابايت — هذا ضئيل جدًا مقارنة بصور Node.js (مئات الميجابايت) أو Python (عشرات الميجابايت).