برنامه نویسی

Docker Compose برای یک برنامه Full-Stack با React، Node.js و PostgreSQL

مقدمه

بنابراین شما یک برنامه Full Stack ساخته اید که آنطور که می خواهید کار می کند و می خواهید آن را به نمایش بگذارید. با این حال، وابستگی‌ها و محیط‌ها باعث می‌شوند که فقط روی دستگاه شما اجرا شود. خوب، همانطور که قبلاً ممکن است بدانید که Docker Compose می تواند از آن مراقبت کند. بیایید شروع کنیم به اینکه چگونه می توان این کار را بدون بحث بیشتر انجام داد. این آموزش برای کسانی است که ایده ای در مورد ایجاد برنامه ها و سرورها دارند و همچنین دانش اولیه Docker را دارند.

TL; DR

کد منبع را می توانید در اینجا در Github پیدا کنید. برای راه اندازی این پروژه، مراحل زیر را دنبال کنید

  1. مطمئن شوید که Docker را در سیستم خود نصب کرده اید. برای مراحل نصب، مراحل زیر را دنبال کنید:
    1. برای مک
    2. برای اوبونتو
    3. برای پنجره ها
  2. مخزن را در دستگاه خود کلون کنید
  3. یک ترمینال را از دایرکتوری پروژه کلون شده باز کنید (در جایی که docker-compose.yml فایل موجود است)
  4. دستور را اجرا کنید: 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 پیدا کنید.

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

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

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

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