Docker وGo: حاويات التطبيقات بلغة Golang من الصفر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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 (عشرات الميجابايت).



الخطوة 4: تحسين Dockerfile للإنتاج

المدونات

توصيات الكتب