راه اندازی دیتابیس MySQL با Docker Compose

راه اندازی دیتابیس MySQL با Docker Compose

در قسمت قبل توانستیم سرویس nginx را با docker-compose راه اندازی کنیم. اکنون می خواهیم دیتابیس MySQL را به سرویس های برنامه اضافه کنیم. 

ابتدا با ctrl + c کانتینر فعلی را متوقف می کنیم و سپس برچسب mysql را زیر برچسب services اضافه می کنیم.

به جای ایجاد یک docker file اختصاصی، از یک image آماده استفاده کنیم. اگر می خواهیم از برنامه ای مثل table plus برای نمایش داده ها استفاده کنیم باید پورت 3306 این image را    expose (آشکار) کنیم.

همچنین از برچسب environment هم استفاده می کنیم تا نام دیتابیس و... را پیکربندی کنیم.

version: '3.8'

services:
  nginx:
   build:
     context: .
     dockerfile: nginx.dockerfile
   ports:
      - 80:80
   volumes:
      - ./src:/var/www/html
  mysql:
   image: mysql:5.7
   ports:
      - 3306:3306
    environment:
     MYSQL_DATABASE: sokanacademy
     MYSQL_USER: sokanacademy
     MYSQL_PASSWORD: secret
     MYSQL_ROOT_PASSWORD: secret

ممکن است فکر کنید برای این سرویس نیاز نیست از volume استفاده کنیم. زیرا فایلی از سیستم ما داخل کانتینر استفاده نمی شود. اما همانطور که گفته شد، volume ها دو طرفه کار می کنند و تغییرات از کانتینر به سیستم ما هم اعمال می شود. در این مورد اگر ما volume ای تعریف نکنیم بعد از غیر فعال شدن کانتینر، داده های دیتابیس پاک می شوند. به همین دلیل volume ای تعریف می کنیم تا فایل های مورد نیاز روی سیستم ما ذخیره شوند و هنگامی که کانتینر غیر فعال می شود داده ها از دست نروند. همچنین بعد از فعال شدن دوباره کانتینر، داده ها در دسترس ما خواهند بود.

version: '3.8'

services:
  nginx:
   build:
      context: .
     dockerfile: nginx.dockerfile
   ports:
      - 80:80
   volumes:
      - ./src:/var/www/html
  mysql:
   image: mysql:5.7
   ports:
      - 3306:3306
    environment:
     MYSQL_DATABASE: sokanacademy
     MYSQL_USER: sokanacademy
     MYSQL_PASSWORD: secret
     MYSQL_ROOT_PASSWORD: secret
   volumes:
      - ./mysql:/var/lib/mysql

   پوشه mysql که در volume به آن اشاره شد را می سازیم.

همانطور که قبل تر دیدیم با دستور docker compose up می توانیم این کانتینر ها را فعال کنیم.

خروجی کانتینر های mysql و nginx در کنسول قابل مشاهده هستند.

اگر دستور docker ps را اجرا کنیم وضعیت این دو کانتینر دیده می شود.

همچنین می توانیم دستور docker compose ps را اجرا کنیم تا کانتینر هایی که توسط فایل docker-compose فعال شدند را با فرمت دیگری ببینیم.

در این لیست وضعیت هر کانتینر و پورت های expose شده را می توان مشاهده کرد.

گاهی اوقات شما نمی خواهید همه کانتینر ها را یکجا فعال کنید. برای نمونه نیاز دارید که تنها یک سرویس خاص فعال شود. برای این کار کافی است نام سرویس را هم موقع اجرای دستور docker compose بنویسید.

docker compose up nginx

بعضی از کانتینر ها ممکن است به سرویس های دیگر وابسته باشند. یعنی نیاز است آن ها قبل از اجرای سرویس فعال باشند. برای نمونه در برنامه ما، دیتابیس قبل از وب سرور باید فعال شده باشد.

مشخص کردن این وابستگی ها کار ساده ای است. در فایل docker compose برای سرویس nginx برچسب depends_on را اضافه می کنیم.

برای این برچسب باید لیستی از سرویس هایی که نیاز است تا قبل از اجرای این سرویس فعال باشند را بنویسیم.

version: '3.8'

services:
  nginx:
   build:
     context: .
     dockerfile: nginx.dockerfile
   ports:
      - 80:80
   volumes:
      - ./src:/var/www/html
   depends_on:
      - mysql
  mysql:
   image: mysql:5.7
   ports:
      - 3306:3306
   environment:
     MYSQL_DATABASE: sokanacademy
     MYSQL_USER: sokanacademy
     MYSQL_PASSWORD: secret
     MYSQL_ROOT_PASSWORD: secret
   volumes:
      - ./mysql:/var/lib/mysql

اکنون دوباره دستور nginx  docker compose up را اجرا می کنیم و می بینیم که خروجی nginx در کنسول چاپ می شود. اما اگر دستور docker compose ps را اجرا کنیم متوجه می شویم که سرویس MySQL هم در پس زمینه فعال شده است.

دوره در حال تکمیل است ... rocket