majid
majid
خواندن ۵ دقیقه·۲ سال پیش

How to Dockerize a Simple MySQL DB؟


در این مقاله، من دستورالعمل های اجرایی در مورد نحوه ایجاد یک کانتینر Docker، تغییر وضعیت داخلی آن و سپس ذخیره کانتینر به عنوان یک Image را با جزییات نسبتا کامل میگم.

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

Pull the MySQL Docker Image

خوشبختانه MySQL یک Docker image داره که در Docker Hub موجود است.میتونید هر نسخه ای که در سایت هستش رو روی لوکال خودتون دانلود کنید.

sudo docker pull mysql:tag

کلمه tag ورژن mysql رو مشخص میکنه. بهتره که tag رو برابر latest بذارید تا آخرین نسخه mysql اجرا بشه.

Command: docker images [options]

با دستور بالا میتونید imageهایی که از داکرهاب دانلود کردید رو ببینید.

اگر MySQL Image روی لوکال شما دانلود شده باشه، خروجی درست باید شبیه به این تصویر باشه
اگر MySQL Image روی لوکال شما دانلود شده باشه، خروجی درست باید شبیه به این تصویر باشه


Create a Docker Volume

کانتینرهای داکر به طور پیش‌فرض اطلاعات را حفظ نمی‌کنند. آنها پردازش‌ها را انجام می‌دن و وقتی کانتیر متوقف میشه یا حذفش میکنیم، تمام اطلاعاتی که روی هارد نوشته شده بود از بین می‌ره.

از Docker Volumes برای حفظ داده‌ها استفاده خواهیم کرد. برای خوندن توضیحات بیشتر به اینجا برید.

sudo docker volume create [name]

با استفاده از دستور زیر مثل عکس بالا میتونید volumeهای لوکال خودتون رو ببینید.

sudo docker volume ls

Create a Docker MySQL Container

قبل از هرچیزی برای جلوگیری از هرگونه وقت تلف شدن و یا گرفتن خطا بررسی میکنیم پورتی که میخواهیم رابط کانتیر و host (اینجا لوکال هاست) باشه خالی هستش یا اشغال شده. برای اینکار از دستور زیر استفاده کنید و اگر خروجی چیزی دریافت نکردید یعنی پورت خالی هستش. اگر خالی نبود یک پورت دیگه امتحان کنید.

sudo lsof -i :[portt number]

الان یک MySQL Docker image بر روی لوکال داریم و یک Docker Volume برای ذخیره اطلاعات،پس می‌تونیم کانتینر را ایجاد کنیم.

ایجاد کانتیر با استفاده از دستور زیر هستش. این دستور optionهای زیادی داره که باتوجه به کانتیری که میخواهیم و ابزاری که قصد داریم داکرایزش کنیم باید optionهای مناسب رو انتخاب کنیم.

sudo docker create [options] image [command] [args ...]

اما دستوری که ما برای داکرایز کردن MySQL استفاده میکنیم دستور زیر هستش:

docker create --name mysql-db -v mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 mysql

توضیحات دستور بالا خیلی مهمه:

  • --name:

نام کانتینر رو مشخص میکنیم. در این مثال من نام کانتینر رو mysql-db گذاشتم.

  • -e: (Set environment variables)

برای تعریف کردن متتغیرها هستش. چون ما داریم از mysql یک کانتیر می سازیم پس باید متغیرهای لازم mysql رو حتما مشخص کنیم. برای mysql اولین و اصلی ترین متغیر لازم MYSQL_ROOT_PASSWORD هستش که من اینجا برابر your_password گذاشتم. ( اگر مایل بودید میتونید متغیرهای دیگری هم اینجا تعریف کنید)

  • -v: (Bind mount a volume)

