डॉकर और गो: एप्लिकेशन कंटेनरीकरण आरंभ से अंत तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Docker और Go एक आदर्श जोड़ी क्यों हैं?

\n\n

Go (Golang) और Docker दो ऐसे उपकरण हैं जिन्होंने बैकएंड सेवाओं के विकास और तैनाती के दृष्टिकोण को बदल दिया है। Go एक एकल स्थिर बाइनरी फ़ाइल में संकलित होता है, और Docker आपको इस बाइनरी को एक अलग वातावरण में पैकेज करने की अनुमति देता है। साथ में, वे न्यूनतम, तेज़ और सुरक्षित कंटेनर प्रदान करते हैं जिन्हें कहीं भी चलाया जा सकता है: डेवलपर के लैपटॉप से लेकर प्रोडक्शन Kubernetes क्लस्टर तक।

\n\n

इस लेख में, हम शून्य से लेकर प्रोडक्शन के लिए तैयार Go-एप्लिकेशन तक का सफर तय करेंगे, जिसे Docker में पैकेज किया गया है। आप सीखेंगे कि Dockerfile कैसे लिखें, इमेज के आकार को कैसे ऑप्टिमाइज़ करें, मल्टी-स्टेज बिल्ड का उपयोग कैसे करें और Go-सर्विस के साथ कंटेनर कैसे चलाएं।

\n\n

1. मूल बातें: Go-एप्लिकेशन और एक सरल Dockerfile

\n\n

आइए Go में एक सरल HTTP सर्वर से शुरू करते हैं। एक फ़ाइल बनाएं main.go:

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n)\n\nfunc main() {\n    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n        fmt.Fprintf(w, "Hello from Go inside Docker!")\n    })\n\n    fmt.Println("Server is running on :8080")\n    http.ListenAndServe(":8080", nil)\n}\n
\n\n

अब एक न्यूनतम Dockerfile लिखें:

\n\n
FROM golang:1.22-alpine AS builder\n\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN go build -o server .\n\nFROM alpine:3.19\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]\n
\n\n

इमेज बनाएं और कंटेनर चलाएं:

\n\n
docker build -t go-server .\ndocker run -p 8080:8080 go-server\n
\n\n

अब ब्राउज़र खोलें और http://localhost:8080 पर जाएं — आपको कंटेनर के अंदर चल रहे Go-एप्लिकेशन से एक स्वागत संदेश दिखाई देगा।

\n\n

मल्टी-स्टेज बिल्ड क्यों?

\n

पहले चरण में, हम संकलन के लिए पूर्ण टूलसेट के साथ आधिकारिक Go इमेज का उपयोग करते हैं। दूसरे चरण में, हम न्यूनतम Alpine Linux का उपयोग करते हैं, जहां केवल तैयार बाइनरी कॉपी की जाती है। यह हमें 500+ MB के बजाय लगभग 15-20 MB आकार की इमेज प्राप्त करने की अनुमति देता है, यदि हम पूर्ण Go इमेज को रखते।

\n\n

2. इमेज ऑप्टिमाइज़ेशन: आकार और बिल्ड गति को न्यूनतम करना

\n\n

छोटी इमेज का मतलब न केवल जगह की बचत है, बल्कि तेज़ लोडिंग और हमलों के लिए छोटी सतह भी है। आइए Go-एप्लिकेशन के लिए प्रमुख तकनीकों पर विचार करें।

\n\n

2.1. .dockerignore का उपयोग करें

\n

प्रोजेक्ट की रूट में एक फ़ाइल .dockerignore बनाएं:

\n\n
.git\n*.md\nDockerfile\n.dockerignore\nnode_modules/\ntest/\n
\n\n

यह बिल्ड कॉन्टेक्स्ट में अनावश्यक फ़ाइलों की कॉपी को रोकेगा और प्रक्रिया को गति देगा।

\n\n

2.2. डिपेंडेंसी कैशिंग

\n

हमारे Dockerfile में, हम पहले केवल go.mod और go.sum कॉपी करते हैं, फिर go mod download चलाते हैं। Docker प्रत्येक लेयर को कैश करता है, और जब तक ये फ़ाइलें नहीं बदलतीं, कोड में प्रत्येक बदलाव पर डिपेंडेंसी पुनः लोड नहीं होंगी।

\n\n

2.3. CGO और स्थिर संकलन

\n

Go डिफ़ॉल्ट रूप से कुछ ऑपरेशनों (जैसे, सिस्टम कॉल के माध्यम से नेटवर्किंग) के लिए CGO का उपयोग करता है। libc पर निर्भरता के बिना पूरी तरह से स्थिर बाइनरी प्राप्त करने के लिए, संकलन फ़्लैग का उपयोग करें:

\n\n
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o server .\n
\n\n

यह सुनिश्चित करता है कि बाइनरी किसी भी Linux वितरण पर काम करेगी, जिसमें scratch जैसी न्यूनतम इमेज शामिल हैं।

\n\n

2.4. Scratch — सबसे हल्का बेस इमेज

\n

यदि आपके एप्लिकेशन को शेल, ping या अन्य उपयोगिताओं की आवश्यकता नहीं है, तो खाली इमेज scratch का उपयोग करें:

\n\n
FROM scratch\nCOPY --from=builder /app/server /\nEXPOSE 8080\nCMD ["/server"]\n
\n\n

ऐसी इमेज का आकार बाइनरी के आकार के बराबर होगा — अक्सर 10 MB से कम।

\n\n

3. Docker Compose: मल्टी-कंटेनर Go-एप्लिकेशन

\n\n

वास्तविक एप्लिकेशन शायद ही कभी केवल एक कंटेनर से मिलकर बने होते हैं।

ब्लॉग

पुस्तक अनुशंसाएँ