Docker وGo: حاويات التطبيقات المتقدمة

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

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

ابدأ الدورة

مقدمة: لماذا الحاويات المتقدمة لـ Go أمر لا بد منه

أصبحت حاويات تطبيقات Go باستخدام Docker معيارًا صناعيًا. ومع ذلك، فإن Dockerfile الأساسي الذي ينسخ الملف الثنائي ببساطة إلى صورة تعتمد على golang:latest، هو مجرد قمة جبل الجليد. على المستوى المتقدم، يواجه المطورون تحديات تقليل حجم الصورة، وضمان الأمان، وتحسين وقت البناء، وتنظيم البنية متعددة الحاويات بشكل صحيح.

في هذه المقالة، سنستعرض التقنيات المتقدمة لحاويات تطبيقات Go: من البناء متعدد المراحل إلى العمل مع الشبكات ووحدات التخزين في Docker Compose. المادة موجهة لأولئك الذين هم على دراية بأساسيات Docker وGo ويريدون رفع مهاراتهم إلى المستوى التالي.



1. البناء متعدد المراحل (Multi-stage build): صورة صغيرة في ثوانٍ

المشكلة الرئيسية للصور الأساسية هي حجمها. تزن صورة golang:1.22 حوالي 800 ميجابايت، وهو أمر غير مقبول للإنتاج. الحل هو البناء متعدد المراحل، حيث نستخدم صورة "ثقيلة" فقط للترجمة، بينما نبني الصورة النهائية على أساس scratch أو alpine.



مثال على Dockerfile متقدم لـ Go

# المرحلة 1: البناءFROM golang:1.22-alpine AS builder

WORKDIR /appCOPY go.mod go.sum ./RUN go mod download

COPY . .RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server

# المرحلة 2: الصورة النهائيةFROM scratch

COPY --from=builder /app/server /serverCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

EXPOSE 8080ENTRYPOINT ["/server"]


التحسينات الرئيسية:

  • CGO_ENABLED=0 — تعطيل CGO، مما يسمح ببناء ملف ثنائي مرتبط بشكل ثابت. هذه هي الطريقة الوحيدة لاستخدام scratch.
  • -ldflags="-s -w" — إزالة معلومات التصحيح وجدول الرموز، مما يقلل حجم الملف الثنائي بنسبة 20-30%.
  • COPY --from=builder /etc/ssl/certs/... — إضافة الشهادات الجذرية لطلبات HTTPS من الحاوية (بدونها لن يتمكن Go من تنفيذ اتصالات TLS).
  • تزن الصورة النهائية ~10-15 ميجابايت بدلاً من 800 ميجابايت.


متى تستخدم alpine بدلاً من scratch؟

إذا كان تطبيقك يحتاج إلى shell أو ping أو curl أو أدوات أخرى للتصحيح، فاستخدم alpine:latest (5 ميجابايت فقط). ولكن لتحقيق أقصى درجات الأمان في الإنتاج، اختر scratch — فلا يحتوي على أي شيء غير ضروري.



2. تحسين التخزين المؤقت لـ Docker والعمل مع التبعيات

كل تعليمة في Dockerfile تنشئ طبقة. لتسريع عمليات البناء المتكررة، تحتاج إلى تنظيم ترتيب التعليمات بشكل صحيح.



الترتيب الصحيح للطبقات

FROM golang:1.22-alpine AS builder

WORKDIR /app

# 1. نسخ ملفات التبعيات فقطCOPY go.mod go.sum ./RUN go mod download

# 2. نسخ الكود المصدريCOPY . .

# 3. البناءRUN go build -o /app/server ./cmd/server


لماذا هذا مهم؟ يقوم Docker بتخزين الطبقات مؤقتًا. إذا قمت بتغيير الكود فقط (main.go) ولكن لم تغير go.mod، فسيتم أخذ الطبقة التي تحتوي على RUN go mod download من ذاكرة التخزين المؤقت. هذا يوفر دقائق في كل عملية بناء.



استخدام .dockerignore

لا تنسَ .dockerignore — فهو يستبعد الملفات غير الضرورية من سياق البناء، مما يسرع نقل البيانات إلى daemon الخاص بـ Docker:

.git.gitignore*.mdDockerfile.dockerignorenode_modulestest/coverage/


3. Docker Compose لـ Go: الشبكات ووحدات التخزين والبنية متعددة الحاويات

نادرًا ما يتكون تطبيق Go الحقيقي من خدمة واحدة. عادةً ما يكون API + قاعدة بيانات + Redis + قائمة انتظار رسائل. يتيح Docker Compose وصف البنية التحتية بأكملها في ملف YAML واحد.



مثال على docker-compose.yml لتطبيق Go

version: '3.8'

services: app: build: context: . docke

المدونات

توصيات الكتب