خانه / برنامه نویسی / مفهوم داکر و کانتینر(بخش دوم)

مفهوم داکر و کانتینر(بخش دوم)

درک معماری داکر خیلی اهمیت دارد تا بتوانید درک بهتری از داکر داشته باشید در ادامه کمی در مورد داکر صحبت میکنیم

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

Docker به دو قسمت تقسیم می شود – یکی داکر کلاینت است و بخش دوم داکر دیمن است

زمانی که شما داکر را در سیستم یا ماشین خود نصب کردید و درخواست image میکنید چه اتفاقی می افتد دستوری که شما در ترمینال یا docker cli خود وارد میکنید دستور مربوطه ارسال می شود به docker daemon و بعد از اینکه دستور به docker daemon داده شد. اگر درخواست image کرده باشید سرویس docker daemon اطلاعات را ارسال میکند به ریپازیتوری رسمی داکر به اسم docker hub و اگر شما برای مجموعه خود ریپازیتوری تعریف کرده باشید و یا از ریپازیتوری بقیه شرکتها استفاده کرده باشید ارسال می کند. اگه توجه داشته باشید کامند شما با پروتکل http ارسال می شود به docker daemon 

داکر دیمین چگونه کار میکند :

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

پیش فرض سرویس دیمن این است که فقط از شبکه داخلی یا سروری که روی آن داکر نصب است قابل دسترسی است و به شما امکان دسترسی خارجی نمیدهد ولی شما میتوانید با استفاده از tcp و مشخص کردن پورت بتوانید از بیرون دسترسی پیدا کنید که دوستان بتوانند دسترسی داشته باشند 

هشدار :

اگرچه این می تواند یک روش قدرتمند و مفید باشد ، اما آن را ناامن تلقی می کند. سوکت داکر را می توان برای هر کس که دارای دسترسی باشد؛ که این مساله خیلی ناامن می کند اپلیکیشن هایی که در بستر داکر است

مساله :

شما می خواهید سرور Docker خود را برای دسترسی دیگران باز کنید. راهکارهایی پیشنهاد می شود اما پیشنهاد نمی شود

راه حل :

پیشنهاد میشود از tcp استفاده شود برای دسترسی به بیرون

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

در مرحله اول باید سرویس داکر را stop  کنید

بعد از اینکه سرویسها را stop کردید نباید سرویس در حال اجرا باشد برای اینکه اطمینان حاصل کنید پروسس از داکر باقی نمانده باشد باید دستور زیر را وارد کنید توجه داشته باشید نباید خروجی مشاهده کنید در غیر این صورت سرویس داکر به طور کامل کشته نشده است

بعد از اینکه این مراحل را با موفقیت طی کردید باید از دستور زیر استفاده کنید تا دسترس به بیرون را به سرویس داکر بدهید

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

هشدار :

زمانی که شما ای پی ۰٫۰٫۰٫۰ را مشخص کردید در واقع هم از شبکه داخلی و هم خارجی(اینترنت) قابل دیدن است و طبق توضیحات؛ این مساله باعث نا امن کردن می شود. 

خوب می رویم سراغ اینکه کانتینر را چگونه در پس زمینه اجرا کنیم

یکی از پر اهمیت ترین بخش داکر جدا کردن هر کانتینر از یک دیگر بدون هیچ گونه تداختی و مدیریت بهتر اپلیکیشنه

مساله : چگونه کانتینر را در پس زمینه اجرا کنیم

راه حل :

از پارامتر  d- استفاده کنید زمانی که در حال ساخت کانتینر هستید

آرگومان -d ، هنگامی که از docker run استفاده می شود ، کانتینر را به عنوان یک Daemon اجرا می کند. آرگومان -i به این کانتینر امکان وصل شدن با  Telnet را به شما را می دهد. با -p شما پورت را مشخص میکنید. آرگومان –name به شما امکان می دهد تا یک نام را به کانتینر بدهید تا بعداً به آن مراجعه کنید. سرانجام ، در انتها دستور nc را در کانتینر که ساخته شد می زند که الزامی وجود ندارد شما دستور انتهایی را وارد کنید این مثال به شما میگوید که شما بعد از ساخت کانتینر امکان کامند زدن را هم دارید.

می بینید که اجرای یک کانتینر به عنوان یک Daemon به اندازه کافی ساده است ، اما از نظر عملی برخی از سوالات باید پاسخ داده شود:

در صورت عدم موفقیت چه اتفاقی برای سرویس می افتد؟

هنگامی که خاتمه داده می شود کانتینر چه اتفاقی می افتد؟

چه اتفاقی می افتد اگر سرویس بیش از حد از کار بیفتد؟

خوشبختانه داکر برای هر یک از این سؤالات آرگومانهای را فراهم می کند!

زمانی که از سیاست no استفاده میکنیم زمانی که کانتینر خارج می شود یا به خطایی میخورد شما نمی توانید دوباره بسازید و این سیاست پیش فرض داکر است

اگر نامی برای ایجاد کانتینر مشخص نکنید به طور تصادفی نامی مشخص می شود برای همین مساله سعی کنید نامی برای کانتینر زمانی که ایجاد کردید در نظر بگیرید تا مدیریت بهتری در کانتینرها داشته باشید زمانی که لیست کانتینرها را مشاهده میکنید

پارامتر status به ما می گوید که کانتینر در چه وضعیتی قرار دارد و اینکه آیا کانتینر فعال است یا خیر 

زمانی که کانتینر ساخته می شود ای دی برای آن کانتینر در نظر گرفته می شود که داکر برای کار با آن کانتینر از آن ID استفاده میکند و شما با ریست کردن کانتینر نمی توانید این id را تغییر دهید 

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

اگر دستور قبلی را اجرا کرده و یک دقیقه صبر کنید و سپس docker ps -a را اجرا کنید ، خروجی مشابه این را مشاهده خواهید کرد:

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

انتقال داکر به یک پارتیشن متفاوت

سوالی که مطرح می شود این است که چگونه داکر را به پارتیشن دیگری انتقال دهیم به دلیل اینکه  به مرور ممکن است فضا زیادی مورد نیاز باشد برای image ها , container ها

مساله:

چگونه منتقل کنیم به فضای دیگری داکر را

راه حل :

در مرحله اول سرویس را stop می کنید و با آرگومان -g مسیر را تغییر میدهید

صحبتی شد در خصوص اینکه چگونه فضا اختصاص دهیم به سرویس داکر این روش شاید برای شما سوال به وجود آمده است که به چه دردی میخورد فرض کنید یک سرور دارید و مالکیتهای مختلفی دارد برای اینکه برای اشخاص مختلف دسترسی های مختلفی دهید و اینکه هر شخص به چه کانتینرهایی دسترسی داشته باشند تا مطمئن شویم، به طور تصادفی به فرد اشتباهی اطلاعات خصوصی را ندهیم

استفاده از socket برای نظارت بر ترافیک API Docker:

نکته پر اهمیتی که وجود دارد این است که دستورات ممکن است در هر نسخه تغییر کند به دلیل اینکه api هر نسخه ای از سرویس داکر تغییر میکند ممکن است این تغییرات برای شما چالش به وجود بیاورد

مساله :

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

راه حل :

برای رفع مشکل یا دیباگ سرویس داکر،باید یک سوکت یونیکس پراکسی بین درخواستهای خود و سوکت سرور برقرار کنید تا ببینید چه چیزی از آن عبور میکند همانطور که در تصویر زیر قابل رویت است (نکته:برای چنین کاری نیازمند این است که شما دسترسی روت داشته باشید که با کلمه کلیدی sudo در سیستم عامل لینوکس میتوانید چنین دسترسی را فعال کنید در سیستم عامل لینوکس)

وقتی دستورات Docker را در خط فرمان ,وارد می کنید ، درخواست HTTP به سرور Docker در دستگاه محلی شما ارسال می شود. سرور Docker دستور را انجام می دهد و یک پاسخ HTTP را برمی گرداند ، بعد از دریافت پاسخ با مفسر داکر تفسیر می شود پاسخی که سرویس داکر شما می دهد بعد از وارد کردن خط فرمان

سرور داکر با زبان گو نوشته شده است و بعد از دریافت درخواست پاسخ برای برای شما باز می گرداند

ارتباطی شما با سرور داکر با استفاده از سوکت دیمن است که در پس زمینه اجرا می شود

برای اینکه پروکسی برقرار کنیم از سوکت استفاده می شود تا بتوانیم بهتر دیباگ کنیم دستورات داکر

با استفاده از دستور آرگومان  v- برای شما جریان را نشان میدهد(یا وراژی میکند) که دستور را وارد میکنید در ترمینال دقیقا چه اتفاقی می افتد که بتوانید بهتر دیباگ کنید سرویس داکر را با استفاده از unix-listen گوش میدهیم به درخواست هایی که به دیمن می آید نکته ایی که وجود دارد این دستور را با دسترسی کاربر اصلی یا root اجرا کنید

زمانی که پروکسی را تنظیم میکنید معماری سرویس داکر به صورت زیر تغییر میکند

خروجی داکر بعد از این تغییرات به صورت زیر است

استفاده از سوکت روشی قدرتمند برای debug کردن است نه تنها برای Docker ، بلکه برای سایر سرویسهای شبکه هم قابل استفاده است

استفاده از داکر در مرورگر:

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

زمانی که میخواهید در داکر را به صورت گرافیکی ببینید و در مرورگر بتوانید نصب کنید کانتینر باید  cross-origin-resource sharing مرورگر را فعال کنید

خوب کمی در مورد اینکه چگونه این کار را انجام دهیم صحبت میکنیم

در مرحله اول پروژه را از گیت هاب  کلون میکنیم در مرحله بعدی سرور مربوطه را روی پورت ۸۰۰۰ فعال می کنیم و اجرا میکنیم بعد از اینکه سرویسی که به شما امکان کار در محیط گرافیکی را میدهد را اجرا میکنیم و آدرس زیر را در مرورگر وارد میکنیم  http://localhost:8000 

  1. در مرحله اول، باز میکنیم مرورگر را که برای ما داکر ترمینال را در مرورگر در دسترسی قرار می دهد
  2. در مرحله دوم،بروزرسانی میکنیم image و یکی از image  های مورد نظر را انتخاب میکنیم
  3. در مرحله سوم،بعد از اینکه image مشخص شد داکر دیمن تصمیم میگیرد بسته به انتخاب ما چه image را پیدا کند
  4. در مرحله چهارم،داکر ترمینال درخواست را میدهد به داکر دیمن و داکر دیمن ارسال میکند به داکر هاب یا ریپازیتوری غیر داکر هاب که مشخص کردید
  5. در مرحله پنجم،داکر دیمن درخواست را ارسال میکند به داکر هاب
  6. در مرحله ششم،وضعیت ارسال میشود به سمت کاربر در مرورگر
  7. در مرحله هفتم،کاربر وضعیت و درخواستی که کرده را میبینید

استفاده از پورت برای اتصال به کانتینر:

کانتینر برای ارائه سرویس به بیرون ارائه شده است 

اگر شما یکی از کانتینرها را در پورت ۸۰ قرار دهید بقیه کانتینرها نمیتوانند از پورت ۸۰ برای کانتینرهای خود استفاده کنند.که از port mapping باید استفاده کنید 

مساله :

شما میخواهید کانتینر خود را از بیرون ببینید و نیازمند این است که پورتی برای آن مشخص کنیم چگونه؟

راه حل :

در داکر از آرگومان p- استفاده میکند برای assign کردن پورت برای کانتینر

برای اینکه یک image  را از داکر هاب دریافت کنیم باید از دستور docker pull استفاده کنیم تا image مورد نظر را دریافت کند و شما از image یک instance یا یک کانتینر بسازید و استفاده کنید

در ادامه بعد از دریافت image از داکر هاب از روی این imag، کانتینر میسازیم

در کامند زیر، فرایند ایجاد کانتینر و تعریف پورت که قابل مشاهده از بیرون ماشین باشد تعریف میکنیم.که در این مثال گفتیم از image،وردپرس یک کانتینر بساز و پورت ۱۰۰۰۲ برای این کانتینر که بتواند از بیرون قابل دسترسی باشد را تعریف کن و یک اسمی که برای شما قابل فهم باشد برای کانتینر مشخص کن که در این مثال اسم blog2 را مشخص کردیم و در انتها اسم image که از داکر هاب دریافت کردیم را میدهیم. پورت داخلی که برای کانتینر در نظر گرفتیم پورت ۸۰ است برای دسترسی از بیرون پورت ۱۰۰۰۲ و برای درخواست محلی از پورت ۸۰ استفاده میکند این کانتینر

برای دیدن وضعیت کانتینر از دستور زیر استفاده می کنیم

بعد از اینکه دستور مورد نظر را وارد کردید باید توقع خروجی زیر را داشته باشید

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

بعضی مواقع نیاز پیدا می کنید که کانتینر را حذف کنید،برای حذف کانتینر از دستور زیر استفاده میکنیم.که در این مثال همزمان دو کانتینر را حذف میکنیم یکی از کانتینرها blog1 است و کانتینر دوم blog2 است

فرایند ارتباط با کانتینر:

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

مساله :

چگونه می توانیم یکی از کانتینرها را به بقیه کانتینرها در داخل سرور به هم متصل کنیم

راه حل :

برای اینکه بتوانید ارتباطی بین کانتینرها ایجاد کنید نیازمند این است که شبکه ایی برای کانتینرها تعریف کنید

تعریف شبکه برای کانتینرها

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

به طور پیش فرض ، تمام کانتینرهایی که به این شبکه وصل می شوید قادر به دیدن یکدیگر هستند

در مرحله بعد،با فرض اینکه هنوز کانتینرهای blog1 و  blog2 را که از تکنیک قبلی کار میکند (منظور تعریف پورت و دیدن از بیرون) می توانید یکی از آنها را به شبکه ایی که تعریف شده است متصل کنید

در ادامه کانتینر تعریف میکنیم و آن کانتینر را متصل میکنیم به شبکه مجازی که با استفاده از داکت تعریف کردیم

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

دیدگاهتان را بنویسید

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