Docker Compose برای یک برنامه Full-Stack با React، Node.js و PostgreSQL
مقدمه
بنابراین شما یک برنامه Full Stack ساخته اید که آنطور که می خواهید کار می کند و می خواهید آن را به نمایش بگذارید. با این حال، وابستگیها و محیطها باعث میشوند که فقط روی دستگاه شما اجرا شود. خوب، همانطور که قبلاً ممکن است بدانید که Docker Compose می تواند از آن مراقبت کند. بیایید شروع کنیم به اینکه چگونه می توان این کار را بدون بحث بیشتر انجام داد. این آموزش برای کسانی است که ایده ای در مورد ایجاد برنامه ها و سرورها دارند و همچنین دانش اولیه Docker را دارند.
TL; DR
کد منبع را می توانید در اینجا در Github پیدا کنید. برای راه اندازی این پروژه، مراحل زیر را دنبال کنید
- مطمئن شوید که Docker را در سیستم خود نصب کرده اید. برای مراحل نصب، مراحل زیر را دنبال کنید:
- برای مک
- برای اوبونتو
- برای پنجره ها
- مخزن را در دستگاه خود کلون کنید
- یک ترمینال را از دایرکتوری پروژه کلون شده باز کنید (در جایی که
docker-compose.yml
فایل موجود است) - دستور را اجرا کنید:
docker compose up
همین! این باید پروژه را راه اندازی و اجرا کند. برای دیدن خروجی می توانید دسترسی داشته باشید http://127.0.0.1:4172
از مرورگر و شما باید یک صفحه وب با لیستی از کاربران پیدا کنید. کل این سیستم با کلاینت، سرور و پایگاه داده در داخل داکر اجرا می شود و از دستگاه شما قابل دسترسی است.
در اینجا توضیح مفصلی در مورد آنچه اتفاق می افتد ارائه شده است.
1. معرفی
Docker در هسته خود یک پلتفرم به عنوان سرویسی است که از مجازی سازی در سطح سیستم عامل برای استقرار/ارائه نرم افزار در بسته هایی به نام کانتینر استفاده می کند. این برای مزایای مختلفی مانند سازگاری پلت فرم متقابل و انعطاف پذیری و مقیاس پذیری انجام می شود.
Docker Compose ابزاری برای تعریف و اجرای برنامه های چند کانتینری است. این کلید باز کردن یک تجربه توسعه و استقرار کارآمد و کارآمد است.
2. استفاده از Docker و Docker Compose
هنگامی که صحبت از کار با برنامه های Full Stack به میان می آید، یعنی برنامه هایی که شامل بیش از یک مجموعه فناوری برای ادغام آن در یک سیستم کامل می شود، Docker برای پیکربندی از ابتدا می تواند نسبتاً طاقت فرسا باشد. با این واقعیت که انواع مختلفی از وابستگیهای محیطی برای هر فناوری خاص وجود دارد، آسانتر نمیشود و تنها منجر به خطر خطا در سطح استقرار میشود.
توجه داشته باشید: را .env
فایل مجاور در دایرکتوری با docker-compose.yml
شامل متغیرهای خاصی است که در فایل نوشتن docker استفاده می شود. هر زمان که به آنها دسترسی داشته باشید ${
علامت گذاری استفاده می شود.
این مثال با PostgreSQL به عنوان پایگاه داده، یک سرور Node/Express JS بسیار کم و React JS به عنوان برنامه سمت کلاینت کار خواهد کرد.
3. کانتینرهای فردی
بخش زیر به تفکیک چگونگی docker-compose.yml
فایل با فرد کار می کند Dockerfile
. بیایید ابتدا به فایل docker-compose نگاهی بیندازیم. ما یک کلید به نام داریم services
در بالا، که برنامه ها/سرویس های مختلفی را که می خواهیم اجرا کنیم را تعریف می کند. همانطور که این یک است .yml
به یاد داشته باشید که تورفتگی ها بسیار مهم هستند. بیایید به اولین سرویس تعریف شده در این فایل نوشتن docker، پایگاه داده، شیرجه بزنیم.
1. پایگاه داده
اول از همه، پایگاه داده باید راه اندازی و اجرا شود تا سرور بتواند به آن متصل شود. پایگاه داده در این نمونه خاص به هیچ Dockerfile نیاز ندارد، با این حال، می توان آن را با Dockerfile نیز انجام داد. بیایید تنظیمات را مرور کنیم.
docker-compose.yml
postgres:
container_name: database
ports:
- "5431:5432"
image: postgres
environment:
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./docker_test_db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
interval: 5s
timeout: 60s
retries: 5
start_period: 80s
توضیح
- postgres: برای شناسایی سرویسی که بخش فایل نوشتن برای آن است استفاده می شود
- container_name: نام سرویس/کانتینری که انتخاب کرده ایم
- پورت ها: پورت میزبان را (که آن را از خارج قابل دسترسی می کند) به پورتی که توسط برنامه در Docker استفاده می شود، نگاشت می کند.
- تصویر: تصویر Docker را تعریف می کند که برای عملکرد و اجرا کردن این کانتینر لازم است
-
محیط: متغیرهای تعریف شده برای محیط این سرویس خاص. به عنوان مثال، برای این سرویس PostgreSQL، a را تعریف خواهیم کرد
POSTGRES_USER
،POSTGRES_PASSWORD
وPOSTGRES_DB
. همه آنها با مقادیر موجود در.env
. - جلدها: این کلید خاص برای این است که می خواهیم ظرفی بسازیم که می تواند اصرار ورزیدن داده ها. این بدان معنی است که معمولاً وقتی یک کانتینر Docker پایین میآید، دادههای بهروز شده روی آن نیز خراب میشود. با استفاده از حجمها، یک فهرست خاص از ماشین محلی خود را با فهرستی از کانتینر نگاشت میکنیم. در این مورد، این دایرکتوری است که postgres دادههای این پایگاه داده را از آن میخواند.
-
بررسی سلامتی: در صورت نیاز، برخی از سرویس ها باید بررسی کنند که آیا وضعیت آنها عملکردی دارد یا خیر. به عنوان مثال، PostgreSQL رفتاری دارد که در هنگام راهاندازی چند نمونه را خاموش و روشن میکند، قبل از اینکه در نهایت کاربردی باشد. به همین دلیل، Healthcheck به Docker Compose اجازه میدهد تا سایر سرویسها بدانند که چه زمانی کاملاً کاربردی است. چند ویژگی زیر سلامت چک موارد زیر را انجام می دهند:
- تست: دستورات خاصی را برای سرویس برای اجرای چک ها اجرا می کند
- فاصله: مدت زمانی که docker compose قبل از اجرای دوباره چک منتظر می ماند
- تایم اوت: مدت زمانی که چک یکباره ادامه خواهد داشت، قبل از اینکه زمان آن بدون هیچ پاسخی تمام شود یا ناموفق باشد
- دوباره تلاش می کند: تعداد کل تلاشهایی که داکر انجام میدهد سعی میکند بررسی سلامت را برای پاسخ مثبت دریافت کند، در غیر این صورت شکست خورده و آن را به عنوان یک بررسی ناموفق اعلام میکند.
- دوره_شروع: مدت زمان انتظار قبل از شروع بررسی های سلامت را مشخص می کند
2. سرور
Dockerfile
FROM node:18
WORKDIR /server
COPY src/ /server/src
COPY prisma/ /server/prisma
COPY package.json /server
RUN npm install
RUN npx prisma generate
توضیح
از جانب – به داکر می گوید که چه تصویری برای ساخت کانتینر لازم است. برای این مثال، Node JS (نسخه 18) است.
WORKDIR – دایرکتوری کاری فعلی را برای دستورالعمل های بعدی در Dockerfile تنظیم می کند. را server
دایرکتوری برای این کانتینر در محیط داکر ایجاد خواهد شد
کپی 🀄 – با فاصله از هم جدا شده است، این دستور به Docker می گوید فایل ها/پوشه ها را کپی کند از محیط محلی به محیط داکر. کد بالا می گوید که تمام محتویات پوشه های src و prisma باید در پوشه کپی شوند. /server/src
& /srver/prisma
پوشه ها در Docker و package.json برای کپی شدن در server
ریشه دایرکتوری
اجرا کن – دستورات را در ترمینال اجرا می کند. دستورات موجود در کد بالا، ماژولهای گره لازم را نصب میکنند و همچنین یک کلاینت پریسما برای تعامل با پایگاه داده ایجاد میکنند (این مورد برای کاشت پایگاه داده در ابتدا مورد نیاز خواهد بود).
docker-compose.yml
server:
container_name: server
build:
context: ./server
dockerfile: Dockerfile
ports:
- "7999:8000"
command: bash -c "npx prisma migrate reset --force && npm start"
environment:
DATABASE_URL: "${DATABASE_URL}"
PORT: "${SERVER_PORT}"
depends_on:
postgres:
condition: service_healthy
توضیح
ساختن: زمینه ساخت کانتینر را تعریف می کند. این میتواند شامل مراحل ساخت کانتینر یا مسیری به Dockerfiles باشد که دستورالعملهای آن نوشته شده است. را متن نوشته کلید مسیر را هدایت می کند و dockerfile کلید حاوی نام Dockerfile است.
فرمان: دستورات را طبق دستوراتی که داده شده اجرا می کند. این دستور خاص برای این اجرا می شود که ابتدا به پایگاه داده مهاجرت کرده و آن را دانه بندی کند و سپس سرور را راه اندازی کند.
محیط: شامل جفت های کلید-مقدار برای محیط است که در فایل .env در دایرکتوری ریشه موجود است. DATABASE_URL
و PORT
هر دو حاوی مقادیر متناظر در فایل .env هستند.
بستگی دارد به: بررسی می کند که آیا کانتینر وابسته آماده، در حال اجرا و کارکرد است یا خیر. این ویژگیهای مختلفی دارد، اما در این مثال، بررسی میکند که آیا service_healthy
پرچم ظرف postgres ما بالا و کاربردی است یا خیر. را server
کانتینر فقط در صورتی شروع می شود که این پرچم با وجود بازگردانده شود true
از بررسی سلامت از PostgreSQL
3. مشتری
Dockerfile
FROM node:18
ARG VITE_SERVER_URL=http://127.0.0.1:7999
ENV VITE_SERVER_URL=$VITE_SERVER_URL
WORKDIR /client
COPY public/ /client/public
COPY src/ /client/src
COPY index.html /client/
COPY package.json /client/
COPY vite.config.js /client/
RUN npm install
RUN npm run build
توضیح
توجه داشته باشید: دستورات برای client
بسیار شبیه به آنچه در بالا توضیح داده شد برای server
ARG: متغیری را تعریف می کند که بعداً به آن ارسال می شود ENV دستورالعمل
ENV: یک جفت مقدار کلید را در زمینه محیط Docker برای اجرای کانتینر اختصاص می دهد. این اساساً شامل دامنه API است که بعداً از مشتری فعال می شود.
docker-compose.yml
client:
container_name: client
build:
context: ./client
dockerfile: Dockerfile
command: bash -c "npm run preview"
ports:
- "4172:4173"
depends_on:
- server
توضیح
توجه داشته باشید: دستورات برای client
بسیار شبیه به آنچه در بالا توضیح داده شد برای server
و postgres
این آموزش یک درک اساسی از استفاده از Docker Compose برای مدیریت یک برنامه فول استک ارائه می دهد. کد و فایل docker-compose.yml را برای جزئیات بیشتر کاوش کنید. کد منبع را می توانید در اینجا در Github پیدا کنید.