برنامه نویسی

Docker کردن برنامه Node.js شما – انجمن DEV

docker-nodejs

به این راهنما در مورد نحوه داکر کردن برنامه Node.js خود خوش آمدید! Docker یک ابزار فوق العاده قدرتمند است که به شما امکان می دهد برنامه خود را با تمام وابستگی های آن در یک واحد استاندارد به نام کانتینر بسته بندی کنید. این امر استقرار و اجرای برنامه شما را به طور مداوم در محیط های مختلف آسان تر می کند.

در این مقاله، یک نمونه فایل Dockerfile و docker-compose.yml را بررسی خواهیم کرد و هر بخش مربوطه و دلیل استفاده از آن را توضیح خواهیم داد. بنابراین، بیایید شیرجه بزنیم!

Dockerfile

ROM node:18.16.1-alpine3.18 as base

# Create Directory for the Container
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package*.json /

# Expose API Port
EXPOSE 3000

# ---------------------- START DEVELOPMENT CONFIGURATION -----------------------
FROM base as development
ENV NODE_ENV development

# Copy all other source code to work directory
COPY --chown=node:node . .

# Run npm and install modules
RUN npm i

USER node

# Run start development command
CMD ["npm", "run", "start:dev"]
# ----------------------- END DEVELOPMENT CONFIGURATION ------------------------

# ----------------------- START PRODUCTION CONFIGURATION -----------------------
FROM base as production
ENV NODE_ENV production

# Copy all other source code to work directory
COPY --chown=node:node . .

# Run npm and install production modules
RUN npm ci --only=production

USER node

# Run start production command
CMD ["node", "bin/www/index.js"]
# ------------------------ END PRODUCTION CONFIGURATION ------------------------
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dockerfile یک فایل متنی است که حاوی دستورالعمل هایی در مورد نحوه ساخت یک تصویر Docker است. محیط، وابستگی ها و دستورات مورد نیاز برای اجرای برنامه شما در داخل یک کانتینر را تعریف می کند. در اینجا تفکیک Dockerfile ارائه شده است:

