هدف اصلی در این آموزش، نشان دادن نحوه وارد کردن یک اپلیکیشن Node.js به یک کانتینر داکر است. رویکرد کار متمرکز بر توسعه و نه تولید، خواهد بود. همچنین فرض می‌شود که شما یک نسخه آماده از داکر در اختیار دارید و همین‌طور با ساختار اپلیکیشن‌های 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 در داکر آشنا شده باشید. در همین حال، همیشه مطالعه بیشتر می‌تواند تسلط بهتری را در این زمینه‌ها برایتان ایجاد کند.