چجوری روی یک سرور، چند سرویس مختلف رو با استفاده از Nginx و Docker، مستقر کنیم؟

توی این مقاله باهم قراره یه کار جالب بکنیم. فرض کنید دامین abc.com رو دارید. حالا براش قراره یه سرویس API روی Sub Domain عه api.abc.com بیارید بالا و خود abc.com هم وبسایت ما باشه.

ما فرض می‌کنیم که یک پروژه Backend داریم برای API هامون و یکی هم Front و هر دو Dockerize شدن. اگه Dockerize کردن پروژه رو کار نکردید حتما این مقاله رو مشاهده کنید.

خب اولین کارمون اینه که یه Sub Domain تعریف کنیم توی پنلی که ازش دامین رو خریدیم. من چون توی Cloudflare دامنه هامو تعریف کردم یه عکس میزارم که ببینید چجوری Sub Domain تعریف می‌کنیم.

نحوه تعریف Sub Domain در سایت Cloudflare
نحوه تعریف Sub Domain در سایت Cloudflare

همونطور که توی عکس بالا می‌بینید سه تا رکورد A داریم که هر سه اشاره به IP سرور شما داره. یعنی بعد از تعریف api وقتی شما بزنی api.abc.com تا پشت سرور شما میاد. حالا باید هدایتش کنیم به پروژه Backend مون.

فرض کنید پروژه Backend تون رو با دستور زیر آوردید بالا:

docker run --name Backend -p 5000:5000 -d Backend

قبلا شما به این شکل به سرویس api تون دسترسی ‌داشتید:‌ https://YOUR_SERVER_IP:5000


حالا میخوام یه Image عه داکر بهتون معرفی کنم که کارمون رو خیلی راحت میکنه.

https://hub.docker.com/r/jwilder/nginx-proxy

به لطف این Image هدایت کردن دامین‌های مختلف به سرویس‌های مختلفمون خیلی راحت میشه. اولین کار اینه که خود این Image رو روی یه Container بالا بیاریم با استفاده از دستور زیر:

docker run --name mynginx-proxy -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro -d jwilder/nginx-proxy

فقط حواستون باشه نباید روی پورت ۸۰ سرویسی داشته باشید چون قراره مدیریت درخواست‌های پورت ۸۰ سرورمون رو به عهده این Container بزاریم.

بعد از این کار میریم سراغ سرویس‌های خودمون. مثالی که بالا زدم برای اجرا کردن سرویس Backend تون به شکل زیر تغییر می‌کنه:

docker run --name Backend -p 5000:5000 -e VIRTUAL_HOST=api.abc.com -e VIRTUAL_PORT=5000 -d Backend

دو تا Environment ای که موقع Run کردن Container اضافه می‌کنیم برای اینه که به Container عه mynginx-proxy ای که چند لحظه پیش اجرا کردیم بگیم که اگر درخواستی به دامنه api.abc.com اومد هدایتش کن به این Container

اگه بخوام مثال پروژه Front رو بزنم هم اینجوری میشه:

docker run --name Frontend -e VIRTUAL_HOST=abc.com -d Frontend

اینجا دیگه VIRTUAL_PORT رو ست نمی‌کنیم چون به صورت پیش‌فرض پروژه ما روی پورت ۸۰ داره اجرا میشه.


حالا بیای مثال Docker compose رو هم باهم ببینیم که بحث رو تکمیل کرده باشیم.

version: '3'

service:
  Backend:
    container_name: Backend
    image: Backend
    ports:
      - '5000:5000'
    environment:
      - VIRTUAL_PORT=5000
      - VIRTUAL_HOST=api.abc.com

  Frontend:
    container_name: Frontend
    image: Frontend
    environment:
      - VIRTUAL_HOST=abc.com

پس اگه چندین دامنه با چندین Sub Domain داشته باشید به راحتی می‌تونید هر کدوم رو هدایت کنید به سمت Container های خودش.


خیلی خوشحالم که تا انتهای این مقاله منو همراهی کردید. امیدوارم براتون مفید بوده باشه. خیلی خوشحال میشم اگه نظری یا انتقادی داشتید باهام درمیون بزارید. برقرار باشید