FROM node:18.16.1-alpine3.18 as base
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما با مشخص کردن تصویر پایه خود شروع می کنیم. در این مورد، ما از node:18.16.1-alpine3.18 تصویر، که شامل Node.js نصب شده بر روی یک توزیع Alpine Linux است. استفاده از Alpine به عنوان تصویر پایه، اندازه تصویر را کوچک نگه می‌دارد.
WORKDIR /usr/src/app
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • بعد، دایرکتوری کاری داخل کانتینر را روی آن تنظیم می کنیم /usr/src/app. در اینجا کد برنامه ما کپی می شود.
COPY package*.json /
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما کپی می کنیم package.json و package-lock.json فایل ها از ماشین محلی ما به دایرکتوری ریشه داخل ظرف. این به Docker اجازه می دهد تا از مکانیسم کش خود برای ساخت سریع تر استفاده کند.
EXPOSE 3000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • پورت 3000 را در معرض دید قرار می دهیم تا امکان ارتباط با برنامه کانتینری را فراهم کنیم.
FROM base as development
ENV NODE_ENV development
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در اینجا یک مرحله ساخت جدید به نام تعریف می کنیم development بر اساس base صحنه. را تنظیم کردیم NODE_ENV متغیر محیطی به development.
COPY --chown=node:node . .
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما تمام کد منبع را از ماشین محلی خود در دایرکتوری کاری داخل ظرف کپی می کنیم. این --chown=node:node flag تضمین می کند که فایل های کپی شده متعلق به غیر ریشه هستند node کاربر، بهبود امنیت
RUN npm i
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • این دستور اجرا می شود npm install برای نصب وابستگی های مشخص شده در package.json فایل.
USER node
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • کاربر را به غیر روت تغییر می دهیم node کاربر برای بهبود امنیت
CMD ["npm", "run", "start:dev"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در نهایت دستوری را تنظیم می کنیم که با شروع کانتینر اجرا شود. در این صورت اجرا می شود npm run start:dev، که یک دستور سفارشی است که در package.json فایل.

پیکربندی فوق محیط توسعه را در ظرف Docker تنظیم می کند. حالا بیایید نگاهی به پیکربندی تولید بیندازیم.

FROM base as production
ENV NODE_ENV production
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • مشابه مرحله توسعه، یک مرحله ساخت جدید به نام تعریف می کنیم production بر اساس base صحنه. این NODE_ENV متغیر محیطی روی production.
COPY --chown=node:node . .
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما دوباره همه کد منبع، از جمله هر فایل اضافی را در دایرکتوری کاری داخل ظرف کپی می کنیم.
RUN npm ci --only=production
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • به جای دویدن npm install، ما استفاده می کنیم npm ci برای نصب فقط وابستگی های تولید، از وابستگی های توسعه صرف نظر کنید. این یک تصویر تولید ناب و بهینه را تضمین می کند.
USER node
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما به غیر ریشه تغییر می کنیم node کاربر برای بهبود امنیت
CMD ["node", "bin/www/index.js"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در نهایت، دستور اجرای سرور تولید را با استفاده از node فرمان را اجرا می کند index.js فایل واقع در bin/www/ فهرست راهنما.

این برای Dockerfile است! حالا بیایید به سراغ فایل docker-compose.yml برویم.

docker-compose.yml

Docker Compose ابزاری برای تعریف و اجرای برنامه های Docker چند کانتینری است. این به شما امکان می دهد خدمات، وابستگی ها و تنظیمات مورد نیاز برای اجرای پشته برنامه خود را مشخص کنید. در اینجا توضیحی درباره فایل docker-compose.yml ارائه شده است:

version: "3.8"
services:
  rest-api:
    container_name: rest-api-app
    restart: on-failure
    build:
      context: ./
      target: production
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - .:/usr/src/app
    command: npm run start
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
      PORT: 3000
      HOSTNAME: 0.0.0.0
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما نسخه فرمت فایل Compose را که از آن استفاده می کنیم را مشخص می کنیم 3.8.

  • زیر services بخش، سرویسی به نام تعریف می کنیم rest-api، که برنامه Node.js ما را نشان می دهد.

  • را تنظیم کردیم container_name به rest-api-app برای شناسایی راحت تر

  • این restart گزینه تنظیم شده است on-failure، به این معنی که در صورت خرابی کانتینر به طور خودکار راه اندازی مجدد می شود.

  • این build بخش نحوه ساخت سرویس را مشخص می کند. را تنظیم کردیم context به دایرکتوری فعلی و target به production، که مربوط به مرحله تولید در Dockerfile است.

  • این volumes بخش نگاشت حجم بین ماشین میزبان و ظرف را تعریف می کند. دایرکتوری فعلی را ترسیم می کند (.) به /usr/src/app دایرکتوری داخل کانتینر، اجازه بارگذاری مجدد کد زنده در طول توسعه را می دهد.

  • این command دستور شروع سرویس را مشخص می کند. در این صورت اجرا می شود npm run start، که در تعریف شده است package.json فایل.

  • این ports پورت نقشه های بخش 3000 از کانتینر به ماشین میزبان، اجازه دسترسی به API را می دهد.

  • این environment بخش متغیرهای محیطی مورد نیاز برنامه از جمله NODE_ENV، PORT، و HOSTNAME.

docker-compose.override.yml

این docker-compose.override.yml file یک فایل لغو اختیاری است که به ما امکان می دهد پایه را تغییر دهیم docker-compose.yml پیکربندی در اینجا یک تفکیک از بخش های لغو شده است:

version: "3.8"
services:
  postgres:
    image: "postgres:15.3-alpine3.18"
    container_name: rest-api-app-database
    restart: on-failure
    ports:
      - "5432:5432"
    volumes:
      - "./temp/postgres/data:/var/lib/postgresql/data"
    environment:
      POSTGRES_DB: rest-api-app
      POSTGRES_USER: rest-api-app
      POSTGRES_PASSWORD: ujt9ack5gbn_TGD4mje

  rest-api:
    build:
      context: ./
      target: development
    command: npm run start:dev
    volumes:
      - /usr/src/app/node_modules/
    ports:
      - "9229:9229"
    environment:
      NODE_ENV: development
      DATABASE_URL: "PROVIDER://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA"
      TOKEN_SECRET: ERN7kna-hqa2xdu4bva
      EXPIRES_IN: 3600
    links:
      - postgres
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ما سرویسی به نام تعریف می کنیم postgres برای نشان دادن یک ظرف پایگاه داده PostgreSQL. از آن استفاده می کند postgres:15.3-alpine3.18 تصویر و متغیرهای محیطی لازم را برای پایگاه داده تنظیم می کند. ظرف نامگذاری شده است rest-api-app-database.

  • این rest-api سرویس برای استفاده از مرحله توسعه در Dockerfile. این به ما اجازه می دهد تا برنامه را در یک محیط توسعه با ویژگی های اضافی مانند بارگذاری مجدد داغ اجرا کنیم.

  • target: development مشخص می کند که مرحله ساخت نام دارد development از Dockerfile باید برای ساخت استفاده شود rest-api سرویس. این به شما امکان می دهد تا رفتار کانتینر را به طور خاص برای اهداف توسعه سفارشی کنید.

  • پورت را نقشه می گیریم 9229 کانتینر به دستگاه میزبان برای اهداف اشکال زدایی.

  • این environment بخش متغیرهای محیطی اضافی را تعریف می کند، مانند DATABASE_URL، TOKEN_SECRET، و EXPIRES_IN، که برای عملکرد صحیح برنامه مورد نیاز هستند.

  • این links بخش ارتباطی بین rest-api خدمات و postgres خدمات، امکان ارتباط بین آنها را فراهم می کند.

راه اندازی کانتینرهای ما

  1. مطمئن شوید که Docker را روی دستگاه خود نصب کرده اید. اگر آن را نصب نکرده‌اید، می‌توانید مقاله قبلی من را بخوانید که در آن نحوه نصب Docker و Docker Compose را در محیط توسعه ویندوز اوبونتو توضیح می‌دهم.

  2. یک ترمینال یا خط فرمان باز کنید و به دایرکتوری که در آن هستید بروید docker-compose.yml فایل قرار دارد.

  3. هنگامی که شما در دایرکتوری با docker-compose.yml فایل، دستور زیر را اجرا کنید:

docker-compose up -d
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور تصاویر Docker لازم را می سازد، کانتینرها را مطابق با پیکربندی مشخص شده در docker-compose.yml و docker-compose.override.yml فایل ها.

این -d flag مخفف “جدا شده” است و به Docker Compose دستور می دهد تا کانتینرها را در پس زمینه اجرا کند. این به شما امکان می دهد بدون اتصال به خروجی کانتینر به استفاده از ترمینال ادامه دهید.

با اجرای Docker Compose در حالت جدا، می توانید به راحتی کانتینرهای برنامه خود را مدیریت و کنترل کنید و در عین حال انعطاف پذیری لازم برای ادامه کار بر روی سایر وظایف در ترمینال خود را دارید.

اگر همه چیز خوب پیش رفت، باید سیاهههای مربوط به کانتینرهای ترمینال را ببینید. در طول فرآیند راه اندازی به دنبال پیام های خطا یا هشدار باشید.

پس از اینکه کانتینرها با موفقیت راه اندازی شدند، می توانید با باز کردن یک مرورگر وب و بازدید از برنامه Node.js خود به برنامه دسترسی داشته باشید http://localhost:3000. این فرض را بر این می گذارد که پورت 3000 در حال حاضر در دستگاه شما استفاده نمی شود.

برای بررسی وضعیت کانتینرهای در حال اجرا می توانید از دستور زیر استفاده کنید:

docker-compose ps
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور وضعیت هر سرویس تعریف شده در را نشان می دهد docker-compose.yml فایل، شامل نام کانتینر، پورت های نگاشت شده به دستگاه میزبان و وضعیت فعلی آنها.

برای متوقف کردن و حذف کانتینرهای ایجاد شده توسط Docker Compose، می توانید از دستور زیر استفاده کنید:

docker-compose down
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور کانتینرها و همچنین شبکه ها و حجم های ایجاد شده توسط Docker Compose را متوقف و حذف می کند.

به یاد داشته باشید، اگر تغییری در کد یا فایل های پیکربندی خود ایجاد کردید، می توانید به سادگی آن را دوباره اجرا کنید docker-compose up -d دستور برای بازسازی و راه اندازی مجدد کانتینرها با کد به روز شده.

برای مدیریت بهتر و آسان کانتینرهایمان، از Lazydocker استفاده می کنم. برای توضیح ابزار و نحوه نصب آن، می توانید مقاله قبلی من را بخوانید که در آن نحوه نصب و مدیریت Lazydocker در محیط توسعه ویندوز اوبونتو را توضیح می دهم.

خودشه! با این Dockerfile و docker-compose.yml با پیکربندی، می توانید به راحتی برنامه Node.js خود را کانتینری کنید و آن را در محیط های مختلف قابل حمل و سازگار کنید. توسعه کانتینری مبارک!

امیدوارم از این راهنمای Dockerizing برنامه Node.js خود لذت برده باشید. اگر سؤال یا بازخوردی دارید، در زیر نظر خود را در نظر بگیرید یا به من پیام دهید توییتر یا لینکدین کد نویسی مبارک!.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا