Docker همان گلوله نقره ای است که مشکل کانتینرهای نرم افزار و مجازی سازی را یک بار برای همیشه حل کرد. بله، این یک ادعای خیلی بزرگ است! محصولات دیگر سعی کردند با این مشکلات مقابله کنند، اما رویکرد جدید و اکوسیستم داکر رقابت را به طور کامل تمام کرده است. این راهنما به شما کمک می کند تا مفاهیم اولیه Docker را درک کنید تا بتوانید از آن برای برنامه های کاربردی خود استفاده کنید و آن را در جریان کاری خود به کار ببرید.
تاریخچه داکر (Docker)
Docker در سال 2013 توسط Solomon Hykes در حین کار برای dotCloud، یک شرکت میزبانی ابری، ایجاد شد. در ابتدا به عنوان یک ابزار داخلی برای تسهیل توسعه و استقرار برنامه ها ساخته شد.
کانتینرهای Docker بر پایه کانتینرهای لینوکس هستند که از اوایل دهه 2000 وجود داشته است، اما تا زمانی که داکر یک پلت فرم ساده و با کاربری آسان برای اجرای کانتینرها ایجاد کرد که به سرعت مورد توجه توسعه دهندگان و مدیران سیستم قرار گرفت، به طور گسترده مورد استفاده قرار نگرفتند.
در مارس 2014، Docker فناوری خود را منبع باز کرد و به یکی از محبوب ترین پروژه ها در GitHub تبدیل شد و بلافاصله پس از آن میلیون ها دلار سرمایه از سرمایه گذاران جمع آوری کرد.
در مدت زمان بسیار کوتاهی، Docker به یکی از محبوبترین ابزارها برای توسعه و استقرار نرمافزار تبدیل شده است و تقریباً همه افراد جامعه DevOps از آن استفاده کردهاند!
Docker چگونه کار می کند؟
Docker یک فناوری است که به شما امکان می دهد برنامه های کاربردی توزیع شده را بسازید، اجرا کنید، آزمایش کنید و اجرا کنید. از مجازی سازی در سطح سیستم عامل، برای ارائه نرم افزار در بسته هایی به نام کانتینر استفاده می کند.
روشی که Docker این کار را انجام می دهد با بسته بندی یک برنامه کاربردی و وابستگی های آن در یک کانتینر مجازی است که می تواند روی هر رایانه ای اجرا شود. این کانتینریسازی در مقایسه با ماشینهای مجازی امکان حمل و کارایی بسیار بهتری را فراهم میکند.
این کانتینرها از یکدیگر مجزا هستند، اما ابزارها، کتابخانهها و فایلهای پیکربندی خود را در کنار هم قرار میدهند. آنها می توانند از طریق کانال های کاملاً مشخص با یکدیگر ارتباط برقرار کنند. همه کانتینرها توسط یک هسته سیستم عامل اجرا می شوند و بنابراین از منابع کمی استفاده می کنند.
همانطور که گفته شد، مجازی سازی سیستم عامل برای مدتی در قالب کانتینرهای لینوکس (LXC)، Solaris Zones و قالب های FreeBSD وجود داشته است. با این حال، داکر این مفهوم را با ارائه یک پلتفرم با کاربری آسان که استقرار برنامهها در کانتینرها را خودکار میکند، پیش برد.
در اینجا برخی از مزایای کانتینرهای Docker نسبت به ماشین های مجازی سنتی آورده شده است:
- آنها قابل حمل هستند و می توانند بر روی هر رایانه ای که دارای محیط اجرای Docker است اجرا شوند.
- آنها از یکدیگر جدا هستند و می توانند نسخه های مختلف یک نرم افزار را بدون تأثیر بر یکدیگر اجرا کنند.
- آنها بسیار سبک و کم حجم هستند، بنابراین می توانند سریعتر راه اندازی شوند و از منابع کمتری استفاده کنند.
حال بیایید نگاهی به برخی از اجزا و ابزارهایی بیندازیم که همه این کارها را ممکن میسازند.
اجزا و ابزارهای Docker
داکر از سه جزء اصلی تشکیل شده است:
- موتور داکر (Docker Engine)، یک محیط زمان اجرا (runtime environment) برای کانتینرها
- کلاینت خط فرمان داکر که برای تعامل با موتور داکر استفاده می شود
- داکر هاب، یک سرویس ابری که خدمات رجیستری و مخزن را برای تصاویر داکر (Docker images) فراهم می کند
علاوه بر این اجزای اصلی، تعدادی ابزار دیگر نیز وجود دارد که با Docker کار می کنند، از جمله:
- Swarm، یک ابزار خوشهبندی و زمانبندی برای برنامههای dockerized
- Docker Desktop، جانشین Docker Machine و سریعترین راه برای کانتینری کردن برنامهها
- Docker Compose، ابزاری برای تعریف و اجرای برنامههای Docker چند کانتینری
- Docker Registry، یک سرویس رجیستری در محل برای ذخیره و مدیریت تصاویر Docker
- Kubernetes، یک ابزار ارکستراسیون و هماهنگ ساز کانتینر است که می تواند با Docker استفاده شود
- Rancher، یک پلت فرم مدیریت کانتینر برای ارائه Kubernetes-as-a-Service
حتی تعدادی سرویس وجود دارد که از اکوسیستم داکر پشتیبانی می کند:
- سرویس کانتینر الاستیک آمازون (Amazon ECS)، یک سرویس هماهنگ کننده کانتینر مدیریت شده از خدمات وب آمازون
- Azure Kubernetes Service (AKS)، یک سرویس ارکستراسیون کانتینر مدیریت شده از Microsoft Azure
- Google Kubernetes Engine (GKE)، یک موتور Kubernetes کاملاً مدیریت شده که در Google Cloud Platform اجرا می شود
- Portainer (پورتینر)، برای استقرار، پیکربندی، عیب یابی و ایمن سازی کانتینرها در چند دقیقه در Kubernetes، Docker ،Swarm و Nomad در هر ابر، مرکز داده یا دستگاه
آشنایی بیشتر با کانتینرهای داکر
کانتینرها اغلب با ماشین های مجازی مقایسه می شوند، اما تفاوت های مهمی بین این دو وجود دارد. ماشینهای مجازی یک نسخه کامل از یک سیستم عامل را اجرا میکنند، در حالی که کانتینرها هسته میزبان را با سایر کانتینرها به اشتراک میگذارند. این باعث می شود کانتینرها بسیار سبک تر و کارآمدتر از ماشین های مجازی باشند.
برای شروع، یک کانتینر یک واحد نرم افزار مستقل است که شامل تمام وابستگی های مورد نیاز برای اجرای یک برنامه است. این امر بسته بندی و ارسال برنامه ها را بدون نگرانی در مورد مشکلات سازگاری آسان می کند. کانتینرهای داکر را می توان بر روی هر ماشینی که موتور داکر نصب کرده باشد اجرا کرد.
این کانتینرها از یکدیگر جدا هستند و ابزارها، کتابخانهها و فایلهای پیکربندی خود را بستهبندی میکنند و میتوانند از طریق کانالهای کاملاً مشخص با یکدیگر ارتباط برقرار کنند.
ساخت کانتینر داکر با تصاویر داکر
کانتینرهای Docker از تصاویر ساخته شدهاند که الگوی فقط خواندنی با تمام وابستگیها و پیکربندیهای مورد نیاز برای اجرای یک برنامه هستند.
یک کانتینر، در واقع، نمونهای از زمان اجرا از یک تصویر است، چیزی که تصویر در هنگام اجرای واقعی در حافظه تبدیل میشود. به طور پیش فرض، کاملاً جدا از محیط میزبان اجرا می شود و فقط در صورت پیکربندی، به فایل های میزبان و پورت ها دسترسی پیدا می کند. به این ترتیب، کانتینرها فضای شبکه، ذخیره سازی و فرآیند مخصوص به خود را دارند. و این جداسازی جابجایی کانتینرها بین هاست ها را بدون نگرانی در مورد مشکلات سازگاری آسان می کند.
تصاویر را می توان با استفاده از یک Dockerfile (که شامل تمام دستورالعمل های لازم برای ایجاد یک تصویر است) یا با استفاده از Docker commit که یک کانتینر موجود را می گیرد و یک تصویر از آن ایجاد می کند، ایجاد کرد.
در داخل یک کانتینر داکر چیست؟
کانتینرهای Docker شامل همه چیزهایی هستند که یک برنامه برای اجرا نیاز دارد، از جمله:
- کد
- یک زمان اجرا
- کتابخانه ها
- متغیرهای محیطی
- فایل های پیکربندی
کانتینر داکر از سه بخش اصلی تشکیل شده است:
- Dockerfile که برای ساخت تصویر استفاده می شود.
- خود تصویر، یک الگوی فقط خواندنی با دستورالعملهایی برای ایجاد یک کانتینر Docker
- کانتینر، یک نمونه قابل اجرا که از یک تصویر ایجاد شده است (شما می توانید با استفاده از Docker API یا CLI یک کانتینر را ایجاد، شروع، توقف، حرکت یا حذف کنید)
یک کانتینر هسته (Linux Kernel) را با سایر کانتینرها و ماشین میزبان خود به اشتراک می گذارد. این باعث می شود وزن آن بسیار سبک تر از یک ماشین مجازی باشد.
چگونه یک کانتینر را راه اندازی کنیم؟
محفظههای Docker قابل حمل هستند و میتوانند روی هر میزبانی با موتور Docker نصب شده اجرا شوند.
برای اجرای یک کانتینر، ابتدا باید تصویر را از یک رجیستری بیرون بکشید. سپس، می توانید با استفاده از این تصویر، کانتینر را ایجاد و راه اندازی کنید.
به عنوان مثال، فرض کنید می خواهیم یک کانتینر لینوکس آلپاین راه اندازی کنیم. ابتدا تصویر Alpine Docker را از Docker Hub می کشیم. برای انجام این کار، از دستور docker pull و به دنبال آن نام مخزن و تگ (نسخه) که می خواهیم دانلود کنیم استفاده می کنیم:
docker pull alpine:latest
این تصویر خاص بسیار کوچک است، فقط 5 مگابایت اندازه دارد! پس از پایین کشیدن آن به سیستم خود با استفاده از docker pull، میتوانیم با اجرای docker images تأیید کنیم که به صورت محلی وجود دارد. این باید خروجی مشابه آنچه در زیر نشان داده شده است به ما بدهد:
REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6b2f0 3 weeks ago 5MB
اکنون که تصویر را به صورت محلی داریم، میتوانیم یک کانتینر را با استفاده از آن راهاندازی کنیم. برای این کار از دستور docker run و به دنبال آن نام تصویر استفاده می کنیم:
docker run alpine
این یک پیغام خطایی به ما می دهد که به ما می گوید باید دستوری را مشخص کنیم تا در کانتینر خودمان اجرا شود. به طور پیشفرض، کانتینرهای Docker هیچ فرآیند یا دستوری را هنگام ایجاد راهاندازی نمیکنند.
ما می توانیم این دستور را به عنوان یک آرگومان برای docker run ارائه کنیم، مانند این:
docker run alpine echo "Hello, World!"
در اینجا، تمام کاری که ما انجام می دهیم اجرای برنامه echo و ارسال “Hello, World!” به عنوان ورودی است. وقتی این خط را اجرا می کنید، باید خروجی مشابه آنچه در زیر نشان داده شده است، ببینید:
Hello, World!
عالی! ما اولین کانتینر Docker خود را با موفقیت راه اندازی کردیم. اما اگر بخواهیم یک دستور shell را در داخل یک کانتینر آلپاین اجرا کنیم، چه؟ برای انجام این کار، می توانیم دستور sh را به عنوان ورودی به docker run ارسال کنیم:
docker run -it alpine sh
پرچم i- مخفف “interactive” است و برای باز نگه داشتن stdin حتی اگر متصل نباشد استفاده می شود. پرچم t- یک دستگاه شبه TTY را اختصاص می دهد. این دو پرچم با هم به ما این امکان را می دهند که مستقیماً به کانتینر در حال اجرا خود متصل شویم و یک نشست پوسته تعاملی (interactive shell session) را به ما ارائه دهند:
/ #
از اینجا، میتوانیم هر دستوری را که در توزیع آلپاین لینوکس در دسترس است، اجرا کنیم. برای مثال، بیایید ls را اجرا کنیم:
/ # ls bin dev etc home lib media mnt proc root run sys tmp var boot home lib64 media mnt opt rootfs sbin usr
اگر بخواهیم از این پوسته (shell) خارج شویم، به سادگی می توانیم exit را تایپ کنیم:
/ # exit
و همین! ما اکنون اولین کانتینر Docker خود را با موفقیت راه اندازی کرده و از آن خارج شده ایم.
چرا از کانتینر استفاده می کنید؟
دلایل خوبی برای استفاده از کانتینرها وجود دارد:
- انعطاف پذیری: کانتینرها را می توان بر روی هر پلتفرمی که از Docker پشتیبانی می کند، اجرا کرد، خواه لپ تاپ، سرور، ماشین مجازی یا نمونه ابری باشد. این امر جابجایی برنامهها را آسان میکند و به تیمهای DevOps کمک میکند تا در توسعه، آزمایش و تولید به محیطهای سازگار دست یابند.
- جداسازی: هر کانتینر در محیط ایزوله خود اجرا می شود و دارای مجموعه ای از فرآیندها، سیستم های فایل و رابط های شبکه است. این تضمین می کند که یک کانتینر نمی تواند با منابع کانتینر دیگر تداخل داشته باشد یا به منابع دسترسی پیدا کند.
- چگالی و کارایی: چندین کانتینر را می توان در یک سیستم میزبان بدون نیاز به چندین نسخه از سیستم عامل یا منابع سخت افزاری اضافی اجرا کرد و کانتینرها سبک و کم حجم هستند و به منابع کمتری نسبت به ماشین های مجازی نیاز دارند و کارایی بیشتری برای اجرا دارند. همه اینها باعث صرفه جویی در زمان و هزینه گرانبها هنگام استقرار برنامه های کاربردی در مقیاس بزرگ می شود.
- مقیاس پذیری: کانتینرها را می توان به راحتی بزرگ یا کوچک کرد تا نیازهای در حال تغییر را برآورده کند. این امر باعث می شود تا زمانی که تقاضا زیاد است از منابع به طور موثر استفاده کرد و در صورت کاهش تقاضا به سرعت آنها را آزاد کرد.
- امنیت: قابلیت های جداسازی کانتینرها به ایمن سازی برنامه ها از حملات مخرب و نشت های تصادفی کمک می کند. با اجرای هر کانتینر در محیط ایزوله خود، می توانید احتمال به خطر افتادن را بیشتر به حداقل برسانید.
- قابل حمل بودن: کانتینرها را می توان به راحتی بین میزبان های مختلف جابجا کرد و توزیع برنامه ها را در مجموعه ای از سرورها آسان می کند. این امکان استفاده کارآمد از منابع را فراهم می کند و کمک می کند تا اطمینان حاصل شود که برنامه ها همیشه در صورت نیاز در دسترس هستند.
- تکرارپذیری: کانتینرها را می توان به راحتی برای ایجاد کپی های یکسان از یک محیط تکرار کرد. این برای ایجاد محیطهای آزمایش و مرحلهبندی که با تولید مطابقت دارند یا برای توزیع برنامهها در مجموعه ای از سرورها مفید است.
- سرعت: کانتینرها را می توان به سرعت راه اندازی و متوقف کرد، و آنها را برای برنامه هایی که باید در یک لحظه راه اندازی و اجرا شوند، ایده آل می کند.
- سادگی: الگوی کانتینر، ساده و قابل درک است و شروع کار با کانتینرها را آسان می کند.
- زیست بوم: اکوسیستم داکر شامل طیف گسترده ای از ابزارها و خدمات است که ساخت و حمل و نقل کانتینرها را آسان می کند.
نکات مفید
ما این مقاله را با چند نکته در مورد بهترین شیوه ها و دستورات مفید برای بهترین استفاده از Docker به پایان می رسانیم.
بهترین شیوه های Docker
چند بهترین روش وجود دارد که باید هنگام کار با Docker دنبال کنید:
- از یک فایل dockerignore. برای حذف فایل ها و دایرکتوری ها از زمینه ساخت خود استفاده کنید.
- Dockerfile خود را ساده و خوانا نگه دارید.
- هنگام کار با Docker از sudo استفاده نکنید.
- با استفاده از دستور ایجاد docker network یک شبکه تعریف شده توسط کاربر برای برنامه خود ایجاد کنید.
- از Docker Secrets برای مدیریت داده های حساس استفاده شده توسط کانتینرهای خود استفاده کنید.
دستورات داکر
اگر میخواهید درباره Docker اطلاعات بیشتری کسب کنید، در اینجا فهرستی از دستورات برای شروع دارید:
- docker، برای مدیریت کانتینرها در سیستم شما
- docker build، برای ایجاد یک تصویر جدید از یک Dockerfile
- docker images، برای فهرست کردن تمام تصاویر موجود در سیستم شما
- docker run، برای راه اندازی یک کانتینر جدید از یک تصویر
- docker ps، برای فهرست کردن همه کانتینرهای در حال اجرا در سیستم شما
- docker stop، برای توقف کانتینر در حال اجرا
- docker rm، برای حذف یک کانتینر متوقف شده از سیستم شما
- docker rmi، برای حذف یک تصویر از سیستم شما
- docker login، برای ورود به رجیستری داکر
- docker push، برای فشار دادن یک تصویر به یک رجیستری Docker
- docker pull، برای کشیدن تصویر از رجیستری Docker
- docker exec، برای اجرای یک فرمان در یک کانتینر در حال اجرا
- docker export، برای برون ریزی یک کانتینر به عنوان آرشیو tar
- docker import، برای درون ریزی آرشیو tar به عنوان یک تصویر
در نهایت، از یک ویرایشگر متن مانند Vim یا Emacs برای ویرایش Dockerfile خود استفاده کنید.
آخرین توصیه ها
Docker ابزار قدرتمندی است که می تواند به شما کمک کند استقرار برنامه های خود را خودکار کنید. استفاده از آن ساده است و نیازی به نصب هیچ گونه وابستگی بر روی دستگاه میزبان خود ندارد.
در چند سال گذشته، داکر به یکی از محبوب ترین ابزارها برای توسعه و استقرار نرم افزار تبدیل شده است. توسعه دهندگان از آن برای بسته بندی کد و وابستگی های خود در یک واحد استاندارد استفاده می کنند، که سپس می تواند در هر سروری مستقر شود. علاوه بر این،Docker همچنین توسعه دهندگان را قادر می سازد تا چندین برنامه مجزا را روی یک هاست اجرا کنند و آن را به ابزاری ایده آل برای میکروسرویس ها تبدیل می کند.
اگر به دنبال ابزاری هستید که بتواند به شما کمک کند گردش کار خود را ساده کنید و زندگی خود را به عنوان یک توسعه دهنده و sysadmin ساده تر کنید،Docker یک ابزار ضروری برای اضافه کردن به مجموعه مهارت های شما است.