هدف اصلی در این آموزش، نشان دادن نحوه وارد کردن یک اپلیکیشن Node.js به یک کانتینر داکر است. رویکرد کار متمرکز بر توسعه و نه تولید، خواهد بود. همچنین فرض میشود که شما یک نسخه آماده از داکر در اختیار دارید و همینطور با ساختار اپلیکیشنهای Node.js آشنا هستید.
در اولین بخش از این آموزش، یک اپلیکیشن وب ساده در Node.js ایجاد میکنیم. سپس یک «داکر ایمیج» برای این اپلیکیشن میسازیم و نهایتاً یک کانتینر از این ایمیج بارگذاری میکنیم.
داکر این امکان را فراهم میکند که یک اپلیکیشن و متعلقاتش را درون یک چارچوب با عنوان «کانتینر» بستهبندی کنیم. معمولاً یک کانتینر متشکل از یک اپلیکیشن در سادهترین فرم اجرای آن در یک سیستمعامل لینوکس است. یک ایمیج «اثر انگشتی» از یک کانتینر محسوب میشود و یک کانتینر، نسخه اجرایی یک ایمیج است.
ساخت اپلیکیشن Node.js
ابتدا یک دایرکتوری جدید برای حضور تمام فایلها میسازیم. در این دایرکتوری، یک فایل package.json ایجاد میکنیم که توصیفکنندده اپلیکیشن و متعلقات آن خواهد بود.
{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First Last <first.last@example.com>", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.16.1" } }
با داشتن این فایل جدید package.json، فرمان npm install را اجرا کنید. اگر از نسخه ۵ یا جدیدتر npm استفاده میکنید، نتیجه یک فایل package-lock.json خواهد بود که در داکر ایمیج ذخیره خواهد شد.
حالا با استفاده از فریمورک Express.js، یک فایل server.js تولید کنید که توصیفکننده اپلیکیشن Node.js شماست.
'use strict'; const express = require('express'); // Constants const PORT = 8080; const HOST = '0.0.0.0'; // App const app = express(); app.get('/', (req, res) => { res.send('Hello World'); }); app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`);
در مراحل بعدی، نحوه اجرای این اپلیکیشن را درون یک داکر کانتینر با استفاده از داکر ایمیج رسمی بررسی میکنیم. البته ابتدا باید یک داکر ایمیج از اپلیکیشن Node.js خود بسازید.
تولید یک داکرفایل
یک فایل خالی با نام «داکرفایل» ایجاد کنید.
touch Dockerfile
داکرفایل را در ویرایشگر متنی دلخواهتان باز کنید.
اولین کاری که باید انجام دهیم، تعریف ایمیجی است که میخواهیم بر اساس آن ساختار را ایجاد کنیم. در انیجا از آخرین نسخه LTS، یعنی نسخه 12 از node که در داکر هاب در دسترس است، استفاده خواهیم کرد.
FROM node:12
حالا یک دایرکتوری برای نگهداری کد اپلیکیشن Node.js درون ایمیج میسازیم. این دایرکتوری اجرایی برای اپلیکیشن شما خواهد بود.
# Create app directory WORKDIR /usr/src/app
این ایمیج به همراه Node.js و نصب NPM خواهد بود. بنابراین کار بعدی شما نصب متعلقات اپلیکیشن Node.js با استفاده از npm است. به خاطر داشته باشید که در صورتی که از نسخه ۴ یا پایینتر npm استفاده میکنیم، فایل package-lock.json برایتان تولید نخواهد شد.
# Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm ci --only=production
دقت داشته باشید که به جای کپی کردن تمام دایرکتوری، ما در اینجا فقط فایل package.json را کپی کردهایم. این موضوع به ما اجازه میدهد که از ذخیره پنهان لایههای داکر استفاده کنیم. به علاوه، فرمان npm ci کمک زیادی به سرعت، دقت و مدیریت توسعه در این فضا خواهد کرد.
برای قراردادن سورسکد اپلیکیشن Node.js درون داکر ایمیج، از دستور COPY استفاده کنید.
# Bundle app source COPY . .
اپلیکیشن شما به پورت 8080 مرتبط است و بر این اساس، باید از فرمان EXPOSE برای ارجاع به داکر استفاده نمایید.
EXPOSE 8080
در یکی از آخرین مراحل با استفاده از CMD، یک فرمان برای اجرای اپلیکیشن تعریف کنید. در اینجا از فرمان node server.js برای شروع به کار سرور استفاده میکنیم.
CMD [ "node", "server.js" ]
در نتیجه داکرفایل شما باید ظاهری شبیه به زیر داشته باشد.
FROM node:12 # Create app directory WORKDIR /usr/src/app # Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm ci --only=production # Bundle app source COPY . . EXPOSE 8080 CMD [ "node", "server.js" ]
فایل .dockerignore
در همین دایرکتوری یک فایل .dockerignore به عنوان داکرفایل و با محتوای زیر ایجاد کنید.
node_modules npm-debug.log
این کار باعث جلوگیری از کپیشدن ماژولهای محلی و ثبتوقایع عیبیابیها به داکر ایمیج و بازنویسی احتمالی ماژولها درون ایمیج خواهد شد.
ساخت ایمیج اپلیکیشن Node.js
به دایرکتوری حاوی داکرفایل خود بروید و با اجرای فرمان زیر، داکر ایمیج خود را بسازید. گزینه -t به شما اجازه میدهد که برای ایمیج خود برچسب انتخاب کنید و یافتن آن در ادامه، برایتان سادهتر خواهد بود.
docker build -t <your username>/node-web-app .
هماکنون ایمیج شما وارد لیست داکر میشود.
$ docker images # Example REPOSITORY TAG ID CREATED node 12 1934b0b038d1 5 days ago <your username>/node-web-app latest d64d3505b0d2 1 minute ago
اجرای ایمیج
اجرای ایمیج با گزینه -d باعث میشود که کانتینر بتواند در پسزمینه به صورت مستقل فعال باشد. گزینه -p نیز باعث هدایت پورت عمومی به یک پورت اختصاصی درون کانتینر خواهد شد. برای این منظور، فرمان زیر را تایپ نمایید.
docker run -p 49160:8080 -d <your username>/node-web-app
خروجی اپلیکیشن Node.js خود را چاپ کنید.
# Get container ID $ docker ps # Print app output $ docker logs <container id> # Example Running on http://localhost:8080 اگر بخواهید وارد کانتینر شوید، میتوانید از فرمان exec استفاده کنید. # Enter the container $ docker exec -it <container id> /bin/bash
آزمایش اپلیکیشن Node.js
برای تست اپلیکیشن، پورت آن را که بهوسیله داکر ارجاع داده میشود، دریافت کنید.
$ docker ps # Example ID IMAGE COMMAND ... PORTS ecce33b30ebf <your username>/node-web-app:latest npm start ... 49160->8080
در مثال بالا، داکر پورت 8080 را درون کانتینر به پورت 49160 در سیستم شما ارجاع میدهد. حالا میتوانید با استفاده از فرمان curl اپلیکیشن Node.js خود را فراخوانی کنید. در صورتی که این ابزار را در اختیار ندارید، میتوانید با فرمان sudo apt-get install curl آن را نصب کنید.
$ curl -i localhost:49160 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 12 ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0" Date: Mon, 13 Nov 2017 20:53:59 GMT Connection: keep-alive Hello world
جمعبندی
امیدواریم که این آموزش موردتوجه شما قرار گرفته و شما با نحوه اجرا یک اپلیکیشن Node.js در داکر آشنا شده باشید. در همین حال، همیشه مطالعه بیشتر میتواند تسلط بهتری را در این زمینهها برایتان ایجاد کند.