DevOpsDockerمقالات

چگونه Nginx ،Laravel و MySQL را با استفاده از Docker Compose در Ubuntu راه اندازی کنم؟

0
مقدمه

طی چند سال گذشته ، Docker به لطف سادگی در مفاهیم و اجرای برنامه های کاربردی در قالب Container ها  ، به یک راه حل متداول برای استقرار برنامه های ما تبدیل شده، که انصافا هم خوب چیزیه .  ، هنگام استفاده از یک پشته برنامه LEMP  با PHP ، Nginx  MySQL و فریمورک Laravel ، داکر می تونه روند راه اندازی این پروسه را بطور قابل توجهی ساده کند.

Docker Compose این اجازه را به شما میدهد تا زیرساخت های پروژه خود از جمله application services ، networks و volumes (نگران نباشید با این مفاهیم آشنا خواهید شد) را در یک فایل پیاده سازی کنید و فرایند توسعه برنامه خودتون را ساده تر کنید. Docker Compose یک گزینه جایگزین و کارآمد برای ایجاد چندین Container و اجرای دستورات در اونها میتونه باشه.

post image

در این آموزش شما یاد میگیرید چطور Laravel رو با استفاده از Nginx به عنوان وب سرور و MySQL به عنوان بانک اطلاعاتی ، بوسیله ی Container های Docker بالا بیارید.

بهترین راه به دست آوردن اعتماد به نفس،انجام کارهایی است که از آن ها می ترسیم.

امیر کفتری

پیش نیازها
قدم اول : دانلود و ایجاد پروژه Laravel

به عنوان اولین مرحله ، ما آخرین نسخه Laravel را دریافت می کنیم و dependency های مربوط به پروژه رو با استفاده از Composer نصب میکنیم. فقط با این تفاوت که این بار میخایم Composer رو با Docker نصب کنیم. مزیت اینکار اینجاست که از تصب کردن Composer در هر بار صدا زدن Image پروژه جلوگیری میکنه.

اول چک میکنم که توی دایرکتوری home باشم (البته شما هر مسیری که دوست داشتید انتخاب کنید اما من این آموزش رو توی مسیر home ادامه میدم. “عمه هم دارم” ). آخرین ورژن لارول رو هم clone میکنم داخل پوشه ای که اسمش رو میزارم laravel-app.

cd ~

git clone https://github.com/laravel/laravel.git laravel-app

وارد پوشه ی laravel-app میشم :

cd ~/laravel-app

در ادامه با استفاده از داکر ، Image مربوط به Composer رو برای ساختن بخش های مورد نیاز پروژه لاراول نصب میکنیم.

docker run –rm -v $(pwd):/app composer install

در دستور بالا flag های -v و –rm وقتی همراه با docker run بیان ، باعث ساختن یک Container مقطعی میشن ، که این Container قبل از اینکه حذف بشه ، اصطلاحا به مسیر اصلی پروژه ی شما یعنی laravel-app اتصال پیدا میکنه. با اینکار محتوای پوشه ی laravel-app در Container کپی میشه و همچنین به صورت موازی پوشه ی vendor مربوط به composer در مسیر اصلی پروژه ی شما یعنی داخل پوشه ی laravel-app کپی خواهد شد.

این ترفند باعث میشه که شما فولدر vendor با اون حجم از بند و بساطی که داره رو مستقیم کنار پروژه نداشته باشید که برای انتقال روی سرورتون هر دفعه بخاین اون رو بسازید.

در آخر هم مسیر پروژتون رو به User غیر از root دسترسی میدید که بره حالش رو ببره :

sudo chown -R $USER:$USER ~/laravel-app

البته دسترسی بالا وقتی که شما  Dockerfile پروژه رو می سازید خیلی اهمیت پیدا میکنه چون این امکان رو به شما میده که بتونید بدون استفاده از کاربر root کد درون container رو process کنید.

قدم دوم : ساختن فایل Docker Compose

استفاده از Docker Compose برای ساخت وب سایت، باعت میشه پروسه ی تنظیم و نسخه سازی زیرساخت هاتون ساده بشه. در این قسمت برای راه اندازی وب سایت لاراولیمون ، یک فایل Docker Compose رو برای وب سرور، دیتابیس و سرویس های وب سات می نویسیم.

فایل docker-compose.yml رو ایجاد و بازش میکنیم :

nano ~/laravel-app/docker-compose.yml

در فایل docker-compose ما سه سرویس app ، webserver و db داریم.

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "۸۰:۸۰"
      - "۴۴۳:۴۴۳"
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "۳۳۰۶:۳۳۰۶"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

نکته : اگه کدهای بالا رو به شکل راستچین می بینید ،بعد از اینکه وارد باکس کدها میشید آیکنی به شکل ظاهر میشه، لطفا روی اون کلیک کنید تا باکس کدها به صورت چپ چین در پنجره ای جدید براتون باز شه.

سرویس هایی که در فایل docker-compose.yml پیاده سازی کردیم به شرح زیر هستند :

app : این سرویس شامل لاراول و یک docker image برای php هست که در قدم چهارم تعریفش میکنیم. همجنین داخل این سرویس working_dir داخل container رو به /var/www ست میکنه.

webserver : توی این سرویس یک docker image مربوط به nginx تعریف میشه و همچنین پورت های ۸۰ و ۴۴۳ اصطلاحا expose میشن، یعنی در دسترس شما قرار میگیرن.

db : دقیقا مثل دوتا سرویس قبلی یک docker image مربوط به mysql ، تعریف کردیم. چند تا environmental variables داریم که مثلا اطلاعات دیتابیسمون رو از ما میگیرن و همچنین پورت ۳۳۰۶ مربوط به هاستمون رو اصطلاحا map کردیم به پورت ۳۳۰۶ داخل container.

داخل هر کدوم از سرویس های بالا یک مشخصه container_name  داریم که با استفاده از اون ها برای کانتینرمون یک اسم تعریف میکنیم. اگه این اسم رو شما تعریف نکنید و خالی بگذارید خود docker با استفاده از اسامی افراد مشهور یک اسم رو برای container شما میزاره (مثلا ممکنه بزاره امیر کفتری :D).

برای اینکه ارتباط بین container ها راحت اتفاق بیفته ، سرویس ها به یه bridge network متصل میشن که ما اسمش  رو گذاشتیم app-network.

یک شبکه bridge از یک پل نرم افزاری استفاده میکنه، که باعث میشه container هایی که فقط توی همون نتورک وجود دارن بتونن با همدیگه ارتباط برقرار کنن. یعنی درایور bridge قوانینی رو روی شبکه در نظر میگیره که container هایی که در شبکه های مختلف وجود دارن، نتونن مستقیما با هم ارتباط داشته باشن. این باعث می شه سطح امنیتی بیشتری برای برنامه ها ایجاد بشه و اطمینان حاصل میشه که فقط خدمات مرتبط می تونن با هم ارتباط برقرار کنن.

قشنگی کار اینجاست که شما میتونید برای بخش های مختلف برنامه تون نتورک های مرتبط داشته باشید. مثلا یک نتورک برای بخش frontend  و یک نتورک برای بخش backend بسازید، که به راحتی این ها میتونن با همدیگه در ارتباط باشن.

قدم سوم : Persisting Data

 

 

چگونه با استفاده از FFmpeg یک فایل صوتی جدید رو به ویدئو اضافه کنم؟

مقاله قبلی

شما همچنین ممکن است دوست داشته باشید

نظرات

پاسخ دهید

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