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

در این مقاله قصد دارم Docker
را به شما معرفی کنم و یاد خواهید گرفت که چگونه آن را نصب، راه اندازی و مورد استفاده قرار دهید.قبل از معرفی کامل داکر چند چیز را باید خوب بدانیم. این که کانتینرها چه هستند و به ما چه قابلیتی می دهند، سپس باید بفهمیم سیستم های توزیع پذیر چه کمکی می توانند به ما بکنند و چه فرقی با ویرچوآل ماشین دارند . در کل تعریف و تشریح داکر و سیستم های مدیریت کانتینر بسیار سخت است و لازم می دانم قبل از ورود به بحث کمی آمادگی ذهنی به شما بدهم
فرض کنید بر روی سرور شما یک سیستم عامل لینوکس نصب شده و شما می خواهید چند اپلیکیشن و یا سرویس را در یک سرور راه اندازی کنید که ممکن است سرور شما را دچار زحمت کند . اولین راه حل این است که یک VM
بر روی سرور بالا بیاورید و یک سیستم عامل بر روی آن نصب کنید و سرویس خود را بر روی آن بالا بیاورید.
خوب این راه حل نسبتا خوبی است اما ریسورس شما را به شدت درگیر نگهداری VM
میکند. برای حل این مشکل تفکری به اسم کانتینر را مطرح کردند که با استفاده از هسته یا همان کرنل لینوکس میتوان یک سیستم عامل دیگر را در قالب یک کانتینر هندل کرد .این به ما کمک می کند از یک کرنل واحد استفاده کنیم بی آن که از ریسورس بی جهت استفاده کنیم . با این تفکر میتوان یک اپلیکیشن یا سرویس را چند تا چند تا و به صورت توزیع در یک سیستم عامل یا یک سیستم Distributed
تجربه کرد .
درگذشته شاید هر کس فکر می کرد می خواهد از سیستم های Cloud
استفاده کند ، نا خود آگاه به سمت OpenStak
یا سایت هایی مانند Heroku و Openshift و … می رفتند.اما امروزه داکر دنیای نرم افزاری را به فکر وادار کرده . این تفکر توانسته تمامی کمپانی های بزگ مانند RedHat
, Amazon
, Google
, SoundCloud
, RedHat
, Amazon
, Google
, SoundCloud
, DigitalOcean
, Spotify
, NETFLIX
, و… را دچار تغییرات بسیاری کند و آن ها را وادار به کانتریبیوت و توسعه هر چه بیشترش بنماید. در ایران نیز شرکت های بزرگی مانند CoffeBazar
, QuizOfKings
, TeleWebion
, Tapsell
و بسیاری دیگر پروژه های خود را بر پایه کانتینر منیجرهایی مانند Docker پیاده سازی کرده و بر روی آن حساب ویژه ای باز کرده اند.
داکر (Docker)
در کل Docker
یک سیستم متن باز برای ساخت اپلیکیشن های توزیع شده و راه اندازی سرویس های مبتنی بر لینوکس است.
همچنین یک توسعه دهنده توسط داکر می توانید اپلیکیشن های خود را سریع و راحت منتشر کند.
Docker
به صورتی عمل می کند که عملیات بسته بندی، حمل و توسعه هر اپلیکیشن را بطور خودکار انجام دهد. به این معنی که کل اپلیکیشن را در قالب یک کانتیتر قرار میگیرد و قابل حمل بر روی دیگر سرور هاست . این عامل کمک میکند در زمان و سرعت دیپلوی کردن و راه اندازی و امنیت جابه جایی پروژه برنامه نویس یا ادمین، آسوده خاطر شود. در کل منظور از امنیت این است که اپلیکیشن های ما در هر کانتینر به صورت جداگانه و بدون هیج دسترسی به هم به صورت موازی فعالیت می کنند . مگر آن که آن ها را به هم لینک کرده یا از سرویس های ارائه شده آن ها استفاده کنیم. امنیت داکر با خود کرنل و آپی تیبل لینوکس تضمین می شود . اگر همه چیز در پروژه و رول های آپی تیبل رعایت شود ، خطر بسیار کمی شما را تحدید می کند.
داکر نگاه نمیکند و ببیند سرور شما از چه سیستم عاملی استفاده میکنه بلکه خودش رو با سیستم عاملتون وقف می دهد. حتی اگه ویندوز یا مک باشید. این را اضافه کنم که داکر هیچ سیستم عامل جدیدی ایجاد نمی کند بلکه این امکان را به بسته نرم افزاری ایجاد شده می دهد که از Kernel
اصلی سیستم عاملی که بر روی آن نصب شده است استفاده نماید و در زمان انتقال نیز فقط Package
نرم افزاری منتقل می شود نه ماشین مجازی(این برای سرور های ویندوزی صدق نمیکند.) ، در واقع Docker Engine
یا موتور اصلی Docker
جایگزین نرم افزار Hypervisor
می شود و اینکار باعث می گردد که کارایی سیستم ما به شدت افزایش یابد زیرا یک لایه واسط به نام Hypervisor
حذف شده و نرم افزار بصورت مستقیم با هسته اصلی سیستم عامل لینوکس کار میکند با این تفاوت که کاملا ایزوله شده است.
داکر Open Source
است (متن باز)، بدین معنی که هر کسی می تواند Docker
را تهیه و استفاده و توسعه دهد و قابلیت های جدیدی به آن اضافه کند و حتی یک پروژه مبتنی بر داکر ارائه دهد Kubernetes
.
بسیاری از پروژه های در حال توسعه دچار دو دلی شده اند که بر روی این پلتفرم سرمایه گذاری کنند یا خیر؟ اما به عقیده بنده وقتی گوگل بزرگترین پروژه کلود تاریخ Kubernetes
را بر روی داکر و تفکر کانتینرایز کردن برده است ، دلیلی برای دو دلی نمی ماند.
راه اندازی Docker در لینوکس
توجه داشته باشین ممکن است در تمامی فرایندهای نصب یا استفاده با خطایی ۴۰۳ که مربوط به تحریم های کشور آمریکا می باشد مواجه شود که می بایست به نحوی آن را دور بزنید . همچنین داکر در حال حاضر دو نسخه اینترپرایز و کامیونیتی دارد که ما در تمامی مراحل نسخه کامیونیتی پایدار آن را نصب و راه اندازی می کنیم.
CentOS
اگر از نسخه ۷ این دیستریبیوشن بهره می برید، لازم نیست تمامی مراحل را سپری کنید و فقط لازم است از آخرین مرحله استفاده کنید.
برای نصب می بایست ابتدا آدرس ریپازیتوری مربوط به داکر را به پکیج منیجر افزوده و آن را نصب کنید.
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum install docker-ce
هم اکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :
sudo systemctl start docker
اگر به هر دلیل موفق به نصب نشدید از این آدرس فایل مربوط به سیستم عاملتان را دانلود کنید و با کامند زیر نصب کنید
sudo yum install -y AddressOfDockerFileThatYouDownload.rpm
و یا
sudo rpm -U AddressOfDockerFileThatYouDownload.rpm
Fedora-V25
sudo dnf install -y docker-ce
همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :
sudo systemctl start docker
Debian-V8
با دستور زیر به راحتی داکر را نصب کنید:
sudo apt-get update
sudo apt-get install docker-ce
همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :
sudo systemctl start docker
Ubuntu-V16
با دستور زیر به راحتی داکر را نصب کنید:
sudo apt-get update
sudo apt install docker-ce
همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :
sudo systemctl start docker
برای نصب بر روی نسخه هایی که قادر به استفاده از پکیج منیجر نیستند می بایست فایل قابل نصب ان را از آدرس دانلود و سپس با دستورات زیر آن را نصب کنند:
tar xzvf /path/to/dockerXXXX.tar.gz
sudo cp docker/* /usr/bin
sudo dockerd
برای اینکه بدانید داکر نصب شده یا خیر بهترین راه استفاده از کامند زیر است :
sudo docker --version
داکر به هر ترتیب می بایست بر روی لینوکس راه اندازی شود و بر روی سیستم عامل های با کرنل غیر لینوکسی کار نمی کند . بنابر این شرایط را به نحوی در آن ها پیاده سازی و راه اندازی می کنند تا یک کرنل لینوکس در آن ها قرار داشته باشد و آن هم استفاده از یک vm
و یک لینوکس آماده استفاده برای داکر است که آن را Docker-machine می نامند. در این مقاله نصب بر روی سه سیستم عامل معروف غیر لینوکسی windows
, mac
, freeBSD
را آموزش می دهیم :
نصب بر روی Windows:
ابتدا داکر ماشین را از لینک زیر دانلود می کنیم
https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
توجه : همان گونه که گفته شد داکر برای کشور عزیز ما محدودیت قرار داده و ما بن هستیم و شما می بایست به نحوی آن را دور بزنید.
سپس فایل دانلود شده را نصب و مراحل نصب را انجام دهید . برای اطلاعات تکمیلی به لینک زیر مراجعه بفرمایید:
https://docs.docker.com/docker-for-windows/install/#install-docker-for-windows
نصب بر روی Mac:
ابتدا داکر ماشین را از لینک زیر دانلود کنید :
https://download.docker.com/mac/stable/Docker.dmg
سپس فایل دانلود شده را نصب و مراحل نصب را انجام دهید .
پس از نصب بر روی ایکن داکر در منو مک کلیک کنید تا آماده استفاده شود.
پس از مشاهده ایکون داکر در status bar
می توانید با کامندلاین مک به داکر فرمان دهید .
داکر بر روی freeBSD:
ابتدا داکر و داکر ماشین را از پکیج منیجر دانلود کرده:
pkg install docker docker-machine docker-compose
سپس در هوم دایرکتوری خود یک فایل مخفی برای داکر ساخته:
mkdir ~/.docker
سپس یک لینک از محتویات داکر در پوشه داکر ساخته تا همه چی دم دست باشد.
ln -s /storage/docker ~/.docker/machine
سپس داکر ماشین را برای راه اندازی داکر (با استفاده معین از منابع) ساخته.
docker-machine create --driver virtualbox
--virtualbox-memory 2048
--virtualbox-cpu-count 2
--virtualbox-disk-size 102400
--virtualbox-hostonly-cidr '10.2.1.1/24'
docker1
اینک داکر نصب شده و می بایست برای دسترسی از دستور زیر استفاده کنیم :
eval `docker-machine env docker1`
چگونه با داکر کار کنیم؟
کار کردن با داکر به شدت آسان است ، البته به شرطی که لینوکس را خوب بشناسید و بدانید با هر کانتینر می خواهید چه کنید. اگر لینوکس را خوب نمیشناسید لطفا کمی بیشتر در مورد آن بخوانید . در پارس کلیک مقالاتی هست که می توانید کمی بیشتر لینوکس را بشناسید.
ایده داکر بسیار زیباست و به شما این اجازه را می دهد سیستم عاملی با سرویس ها و اپلیکیشن هایی زیاد داشته باشید بدون آن که در خود سیستم عامل چیزی را راه اندازی کنید.
DockerImage چیست؟
برای تولید یک کانتینر باید یک ایمیج داشت. هر ایمیج داکر به چند صورت قابل استفاده می باشد .
۱. به صورت آماده در DockerHub
(ریپازیتوری داکر) یا ریپازیتوری لوکال و شخصی.
۲.استفاده از ایمیج های ذخیره شده در حافظه دستگاه.
۳.به صورت فایل قابل Build
که با دستورات خاصی به شما این قابلیت را میدهد تا ایمیج شخصی بسازید.
این روش ها همه و همه به ما کمک میکنند تا ایمیج ها را در داکر ذخیره و از آن ها استفاده کنیم.
ساده ترین راه استفاده از ایمیج ها داکر هاب است که برای کشور ما بن شده و باید آن که با ابزار هایی آن ها را دور بزنید. اما اگر از وی پی اس یا کلود های خارجی استفاده می کنید این محدودیت وجود ندارد.
برای دانلود کردن یک داکر ایمیج ،نام آن را پیدا کرده و سپس آن را Pull
می کنیم.
برای پیدا کردن آن به سایت داکر هاب رفته و سرویس یا اپ مورد نظر را سرچ کنید و سپس بر اساس نیاز نام یکی از آن ها را کپی و از دستور زیر استفاده نمیایید:
sudo docker pull IMAGENAME:VERSION
اگر از root
یوزر استفاده می کنید (که اشتباهی بزرگ را دارید انجام میدهید) از sudo
استفاده نکنید. sudo
برای یوزرهایی است که sudoer
هستند. من در اینجا sudo
را قرار می دهم که یادتان نرود docker
دسترسی روت می خواهد.
و یا اینکه نام مورد نظر را مانند مثال زیر Sreach
کرده و اسامی ایمیج های مورد نظر و مشابه را دریافت نمایید و سپس آن را Pull
نمایید:
sudo docker search IMAGENAME
برای متوجه شدن از ذخیره سازی ایمیج از دستور زیر استفاده نمایید :
sudo docker images
هر داکر ایمیج بعد از ذخیره شدن یک نام و یک id دارد که هر دو برای استفاده از آن ایمیج قابل استفاده می باشند.
اگر خواستید ایمیجی را در داخل دایرکتوری استور کنید و بعدا در جایی دیگر از آن استفاده کنید می بایست با کامند زیر آن را ابتدا ذخیره :
sudo docker save IMAGE_ID_OR_NAME A_NAME_FOR_NEW_IMAGE.tar
sudo docker save -o A_NAME_FOR_NEW_IAMGE.tar IMAGE_ID_OR_NAME
و پس از ذخیره در هارد می توان ان را به دستگاه دیگر منتقل و از آن استفاده کرد.
با کامند زیر می توان یک فایل ایمیج را در سیستم دیگر بار گذاری کرد(این روش به درد کسانی می خورد که نمی توانند داکر ایمیج ها را به دلیل تحریم ها داشته باشند):
sudo docker load < A_NAME_FOR_NEW_IMAGE.tar
sudo docker load -i A_NAME_FOR_NEW_IMAGE.tar
اگر بخواهید یک داکر ایمیج را پاک کنید می بایست از دستور زیر استفاده نمایید:
sudo docker rmi IMAGE_ID_OR_NAME
برای ساخت یک ایمیج اختصاصی می بایست از یک داکربیلد فایل استفاده کینیم . به این فایل ها به اختصار DockerFile می گویند .
این فایل برای ساخت یک ایمیج می بایست از فرمت خاصی بر خوردار باشد تا بتواند یک ایمیج را بیلد کند. بر فرض مثال اگر بخواهیم یک ایمیج بسازیم یک آپاچی را در اختیار ما قرار دهید می توانیم یک داکرفایل بسازیم و آن را بیلد کنیم.
مثال زیر می تواند به ما کمک کند:
FROM ubuntu:12.04
MAINTAINER infu.ir
RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ['/usr/sbin/apache2', '-D', 'FOREGROUND']
From
به معنی این است که از کدام ایمیج استفاده کن.
MAINTAINER
به معنای این است که چه کسی این ایمیج را می سازد.
RUN
برای اجرای یک سری دستورات در آن ایمیجی که from
شده است مورد استفاده قرار می گیرد تا در زمان بیلد شدن یک سری کار های مورد نیاز انجام شود.
ENV
برای تعریف کردن یک Environment variable
مورد استفاده قرار می گیرد.
EXPOSE
یک پورت برای ایمیج تخصیص می دهد.
CMD
یک دستور را در زمانی اجرا می کند که کانتینر در حال ساخته شدن است.
برای بیلد کردن نیز از دستور زیر استفاده نمیایید:
sudo docker build - < Dockerfile
sudo docker build -t DockerFile .
برای فهمیدن بیشتر و یا ساخت داکرفایل های بزرگتر می بایست از لینک های زیر استفاده نمایید چون استفاده از داکرفایل کاملا به نیاز شخصی از یک ایمیج برمیگردد:
https://docs.docker.com/engine/reference/builder/
https://www.digitalocean.com/community/tutorials/docker-explained-using-dockerfiles-to-automate-building-of-images
چگونه می توان از یک DockerImage، کانتینر ساخت؟
همانگونه که می دانید برای ساخت یک کانتینر نیاز داریم یک ایمیج داشته باشیم که فهمیدیم چگونه میتوان آن را تهیه کرد. اما برای تولید یک کانتینر از دستور docker run
استفاده می کنند:
sudo docker run -d IMAGE_ID_OR_NAME
sudo docker run -itd IMAGE_ID_OR_NAME
این دو کامند ساده ترین شکل کامند است که می توان یک کانتینر را ساخت.
اما چرا از آپشن هایی چون t,i,d
استفاده کردیم؟ جواب این است که هر ایمیح نیاز به مشخص کردن stdin
و tty
دارد تا بتواند با سیستم عامل تعامل برقرار کند.برای همین از آپشن های i
و t
استفاده می کنند. اما این دو آپشن شما را درون یک tty
در وارد می کند و اگر می خواهید وارد نشوید آن را با آپشن d
به ادغام یا به تنهایی بزنید تا وارد کانتینر نشوید و همچنین کانتینر ران باقی بماند.
آپشن های بسیار مهم در docker run:
-i
Stdin را باز نگه می دارد حتی اگر متصل نباشد.
-t
یک tty از کانتینر میسازد.
-p
یک پورت را از داخل کانتینر به یک پورت هاست متصل میسازد.
-v
یک مسیر دایرکتوری از کانتینر را به یک مسیر دایرکتری از هاست مپ می کند (یک volume می سازد)
-a
میتوان به صورت دستی با stdin
, stdout
و stderror
ارتباط برقرار کرد.
-d
عملیات را به بگراند می برد و کانتینر را ران می کند.
--rm
نگاه می کند اگر کانتینر مشابه بود آن را پاک می کند و جدید می سازد
--name
یک نام به کانتینر اختصاص می دهد.
برای بهتر فهمیدن این بخش لازم میدانم به چند مثال بسنده کنم:
اگر قصد ساخت کانتینری را دارید و ایمیج آن را در سیستم ندارید ، دستور run
خودش آن ایمیج را دانلود و کانتینر را می سازد.
برای ساخت یک کانتینر که دیستیبیوشن centOS
در آن است.
sudo docker run --name infu_centos -d centos
گاهی وقت ها لازم است بعد از ساخت دستوری را در کانتینر ران کنیم . شما می توانید بعد از نام ایمیج کامند خود را وارد کنید.
sudo docker run --rm -d centos cat /etc/redhat-release
برای داشتن یک وب سرور آپاچی که به پرت ۸۰۸۱
ما مپ شود و نیازی به تغیرات selinux
نیز نباشد و همچنین آدرس فایل های پروژه را در کانفیگ فایل آپاچی نخواهیم تغییر دهیم، می بایست از دستور زیر استفاده کنیم.
sudo docker run -it --name parsckick_apache -p 8081:80 -v /home/project/infu_project:/var/www/html -d httpd
هر کانتینر ساخته شده دارای نام و id یونیک است که می توان با آن ها به آن کانتینر اشاره کرد.
اگر نیاز دارید موارد بیشتری مانند نتورک را بدانید از لینک زیر استفاده نمایید:
https://docs.docker.com/engine/reference/run
چگونه از حال یک کانتینر با خبر شویم؟
برای دیدن کانتینرهای در حال اجرا از دستور زیر استفاده می کنند:
sudo docker ps
برای دیدین تمامی کانتینر ها از درستور زیر استفاده می کنند:
sudo docker ps -a
برای دیدن id
تمام کانتینر ها از دستور زیر استفاده می کنند:
sudo docker ps -a -q
برای دیدن log یک کانتینر از دستورهای زیر استفاده کنید:
sudo docker logs ID_OR_NAME_OF_A_CONTAINER
یا
sudo docker logs -f ID_OR_NAME_OF_A_CONTAINER
برای دیدن تمامی اطلاعات مربوط به یک کانتینر می بایست از دستور زیر استفاده کرد:
sudo docker inspect ID_OR_NAME_OF_A_CONTAINER
برای استارت یا استاپ کردن یک کانتینر از دستور زیر میتوان استفاده کرد:
sudo docker start ID_OR_NAME_OF_A_CONTAINER
sudo docker stop ID_OR_NAME_OF_A_CONTAINER
و برای ری استارت کردن نیز از دستور زیر استفاده می کنیم:
sudo docker restart ID_OR_NAME_OF_A_CONTAINER
برای فهمیدن از استفاده ریسورس هر کانتینر از دستور زیر استفاده می کنیم:
sudo docker stats ID_OR_NAME_OF_A_CONTAINER
برای بیشتر دانستن در این بخش به لینک زیر مراجعه کنید:
https://docs.docker.com/engine/reference/commandline/ps
چگونه وارد یک کانتینر شویم ؟
برای دسترسی به داخل یک کانتینر می بایست از docker exec
استفاده کرد .
برای مثال می خواهیم بدانیم درون hosts
چه نوشته شده:
Sudo docker exec -d ID_OR_NAME_OF_A_CONTAINER cat /etc/hosts
یا میخواهیم یک فایل را تولید کنیم:
sudo docker exec -d ID_OR_NAME_OF_A_CONTAINER touch /root/haj.infu
برای ورود به آن نیز می بایست یک stdin
و یک tty
داشته باشیم . بنابر این باید از آپشن های -t
و -i
نیز استفاده کنیم .
برای روشن شدن این بحث از دستور زیر استفاده می کنیم.
sudo docker exec -it ID_OR_NAME_OF_A_CONTAINER
برای بیشتر دانستن درباره exec لطفا به لینک زیر سر بزنید:
https://docs.docker.com/engine/reference/commandline/exec
چگونه یک کانتینر را پاک کنیم؟
برای پاک کردن یک کانتینر می بایست از دستور docker rm
استفاده کنید .این دستور کانتینری را پاک می کند که شما با توجه به نام یا id کانتینر به آن اشاره کرده اید.
برای درک این بخش به کامند زیر توجه کنید:
sudo docker rm ID_OR_NAME_OF_A_CONTAINER
این کامند کانتری را پاک می کند که stop است و شما به آن شاره کرده اید. اما اگر کانتیری را می خواهید پاک کنید که start
است از سویج -f
استفاده کنید
sudo docker rm -f ID_OR_NAME_OF_A_CONTAINER
شما می توانید لیستی از کانتیر ها را نیز انتخاب و آن ها را پاک کنید:
sudo docker rm -f ID_OR_NAME_OF_A_CONTAINER_1 ID_OR_NAME_OF_A_CONTAINER_2
برای پاک کردن تمامی کانتینر ها نیز از دستور زیر می توانید استفاده نمایید :
sudo docker rm -f $(docker ps -a -q)
فکر می کنم هر آن چه که لازم بوده تا با مقدمات docker
آشنا شوید را بیان کرده ام . اما از این پس هر سرویسی را که بخواهم راه اندازی کنم ، با مثال داکر نیز بیان خواهم کرد تا شما با آن بشتر آشنا شوید.