Docker और TypeScript का परिचय: कंटेनरीकरण की आवश्यकता क्यों है
आधुनिक वेब डेवलपमेंट ऐसे टूल्स के बिना अधूरा है जो एनवायरनमेंट की एकरूपता सुनिश्चित करते हैं। Docker एप्लिकेशन को पैकेज करने, डिलीवर करने और चलाने के लिए डी-फैक्टो मानक बन गया है। TypeScript — एक सख्ती से टाइप की गई भाषा जो JavaScript में कंपाइल होती है — के साथ मिलकर, कंटेनरीकरण स्केलेबल और विश्वसनीय सर्विसेज बनाने के लिए एक शक्तिशाली टूल प्रदान करता है।
TypeScript एप्लिकेशन को कंटेनरीकृत क्यों करें? पहला, यह "मेरी मशीन पर काम करता है" समस्या को हल करता है। दूसरा, यह production और CI/CD में डिप्लॉयमेंट को सरल बनाता है। तीसरा, यह डिपेंडेंसी और Node.js वर्जन को अलग-थलग करने की अनुमति देता है। इस लेख में, हम समझेंगे कि TypeScript एप्लिकेशन के लिए Docker इमेज कैसे बनाएं, multi-stage बिल्ड कैसे सेट करें, और लोकल डेवलपमेंट के लिए docker-compose का उपयोग कैसे करें।
TypeScript डेवलपर के लिए Docker की मूल बातें
कोड लिखने से पहले, आइए Docker की बुनियादी अवधारणाओं को याद करें: इमेज (image) — कंटेनर बनाने के लिए एक टेम्पलेट; कंटेनर (container) — इमेज का एक चलता हुआ इंस्टेंस; Dockerfile — इमेज बनाने के निर्देश।
Node.js पर TypeScript एप्लिकेशन के लिए हमें आवश्यकता होगी:
- Node.js runtime (आमतौर पर न्यूनतम आकार के लिए
node:18-alpineयाnode:20-alpineइमेज) - डिपेंडेंसी इंस्टॉल करना (
npm installयाyarn install) - TypeScript को JavaScript में कंपाइल करना (
tsc) - कंपाइल किए गए एप्लिकेशन को चलाना
TypeScript एप्लिकेशन का एक सरल उदाहरण देखें (फ़ाइल src/index.ts):
import express from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.send('Hello from TypeScript + Docker!');});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});और tsconfig.json:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src"], "exclude": ["node_modules", "dist"]}अब इस एप्लिकेशन के लिए Dockerfile बनाते हैं।
TypeScript एप्लिकेशन के लिए Dockerfile बनाना
बेसिक Dockerfile कुछ इस तरह दिख सकता है:
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM node:18-alpine AS runnerWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package*.json ./COPY --from=builder /app/node_modules ./node_modulesEXPOSE 3000CMD ["node", "dist/index.js"]यहां multi-stage build (बहु-चरणीय बिल्ड) का उपयोग किया गया है। पहला चरण (builder) TypeScript को JavaScript में बिल्ड करता है, दूसरे चरण (runner) में केवल कंपाइल किया गया कोड और runtime-डिपेंडेंसी होती है। इससे अंतिम इमेज का आकार कम हो जाता है — इसमें TypeScript सोर्स और dev-डिपेंडेंसी शामिल नहीं होती।
महत्वपूर्ण: हम पुनरुत्पादकता और गति के लिए npm install के बजाय npm ci (क्लीन इंस्टॉल) करते हैं।
Dockerfile ऑप्टिमाइज़ेशन: लेयर कैशिंग
Docker प्रत्येक लेयर (निर्देश) को कैश करता है। बिल्ड को तेज़ करने के लिए, उन फ़ाइलों को पहले कॉपी करें जो शायद ही कभी बदलती हैं। उदाहरण के लिए, package.json और package-lock.json को सभी सोर्स फ़ाइलों से पहले कॉपी किया जाता है, ताकि कोड में बदलाव से डिपेंडेंसी पुनः इंस्टॉल न हो।
इसके अतिरिक्त, आप .dockerignore जोड़ सकते हैं:
node_modulesdist.git*.md.gitignore.envयह बिल्ड कॉन्टेक्स्ट में अनावश्यक फ़ाइलों को जाने से रोकता है।
लोकल डेवलपमेंट के लिए docker-compose
लोकल डेवलपमेंट की सुविधा के लिए docker-compose.yml का उपयोग करें। यह ऑटोमैटिक रीलोड (nodemon का उपयोग करके) के साथ एप्लिकेशन चलाने की अनुमति देता है।