تعریف آدرس یک فایل سیستم. در اینجا میخواهیم Docker Volume و آدرسش روی هارد رو به کانتیر بدیم. بطور پیش فرض MySQL اطلاعاتش رو در لینوکس روی آدرس var/lib/mysql/ ذخیره میکنه، به همین دلیل روی لینوکس آدرس Docker Volume رو var/lib/mysql/ قرار میدن.

  • -p: (Publish a container's port(s) to the host)

پورت کانتیر برای ارتباط با host مشخص میشه. من از پورت ۳۳۰۶ استفاده کردم.

  • mysql: (Image)

نام image ای که قصد داریم یک کانتیر با استفاده از اون ایجاد کنیم. توجه کنید اولین مرحله این بود که mysql image رو ازdocker hub دانلود کنیم.

راه دیگری که برای ساخت کانتیر وجود داره استفاده از دستور docker run [options] image [args ...] هستش که خیلی شبیه به دستوری هست که من استفاده کردم. اما من ترجیح دادم که از دستور docker create استفاده کنم. چون دستور docker run اول یک کانتیر ایجاد میکنه و بعد اونو اجرا میکنه. پس اگر ما بخواهیم که کانتیری که قبلا ایجاد کردیم رو اجرا کنیم، نمیتونیم از این دستور استفاده کنیم. پس بهتره از اول دستورات رو کامل و منطقی انجام بدیم.

ساخت یک کانتیر و مشاهده کانتیرهای موجود روی لوکال
ساخت یک کانتیر و مشاهده کانتیرهای موجود روی لوکال


با استفاده از دستور زیر‌ (در اسکرین شات بالا مشخص هستش) میتونید کانتیرهایی ساخته شدن رو ببینید.

sudo docker container ls -a

دقت کنید که PORTS کانتیرها مشخص نشده. به محض اجرای یک کانتیر پورتهایی که در دستور تعریف کانتیر مشخص کردیم به کانتیر تعلق می‌گیره. البته به شرطی که اون پورت توسط پروسس دیگری قبل از اجرای کانتیر اشغال نشده باشه. میتونید با استفاده از دستور sudo lsof -i :port number بررسی کنید که پورت آزاد هستش یا توسط چه پروسسی اشغال شده.

docker start [container's name]

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

خروجی درست پس از اجرای کامل کانتینر
خروجی درست پس از اجرای کامل کانتینر

اول با استفاده از دستور sudo lsof -i :3306 بررسی کردم که پورت خالی هست یا نه. که چون خالی بود خروجی خالی شد. (البته بهتره این مرحله رو قبل از ساخت کانتیر انجام بدیم) و بعدش دستور docker start mysql-db رو اجرا کردم تا کانتیری که ساختم اجرا بشه. اگر همه چیز درست باشه باید خروجی تون مشابه خروجی من باشه. در نهایت هم نشون دادم که پورت 3306 توسط داکر اشغال شده.

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

sudo docker ps


Connecting to the MySQL Container

تا اینجا یک کانتیر ساختیم با استفاده از mysql Image که از Docker Hub دانلود کرده بودیم. حالا میتونیم وارد محیط mysql در داکر بشیم.

با استفاده از دستور زیر وارد محیط mysql کانتیر میشیم بدون اینکه نیاز به نصب mysql client داشته باشیم.

sudo docker exec -it mysql-db mysql -u root -p
ورود به محیط mysql
ورود به محیط mysql

اگر خروجی مشابه بالا داشته باشید یعنی به خوبی یک کانتیر mysql برای خودتون ایجاد کردید و حالا میتونید از اون استفاده کنید.

برای اینکار روش های دیگری هم هستش. یک روش استفاده از mysql client است. برای اینکار باید mysql client رو روی لوکال نصب کنید و البته کانفیگ های مناسب برای اتصال بصورت remote هم انجام بدید. در نهایت با استفاده از دستور mysql -u root -h 127.0.0.1 -p به کانتینرتون متصل بشد. توجه کنید که ۱۲۷.۰.۰.۱ درواقع ip لوکال هاست هستش. روش دیگر هم استفاده از یک GUI-based client مثل MySQL Workbench هستش.











dockerportlinuxdatabasemysql
شاید از این پست‌ها خوشتان بیاید