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

به این راهنما در مورد نحوه داکر کردن برنامه 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
خدمات، امکان ارتباط بین آنها را فراهم می کند.
راه اندازی کانتینرهای ما
-
مطمئن شوید که Docker را روی دستگاه خود نصب کرده اید. اگر آن را نصب نکردهاید، میتوانید مقاله قبلی من را بخوانید که در آن نحوه نصب Docker و Docker Compose را در محیط توسعه ویندوز اوبونتو توضیح میدهم.
-
یک ترمینال یا خط فرمان باز کنید و به دایرکتوری که در آن هستید بروید
docker-compose.yml
فایل قرار دارد. -
هنگامی که شما در دایرکتوری با
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 خود لذت برده باشید. اگر سؤال یا بازخوردی دارید، در زیر نظر خود را در نظر بگیرید یا به من پیام دهید توییتر یا لینکدین کد نویسی مبارک!.