تنظیم Docker برای یه وب‌اپ Node.js

حمیدرضا مهدوی پناه · خواندن 5 دقیقه · 1065 کلمه · ۱۴۰۰/۲/۹

هدف این نوشته معرفی یه مثاله برای این که چجوری یه اپلیکیشن Node.js رو به یه کانتینر Docker تبدیل کنی. این راهنما برای زمان توسعه اپ هست و نه برای استقرار اپ برای production. همچنین فرض میکنم که یه نسخه‌ی نصب شده از داکر روی سیستمت هست و یه دانش ابتدایی از ساختار یه اپلیکیشن Node.js داری.

در بخش اول این راهنما یه وب‌اپلیکیشن ساده رو با Node.js میسازی و سپس یه image داکر برای اون اپلکیشن درست میکنی و در آخر هم یه کانتینر رو از روی اون image اجرا میکنی.

داکر این امکان رو بهت میده که یه اپلیکیشن رو با محیطش (environment) و تمام وابستگی‌هاش (dependencies) به یه جعبه تبدیل کنی که اسمش هست «کانتینر» (container). معمولا یه کانتینر از یه اپلکیشن تشکیل شده که روی یه سیستم‌عامل لینوکس خیلی سبک و ساده در حال اجراست. یه image یه نقشه و طرح برای کانتینره و یه کانتینر یه نمونه در حال اجرا از یه image هست.

ساخت اپ Node.js 🔗

در ابتدا یه فولدر بساز که تمام فایلها قراره اونجا زندگی کنن. توی این فولدر یه فایل package.json بساز که توضیحاتیه درمورد اپ و وابستگی‌هاش:

 1{
 2  "name": "docker_web_app",
 3  "version": "1.0.0",
 4  "description": "Node.js on Docker",
 5  "author": "First Last <first.last@example.com>",
 6  "main": "server.js",
 7  "scripts": {
 8    "start": "node server.js"
 9  },
10  "dependencies": {
11    "express": "^4.16.1"
12  }
13}

دستور npm install رو اجرا کن. اگه از نسخه‌ی ۵ به بالای npm استفاده میکنی، این دستور یه فایل package-lock.json درست میکنه که بعدا کپی میشه به image داکرت.

سپس یه فایل server.js بساز که یه وب‌اپ رو شامل میشه که از فریمورک Express.js استفاده میکنه:

 1"use strict"
 2
 3const express = require("express")
 4
 5// مقادیر ثابت
 6const PORT = 8080
 7const HOST = "0.0.0.0"
 8
 9// اپ
10const app = express()
11app.get("/", (req, res) => {
12  res.send("Hello World")
13})
14
15app.listen(PORT, HOST)
16console.log(`Running on http://${HOST}:${PORT}`)

توی مراحل بعدی، میبینی که چجوری میتونی این اپ رو با استفاده از ایمیج رسمی داکر، داخل یه کانتینر اجراش کنی. اول از همه نیاز داری تا یه Docker image برای اپلیکیشنت بسازی.

ایجاد یه Dockerfile 🔗

یه فایل خالی بساز که اسمش هست Dockerfile:

1touch Dockerfile

این فایل رو داخل ادیتور مورد علاقت باز کن.

اولین کار اینه که ببینیم از چه ایمیجی کارمون رو شروع کنیم. اینجا از آخرین نسخه‌ی پشتیبانی بلندمدت (LTS) استفاده میکنیم که میشه نسخه‌ی ‍14 از node که در مخزن Docker Hub موجوده:

1FROM node:14

سپس توی ایمیج یه فولدر بساز که داخلش کدهای اپلیکیشن رو قرار بدی، این فولدر قراره فولدر کاری (working directory) برای اپلیکیشنت باشه:

1# رو بساز app دایرکتوری
2WORKDIR /usr/src/app

ایمیج (node:14) از قبل داخلش Node.js و NPM نصب شده و کار بعدی که نیازه بکنی اینه که وابستگی‌های اپلیکیشنت رو با npm نصب کنی. لطفا دقت کن که اگه داری از نسخه‌ی ۴ به پایین npm استفاده میکنی، فایل package-lock.json ساخته نمیشه.

1# وابستگی‌های اپ رو نصب کن
2# از علامت ستاره استفاده شده تا هم فایل قفل و هم فایل عادی کپی بشه
3COPY package*.json ./
4
5RUN npm install
6# اگه داری اپلیکیشن رو برای پروداکشن میسازی از دستور زیر استفاده کن
7# RUN npm ci --only=production

