परिचय: कंटेनरीकरण की दुनिया में सरल से जटिल की ओर
\n\nप्रारंभिक स्तर पर, डॉकर और जावास्क्रिप्ट (Node.js) के साथ काम करना अक्सर एक सरल Dockerfile बनाने और कंटेनर चलाने तक सीमित होता है। हालाँकि, वास्तविक प्रोडक्शन सिस्टम में यह पर्याप्त नहीं है। उन्नत स्तर में बिल्ड मैकेनिज़्म, इमेज साइज़ ऑप्टिमाइज़ेशन, डिपेंडेंसी मैनेजमेंट, नेटवर्क आइसोलेशन और सुरक्षा की गहरी समझ शामिल है।
इस लेख में, हम Node.js एप्लिकेशन के पेशेवर कंटेनरीकरण के प्रमुख पहलुओं पर चर्चा करेंगे। आप सीखेंगे कि मल्टी-स्टेज बिल्ड का उपयोग कैसे करें, माइक्रोसर्विस आर्किटेक्चर के लिए डॉकर कम्पोज़ कैसे सेट करें, एनवायरनमेंट वेरिएबल्स को कैसे प्रबंधित करें और अटैक सरफेस को कैसे कम करें। यह सामग्री उन डेवलपर्स के लिए है जो पहले से ही डॉकर और जावास्क्रिप्ट की मूल बातों से परिचित हैं।
\n\n1. Node.js के लिए मल्टी-स्टेज बिल्ड
\n\nNode.js एप्लिकेशन को कंटेनरीकृत करने की मुख्य समस्याओं में से एक फाइनल इमेज का अत्यधिक आकार है। एकल Dockerfile वाला मानक दृष्टिकोण बिल्ड टूल्स (TypeScript, Webpack, Babel) को शामिल करता है, जो रनटाइम में आवश्यक नहीं होते हैं। मल्टी-स्टेज बिल्ड प्रक्रिया को चरणों में विभाजित करने की अनुमति देता है: बिल्ड और निष्पादन।
1.1. दो चरणों वाले Dockerfile का उदाहरण
\n\n# बिल्ड चरण\nFROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build # मान लिया गया है कि build स्क्रिप्ट प्रोजेक्ट को बनाती है\n\n# निष्पादन चरण (प्रोडक्शन)\nFROM node:20-alpine AS production\nWORKDIR /app\n# केवल node_modules और बिल्ट फ़ाइलों को कॉपी करें\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/dist ./dist\nCOPY package*.json ./\n\nEXPOSE 3000\nUSER node\nCMD ["node", "dist/index.js"]\n\nमुख्य बिंदु:
\n- \n
node:20-alpine— Alpine Linux पर आधारित हल्का इमेज (लगभग 30 MB)। \n npm ci—package-lock.jsonके अनुसार सख्ती से डिपेंडेंसी की स्वच्छ स्थापना। \n --only=production— dev-डिपेंडेंसी (TypeScript, परीक्षण) को बाहर करता है। \n USER node— सुरक्षा के लिए root उपयोगकर्ता को छोड़ना। \n
परिणामस्वरूप, फाइनल इमेज में केवल चलाने के लिए आवश्यक फ़ाइलें होती हैं, और आकार 300-400 MB से घटकर 80-120 MB हो जाता है।
\n\n1.2. लेयर कैशिंग का अनुकूलन
\n\nडॉकर प्रत्येक लेयर (कमांड) को कैश करता है। बार-बार बिल्ड को गति देने के लिए, सभी सोर्स कोड को कॉपी करने से पहले package*.json को कॉपी करें। यदि डिपेंडेंसी नहीं बदली है, तो npm ci वाली लेयर कैश से ली जाएगी।
COPY package*.json ./\nRUN npm ci --only=production\nCOPY . . # केवल तभी कॉपी किया जाता है जब सोर्स बदल गए हों\n\n2. माइक्रोसर्विस आर्किटेक्चर के लिए डॉकर कम्पोज़
\n\nप्रोडक्शन में, Node.js एप्लिकेशन शायद ही कभी अलग-थलग काम करता है। आमतौर पर एक डेटाबेस (PostgreSQL, MongoDB), कैश (Redis) या मैसेज क्यू (RabbitMQ) की आवश्यकता होती है। डॉकर कम्पोज़ आपको एक ही YAML फ़ाइल में पूरे इंफ्रास्ट्रक्चर का वर्णन करने की अनुमति देता है।
\n\n2.1. Node.js + Redis के लिए docker-compose.yml का उदाहरण
\n\nversion: '3.8'\nservices:\n app:\n build:\n context: .\n dockerfile: Dockerfile.prod\n ports:\n - "3000:3000"\n environment:\n - NODE_ENV=production\n - REDIS_URL=redis://redis:6379\n depends_on:\n - redis\n networks:\n - backend\n\n redis:\n image: redis:7-alpine\n ports:\n - "6379:6379"\n volumes:\n - redis_data:/data\n networks:\n - backend\n\nvolumes:\n redis_data:\n\nnetworks:\n backend:\n driver: bridge\n\nमहत्वपूर्ण पहलू:
\n- \n
- नेटवर्क आइसोलेशन: सेवाएँ आंतरिक नेटवर्क
backendके माध्यम से संवाद करती हैं। Redis बाहर से सुलभ नहीं है (जब तक पोर्ट फ़ॉरवर्ड न किया जाए)। \n - नामित वॉल्यूम:
redis_dataसहेजता है \n