در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حلهای قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرمافزار اتفاق می افتند.
طرح های از پیش ساخته شدهای که میتوانید برای حل مشکلات آنها را سفارشی کنید. شما نمیتوانید یک الگو را با جستجو در stackoverflow پیدا و در برنامه خود کپی کنید. الگو ها یک قطعه کد خاص نیستند، مفاهیم کلی برای حل مشکلات خاص هستند. شما باید با درک این مفاهیم آنها را در برنامه خود پیادهسازی کنید.
فقط یه نکته ی کوچیک برای این مورد وجود داره و سایر کارهایی که انجام میدیم با مطالعه مطالب قبلی که در مورد docker نوشتم قابل انجام هست.
اول وارد docker hub میشیم و elasticsearch رو جستجو میکنیم. مخزن اصلی elasticsearch به این آدرس هست و داخلش توضیحات کاملی نوشته شده.
elasticsearch رو دریافت میکنیم:
docker pull elasticsearch
همونطور که توضیح داده elasticsearch به طور پیشفرض هم برای http و هم برای transport از localhost استفاده میکنه و همچنین http.host اون روی 0.0.0.0 تنظیم شده.
نکته مهم اینجاست، زمانی که شما docker رو نصب میکنید خودش سه تا network connection میسازه. برای اینکه لیستشون رو ببینید از دستور زیر استفاده کنید:
$ docker network lsNETWORK ID NAME DRIVER7fca4eb8c647 bridge bridge9f904ee27bf5 none nullcf03ee007fb4 host host
به طور پیشفرض از docker0 استفاده میشه که از نوع bridge هستش:
$ ifconfigdocker0 Link encap:Ethernet HWaddr 02:42:47:bc:3a:eb inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:17 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1100 (1.1 KB) TX bytes:648 (648.0 B)
فکر میکنم تا الان دیگه متوجه نکته شده باشید
ادامه...در قسمت قبلی، image خودمون رو ساختیم که البته هنوز داخل لوکال هست و حالا بهتره به hub انتقالش بدیم و بیشتر با دستورات docker آشنا بشیم.
از docker images استفاده میکنیم تا ببینیم در حال حاظر چه image هایی رو داریم:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-whale latest 7d9495d03763 38 minutes ago 273.7 MB <none> <none> 5dac217f722c 45 minutes ago 273.7 MB docker/whalesay latest fb434121fc77 4 hours ago 247 MB hello-world latest 91c95931e552 5 weeks ago 910 B
IMAGE ID اون docker-whale که ساختیم رو ببینید و توجه کنید REPOSITORY در حال حاضر نامش رو بدون namespace نشون میده. اگر قراره image رو به hub ببریم به namespace احتیاج داریم. در واقع namespace همون نام اکانت شما داخل docker hub هست. چیزی شبیه به YOUR_DOCKERHUB_NAME/docker-whale.
برای این کار و برچست زدن به یک image از docker tag استفاده میکنیم:
docker tag 7d9495d03763 <YOUR_DOCKERHUB_NAME>/docker-whale:latest
اگر دوباره خروجی docker images رو ببینید متوجه میشید که image ما برچسب خورده. البته دقت کنید YOUR_DOCKERHUB_NAME باید همون نام حساب کاربری شما داخل hub باشه.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE maryatdocker/docker-whale latest 7d9495d03763 5 minutes ago 273.7 MB docker-whale latest 7d9495d03763 2 hours ago 273.7 MB <none> <none> 5dac217f722c 5 hours ago 273.7 MB docker/whalesay latest fb434121fc77 5 hours ago 247 MB hello-world latest 91c95931e552 5 weeks ago 910 B
ادامه...
قراره image خودمون رو داخل docker بسازیم، به عنوان نمونه تصمیم دارم whalesay رو که قبلا باهاش کار کردیم بهبود بدم و جای اینکه هنگام run شدن متنی رو برای اون بفرستیم، یک جمله تصادفی انتخاب و به اصطلاح say کنه.
در مرحله ی اول نیاز به Dockerfile داریم. Dockerfile، یک فایل متنی هست و شامل دستوراتی میشه که کاربر میتونه داخل command line ازش استفاده کنه. از این فایل برای بالا آوردن image خودمون استفاده میکنیم.
یک directory میسازیم و واردش میشیم:
mkdir mydockerbuildcd mydockerbuild
Dockerfile رو ایجاد میکنیم، خیلی ساده:
nano Dockerfile
حالا داخلش شروع به نوشتن میکنیم، اول باید FROM اضافه بشه
FROM docker/whalesay:latest
این دستور به داکر میگه image ما به عنوان پایه/base از کدوم image استفاده میکنه. باز هم تکرار میشه، داکر ابتدا بررسی میکنه آیا image مورد نظر ما (whalesay)، اونم اخرین نسخه اش! رو در لوکال خودمون داره یا نه، و اگر نداشت ابتدا اون رو از hub دانلود میکنه و بعدش میره سراغ باقی مسائل.
ادامه...پس از نصب داکر در مطلب قبلی ما دستور docker run hello-world رو اجرا کردیم. این دستور به سه بخش تقسیم میشه:
- docker: یک دستور سیستمی که امکان استفاده از برنامه docker رو فراهم میکنه.
- run: یک زیر دستور/subcommand برای ایجاد و اجرای container.
- hello-world: میگه کدوم image داخل container قرار بگیره(load شود).
در زمانی که شما این دستورُ اجرا میکنید Docker Engine:
- بررسی میکنه آیا image با عنوان hello-world رو داره یا نه.
- اگر نداشت اون رو از Docker Hub دریافت میکنه.
- image رو load و در container اجرا میکنه.
اگر از دید برنامه نویسی نگاه کنیم، image یک class و container نمونه ای از اون کلاس هست.
container شامل یک image، محیط اجرایی و مجموعه ای از دستورالعمل هاست. مفهوم container از کانتینر هایی که به منظور حمل کالا استفاده میشن گرفته شده که یک روش استاندارد برای حمل محصولات گاها به وسیله ی کشتی در سطح جهانی است.