دقت کن که به جای کپی کردن کل فولدر کاریمون، فقط فایل package.json رو کپی کردیم. این کار بهمون اجازه میده تا از مزیت لایه‌های قابل کش در داکر استفاده کنیم (بیشتر بخوانید). علاوه‌بر این، فرمان npm ci کمک میکنه که build های سریعتر، قابل اتکاتر و قابل تکثیر برای محیط‌های پروداکشن بسازیم. در این مورد میتونی اینجا بیشتر بخونی.

برای بسته‌بندی کردن سورس‌کدهای اپ توی ایمیج داکر، از دستور COPY استفاده کن:

1# سورس اپ رو بسته‌بندی کن
2COPY . .

اپلیکیشنت خودشو به پورت 8080 میچسبونه، پس از دستور EXPOSE استفاده کن تا داکر این پورت رو برات مپ کنه:

1EXPOSE 8080

در آخر، فرمانی که اپلیکیشنت رو به اجرا درمیاره با استفاده از CMD تعریف کن. در اینجا ما از ‍node server.js برای شروع سرور استفاده میکنیم:

1CMD [ "node", "server.js" ]

فایل dockerfile الان باید اینشکلی باشه:

 1FROM node:14
 2
 3# رو بساز app دایرکتوری
 4WORKDIR /usr/src/app
 5
 6# وابستگی‌های اپ رو نصب کن
 7# از علامت ستاره استفاده شده تا هم فایل قفل و هم فایل عادی کپی بشه
 8COPY package*.json ./
 9
10RUN npm install
11# اگه داری اپلیکیشن رو برای پروداکشن میسازی از دستور زیر استفاده کن
12
13# سورس اپ رو بسته‌بندی کن
14COPY . .
15
16EXPOSE 8080
17CMD [ "node", "server.js" ]

فایل dockerignore. 🔗

یه فایل ‍‍dockerignore داخل همون فولدری که فایل dockerfile هست بساز که محتواش ایناس:

1node_modules
2npm-debug.log

اینکار باعث میشه که ماژول‌های محلی (ماژول‌هایی که روی سیستم خودت داخل فولدر اپ نصب کردی) و لاگ‌های دیباگ توی ایمیج داکر کپی نشه.

ساخت image 🔗

برو به فولدری که dockerfile داخلشه و فرمان زیر رو اجرا کن تا ایمیج داکر رو بسازه. پرچم t- یه برچسب به ایمیج میچسبونه که بعدا راحت‌تر بتونی با فرمان docker images پیداش کنی:

1docker build . -t <your username>/node-web-app

حالا باید داکر ایمیجت رو لیست کرده باشه:

1$ docker images
2
3# مثال
4REPOSITORY                      TAG        ID              CREATED
5node                            14         1934b0b038d1    5 days ago
6<your username>/node-web-app    latest     d64d3505b0d2    1 minute ago

اجرای image 🔗

اجرا کردن ایمیجل با پرچم d- کانتینر رو در پس‌زمینه اجرا میکنه. پرچم p- یه پورت خصوصی داخل کانتینر رو به یه پورت عمومی ریدایرکت میکنه. ایمیجی که از قبل ساختی رو اجرا کن:

1docker run -p 49160:8080 -d <your username>/node-web-app

خروجی اپلیکیشنت رو چاپ کن:

1# آیدی کانتینر رو پیدا کن
2$ docker ps
3
4# خروجی اپ رو چاپ کن
5$ docker logs <container id>
6
7# مثال
8Running on http://localhost:8080

اگه میخوای بری داخل خود کانتینر، میتونی از فرمان exec استفاده کنی:

1# به کانتینر وارد شو
2$ docker exec -it <container id> /bin/bash

تست 🔗

برای این که اپلیکیشنت رو تست کنی، پورتی رو که داکر مپ کرده پیدا کن:

1$ docker ps
2
3# مثال
4ID            IMAGE                                COMMAND    ...   PORTS
5ecce33b30ebf  <your username>/node-web-app:latest  npm start  ...   49160->8080

توی مثال بالا، داکر پورت داخلی 8080 کانتینر رو به پورت 49160 روی کامپیوترت مپ کرده.

حالا اپلیکیشنت رو با استفاده از curl فراخوانی کن:

 1$ curl -i localhost:49160
 2
 3HTTP/1.1 200 OK
 4X-Powered-By: Express
 5Content-Type: text/html; charset=utf-8
 6Content-Length: 12
 7ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
 8Date: Mon, 13 Nov 2017 20:53:59 GMT
 9Connection: keep-alive
10
11Hello world

امیدوارم این خودآموز بهت کمک کرده باشه که بتونی یه اپلیکیشن ساده Node.js رو با Docker اجرا کنی.


منبع: Dockerizing a Node.js web app از وبسایت رسمی نود جی‌اس