آیا یک سرور مجازی خریدهاید و تصمیم به نصب داکر روی آن دارید؟ متأسفانه سایت Docker مخازن و Repositoryهای خود رو به روی ایران مسدود کرده و خطای 403 دریافت خواهید کرد. برای گریز از این مشکل و ایجاد امکان نصب Docker، راههای مختلفی وجود دارد که یکی از راحتترین راهها استفاده از “سرویس شکن” است. سایت Docker بر روی یکی از دامنههای زیرمجموعه خود در آدرس https://get.docker.com اسکریپتی قرار داده که همواره آخرین نسخه پایدار Docker را بر روی سیستمعاملهای زیر نصب میکند:
- Centos
- Fedora
- Debian
- Ubuntu
البته که در همان آدرس اسکریپتی برای نصب داکر نسخه تستی خود نیز ارائه کرده است که اصلاً توصیه نمیشود تا نسخه تستی سرویس Docker نصب شود. اگر شما از یکی از این ۴ تا سیستمعامل استفاده میکنید اصلاً نگران نباشید به راحتی میتوانید بر روی سیستمعامل خود اقدام به نصب داکر کنید.
مراحل نصب داکر
اولین قدم برای نصب Docker این است که ابتدا DNS سیستمعامل خود رو به آدرس “سایت شکن” تغییر دهید تا بدون مشکل از Docker Repository بتوانید استفاده کنید. این موضوع برای گریز از تحریم Docker است و اگر خودتون سرویس پروکسی دارید نیازی به این کار نخواهید داشت. البته که اگر سرور شما خارج از ایران باشد نیز نیاز به این کار نخواهد بود.
در ابتدا از کانفیگ قبلی خود پشتیبان تهیه کنید و بعد آدرس جدید رو وارد کنید.
گرفتن پشتیبان از کانفیگ قبلی:
cat /etc/resolv.conf > resolv.conf.old#
تغییر کانفیگ و استفاده از DNS Server جدید برای گریز از تحریم Docker:
echo "nameserver 94.232.174.194" > /etc/resolv.conf#
بعد از این مرحله شما میتوانید به راحتی و بدون مشکل به نصب Docker بپردازید.
برای نصب Docker از آدرس https://get.docker.com/ اسکریپت مربوط به نصب Docker را دانلود کنید و بعد آن اسکریپت را اجرا کنید. دستورات زیر اقدامات لازم برای نصب داکر را انجام خواهند داد.
curl -fsSL get.docker.com -o get-docker.sh#
sh get-docker.sh#
بسته به سرعت اینترنتی که دارید یه زمانی به طول میانجامد و بعد از آن نصب داکر به پایان میرسد. پس از اتمام نصب Docker نسخه نصب شده سرویس Docker را به شما نمایش میدهد. با دستور زیر نیز میتوانید نسخه نصب شده رو مشاهده کنید.
docker version#
سرویس Docker تنها با دسترسی کاربر root راهاندازی و استفاده میشود. برای اینکه از کاربرهای با دسترسی پایینتر برای کار با سرویس Docker استفاده کنید دستور زیر را وارد کنید.
sudo usermod -aG docker your-user#
نکتهی مهم اینکه بعد از اعمال دستور بالا کاربر با سطح دسترسی پایینتر امکان راهاندازی و مدیریت کانتینرها و سرویسهای راهاندازی شده با Docker را خواهد داشت و باید دقت کرد که این امکان فقط برای کاربرهایی فراهم شود که مورد تاًیید هستند. البته این موضوع بصورت کلی در سرورهای عملیاتی مطرح هست. در صفحه زیر در مورد مخاطراتی که ممکن است این تغییر دسترسی ایجاد کند صحبت شده است.
https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
بر روی توزیعهای مبتنی بر deb بعد از نصب Docker راهاندازی میشود اما در سرویسهای مبتی بر rpm نیاز است که سرویس Docker را راهاندازی کنید. برای این کار از دستورات زیر میتوانید استفاده کنید.
systemctl start docker#
systemctl status docker#
با دستور زیر همواره بعد از راهاندازی سیستمعامل سرویس Docker راهاندازی خواهد شد.
systemctl enable docker#
برای بروزرسانی دیگر نیاز به راهاندازی این اسکریپت نیست و Docker Repository داخل سیستمعامل شما قرار داده شده است و با بروزرسانی Docker یا سیستمعامل خود اگر بروزرسانی برای Docker آماده شده باشد آن را نیز دریافت خواهید کرد.
آموزش داکر لینوکس
جهت نصب داکر لینوکس باید:
- در RHEL\CentOS 7.x:
yum install docker#
- در REHL\CentOS 6.x:
ابتدا repository یا مخزن EPEL را نصب نموده:
yum install epel-release#
سپس دستور زیر را اجرا میکنیم:
yum install docker-io#
در RHEL\CentOS 6.x جهت اجرای سرویس docker بصورت زیر عمل میکنیم:
service docker start#
chkconfig docker on#
service docker status#
سپس توسط دستورات زیر سرویس docker را یکبار start و سپس enable نموده تا در پروسههای boot بعدی سیستم/سرور بطور اتوماتیک فعال شود:
systemctl start docker.service#
systemctl enable docker.service#
حال برای اینکه اطمینان حاصل کنید که سرویس dockerتان در حالت اجراست یا خیر، کافیست دستور زیر را اجرا نمایید:
systemctl status docker.service#
جهت مشاهده اطلاعات سیستم/سروری که Docker بر روی آن نصب شده است، از دستور زیر استفاده میکنیم:
docker info#
همچنین جهت مشاهده نسخه Docker نصب شده، میتوان از دستور زیر کمک گرفت:
docker version#
جهت مشاهده لیست همه دستورات Docker از دستور زیر را در کنسول لینوکس خود وارد نمایید:
docker#
در مرحله بعد، جهت دانلود imageهای رسمی و ایجاد یک Container در اینجا قصد دارید Containerی به نام Welcome to the Docker World را دریافت و نصب نماییم. برای این منظور، ابتدا توسط دستور زیر یک centos imaged را دانلود خواهیم کرد:
docker pull centos#
سپس Container مذکور را توسط دستور زیر اجرا میکنیم:
docker run centos /bin/echo "Welcome to the Docker World #
در مرحله بعد توسط دستور زیر یک session به Container مزبور (در اینجا centos) توسط optionهای -i و -t ایجاد خواهیم کرد.
چون در اینجا Container ما یک توزیع از سیستمعامل لینوکس است، بنابراین میتوانید توسط دستور زیر اقدام به مشاهده نام، معماری، نسخه Kernel و… از آن بپردازید:
uname -a#
اگر قصد دارید تا از session ایجاد شده خارج شوید و process مربوطه را finish نمایید، کافیست از دستور زیر استفاده نموده تا به shell سرور لینوکس خود باز گردید:
exit#
همچنین اگر قصد دارید از Container session خود خارج شده اما پروسه مربوط به آن را در background سرور خود نگه دارید میتوانید از کلیدهای ترکیبی Ctrl + p و Ctrl + q استفاده نمایید.
توجه کنید که هر Container دارای یک Container ID است که عددی منحصر بفرد است. جهت مشاهده Container ID برای یک Container در حال اجرا کافیست از دستور زیر استفاده نمایید:
docker ps#
همانطور که در شکل فوق مشاهده میکنید، Container ID مربوط به Containerی به نام centos که من در این مثال سناریو اجرا کرده 64241ed538ed است. همچنین من از عدد 7 در جلوی نام Container خود استفاده کردم که در واقع یک tag است که با یک علامت : یاColon از آن جدا شده است. دلیل استفاده از این tagها این است که ممکن است شما چند Container با یک نام داشته باشید و جهت تمیز دادن آنها از یکدیگر میتوانید از tagها استفاده کنید.
حال در صورتیکه بخواهیم مجدداً به Container خود که در background در حال اجراست connect کرده و متصل شویم، کافیست توسط دستور زیر این کار را انجام دهیم:
docker attach 64241ed538ed#
درنهایت جهت shutdown کردن پروسه مربوط به Container در حال اجرای خود از کنسول Hostتتان کافیست از دستور زیر استفاده نمایید:
docker kill 64241ed538ed#
و برای اینکه اطمینان حاصل کنید عملیات shutdown و Kill کردن پروسه مربوط به Container به درستی صورت گرفته یا خیر، میبایست بار دیگر دستور docker ps را اجرا کنید.
docker ps#
همانطور که در شکل فوق مشاهده میکنید، جدول Containerهای در حال اجرا خالی است و به این معناست که دیگر هیچ Containerی در حال اجرا نیست. در این قسمت آموزش داکر لینوکس به پایان میرسد.
گریز از تحریم Docker با چند روش
متأسفانه گروه docker اجازه استفاده از سرویسهای خود را بر روی برخی از کشورها (از جمله کوبا، سوریه، کره شمالی، سودان، جمهوری کریمه – اکراین) و ایران مسدود کرده است. این موضوع در نصب docker، دانلود imageهای داخل Docker Hub و برخی از دستورات docker که با این سایت ارتباط برقرار میکند مؤثر است و خطایی که در این مواقع نمایش داده میشود همانند شکل زیر است.
شکل زیر خطای docker برای دریافت image که ایران را تحریم کرده است.
راهحل:
نگران نباشید برای رفع این مشکل راههای مختلفی وجود دارد که در ادامه به برخی از آنها اشاره میشود.
- استفاده از VPN
- استفاده از proxy بر روی سرویس docker
- استفاده از Mirror Registry برای دریافت imageها
- استفاده از سرویس شرکت بنیان به نام شکن
در ادامه به توضیح هر یک از این روشها خواهیم پرداخت:
روش اول: استفاده از VPN
در این روش تمام ارتباطات شما به مقصد VPN که در آن تعریف شده است، میرود. استفاده از آن در برخی از موارد سرعت کار کردن و استفاده از اینترنت را کند میکند و در برخی از موارد دیگر هم افزایش سرعت به همراه داد. نکته مهمی که در این باره وجود دارد این است که معمولاً برای استفاده از آن باید یک سرور اختصاصی وجود داشته باشد یا اینکه هزینه استفاده از سرویس VPN را بصورت جداگانه پرداخت کرد. در این روش همواره باید VPN برقرار باشد تا بتوان از سرویس docker استفاده کرد.
روش دوم: استفاده از proxy بر روی سرویس docker
در این روش تنها برای سرویس docker از HTTP Proxy استفاده میشود. در این حالت باید سرویس docker را پیکربندی کرد که برای ارتباط خود از این proxy استفاده کند. این روش نیز نیاز دارد که سرویس HTTP Proxy وجود داشته باشد تا از آن در سرویس docker استفاده کرد. معمولاً برای این سرویسهای proxy باید هزینه پرداخت کرد. نسخههای رایگان آنها نیز توصیه نمیشود زیرا پایداری لازم برای استفاده را ندارند. کانفیگ مد نظر در ادامه قرار داده میشود.
فایلی به نام docker.conf در مسیر زیر ایجاد کنید و در آن خطوط زیر را قرار دهید:
/etc/systemd/system/docker.service.d/docker.conf
[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:port/"
دقت نمایید بسته به تنظیمات مربوط به HTTP Proxy اطلاعات بالا میبایست را تکمیل کنید.
از آنجاییکه کاربران ایرانی نمی توانند بطور مستقیم از docker hub،image ها را دریافت کنند نیاز به استفاده از proxy دارند. برای اینکه docker بتواند ترافیک خود را از proxy ارسال کند نیاز به یکسری تنظیمات است که در ادامه به آنها خواهیم پرداخت.
در ابتدا ما باید یک مسیر به آدرس زیر در سیستم ایجاد میکنیم.
mkdir -p /etc/systemd/system/docker.service.d#
در مرحله بعدی باید فایلی به نام http-proxy.conf در مسیری که در مرحله اول ایجاد کردیم بسازیم.
touch /etc/systemd/system/docker.service.d/http-proxy.conf#
و سپس باید آن را ویرایش کرده و با استفاده از نمونههای زیر تنظیمات مربوط به proxy خود را در آن اعمال کنیم.
[Service]
Environment=”HTTP_PROXY=http://proxy.example.com:80/”
Environment=”HTTPS_PROXY=https://proxy.example.com:443/”
نکته: شما باید نام دامنه یا IP مربوط به proxy را همراه با پورت مخصوص به خود وارد کنید.
در آخرین مرحله از معرفی proxy به docker این فایل را ذخیره کرده و مراحل زیر را اجرا میکنیم تا docker بتوانید از تنظیمات استفاده کند.
ابتدا daemon مربوط به systemctl را ابا استفاده از دستور زیر reload میکنیم:
systemctl daemon-reload#
و در آخر سرویس docker را restart میکنیم:
systemctl restart docker#
همچنین میتوانیم برای تست اینکه آیا کارهایی که انجام دادهایم درست بوده یا خیر دستور زیر را اجرا کنیم:
systemctl show --property=Environment docker#
در صورتیکه خروجی مانند زیر به ما داد کارهایی که انجام دادهایم درست بوده است.
Environment=”HTTP_PROXY=http://proxy.example.com:80/”
Environment=”HTTPS_PROXY=https://proxy.example.com:443/”
روش سوم: استفاده از Mirror Registry
در این روش شما سرویس docker خود را کانفیگ میکنید که imageهای خود را به جای دریافت از registry خود docker که فیلتر است از registryهای دیگر استفاده کرد. نکته مهم اینکه این registryها، imageها را به شما تحویل میدهند و خودش از ریجیستری docker دریافت میکند. در این روش شما هیچ هزینهای نخواهید کرد و موضوع مهمتر اینکه ترافیک شما و دیگر ارتباطات شما به سرورهای دیگر منتقل نمیشود. در ادامه کانفیگهای مربوط به این روش نیز در اختیارتان قرار میگیرد. به عنوان مثال سایت dockerme.ir و سایت docker.ir برای راحتی شما این امکان را با آدرسهای در اختیار قرار داده است.
https://docker.dockerme.ir
http://docker.ir/
Ubuntu 16.04 و Arch Linux
فایلی به نام docker.conf در مسیر زیر ایجاد کنید:
/etc/systemd/system/docker.service.d/docker.conf
و در آن خطوط زیر را قرار دهید:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://docker.dockerme.ir
روش چهارم: استفاده از سرویس شرکت بنیان به نام شکن
شرکت بنیان سرویس ارائه داده است که فیلترشکن است. بر این اساس شما DNS Server خود را به IP این شرکت تغییر میدهید بعد از آن درخواستهای شما برای سرویسهای تحریم شده پاسخ داده میشود.
توضیحات کامل این سرویس در آدرس زیر قرار دارد. شما با این روش نیز میتوانید imageهای docker را بدون مشکل دریافت کنید.
https://shecan.ir
اضافه کردن image برای Container
جهت اضافه کردن image در Docker برای Container بصورت زیر عمل میکنیم:
برای مثال، فرض کنید که قصد داریم imageی جدید به برای httpd به لیست imageهای خود در Dockerمان اضافه نماییم. پیش این کار توسط دستور زیر لیست imageهای موجود در Dockerمان را لیست میکنیم:
docker images#
همانطور که در شکل فوق مشاهده میکنیم، من بر روی سیستم Docker خود سه image لینوکس از نوع توزیع CentOS 7.x را در اختیار دارم. بنابراین توسط دستور زیر یکی از Containerها را که قصد دارم سرویس httpd را بر روی آن نصب نمایم، start نموده و سپس این کار را انجام میدهم:
docker run centos /bin/bash -c "yum -y update; yum -y install httpd"#
حال به منظور اضافه کردن image بصورت زیر عمل میکنیم:
docker commit a0294a053f8c my_image/centos_httpd#
بار دیگر دستور docker images را اجرا کرده تا لیست imageهایمان را مشاهده نماییم:
docker images#
حال توسط دستور زیر Container تولید شده از image جدیدی را که در مرحله قبل ایجاد کردیم اجرا نموده و توسط دستور which اطمینان حاصل میکنیم که سرویس httpd بر روی آن وجود دارد:
docker run my_image/centos_httpd /usr/bin/which httpd#
دسترسی به Container
اگر شما قصد دارید تا به سرویسهایی همچون HTTP و SSH که بر روی Containerها به عنوان یک daemon (سرویس) در حال اجرا میباشند دسترسی پیدا نمایید میبایست به روش زیر عمل کنید:
برای مثال، با استفاده از دستور زیر یک Container که سرویس httpd بر روی آن نصب شده است را start کرده و به Shell session آن متصل میشویم:
docker run -it -p 8081:80 my_image/centos_httpd /bin/bash#
سپس توسط دستور زیر سرویس httpd را در background مربوط به Container خود اجرا نموده:
/usr/sbin/httpd &#
و بعد توسط دستور echo فایلی به نام index.html در مسیر /var/www/html ایجاد کرده و سپس عبارت “httpd on Docker Container” را به فایل مزبور اضافه میکنیم:
echo "httpd on Docker Container" > /var/www/html/index.html#
در نهایت توسط کلیدهای ترکیبی Ctrl + p و Ctrl + q پروسه مربوط به Container خود را در background سرور dockerمان نگه خواهیم داشت و به shell لینوکس باز خواهیم گشت.
اما برای اینکه مطمئن شویم که Containerمان در حال background در اجراست، از دستور زیر استفاده میکنیم:
docker ps#
درنهایت جهت دسترسی به صفحه وب ایجاد شده (منظور index.html) در Containerمان که سرویس httpd بر روی آن در حال اجراست، کافیست در مرورگر کلاینت خود که LANی که Containerمان نیز در آن قرار دارد، آدرس URL زیر را وارد نماییم:
<http://<server-name or IP-address>:<port>/
با فرض اینکه نام سرور من dlp.server.world و پورت در نظر گرفته برای سرویس Apache بر روی آن 8081 ست شده است، بنابراین آدرس URLی که من میبایست به آن متصل شوم بصورت زیر خواهد بود:
http://dlp.server.wolrd:8081/
اجرا و ذخیرهسازی Docker Containerها
در این بخش قصد داریم تا یک سیستمعامل Ubuntu مبتنی بر Docker Container که Nginx Server بر روی آن نصب شده است را اجرا و ذخیرهسازی نماییم. اما پیش از هر تغییراتی در Container مزبور، ابتدا میبایست Container را توسط دستور زیر که سرویس Nginx بر روی Ubuntu image نصب میکند، اجرا کنیم:
docker run ubuntu bash -c "apt-get -y install nginx"#
پس از نصب بسته Nginx، دستور زیر را اجرا کرده تا نام و ID مربوط به Container در حال اجرا را برگرداند:
docker ps -l#
همانطور که در شکل فوق مشاهده میکنید، عبارت 5976ae287 به Container ID و عبارت ubuntu-nginx به نام image جدیدی که با تغییرات تأیید شده ذخیره گشته، اشاره دارد.
در ادامه و پس از ایجاد موفقیتآمیز image جدید، توسط اجرای دستور زیر لیست تمام imageهای ذخیره شده را لیست نمایید:
docker images#
تغییرات در حین پروسه نصب بر روی Container اعمال شده است اما Container مزبور در حالت اجرا نیست (Container مذکور stop شده است). در این مورد دستور docker ps هیچگونه خروجیای را نمایش نخواهد داد چرا که هیچ Container در حالت اجرا (running) نیست. بنابراین هنوز قادیر تا Container ID را توسط دستور docker ps -a | head -3 بدست آورده که باعث میشود Containerهای اخیر در حال اجرا لیست شوند.
همچنین میتوانید به جای این کار توسط دستور docker run -it ubuntu bash نیز وارد Container Session مربوطه شده و سپس دستور apt-get install nginx را اجرا نمایید. در حالیکه دستور در حال اجراست، با استفاده از کلیدهای ترکیبی Ctrl-p + Ctrl-q از Container مزبور detach کرده و Container در این حالت در background حتی پس پایان پروسه از نصب Nginx در حال اجرا باقی خواهد ماند.
docker run -it ubuntu bash#
apt-get install nginx#
سپس میتوانید با استفاده از دستور docker ps، Container ID مربوط به Container در حال اجرا را بدست آورده و در ادامه با اجرای دستور docker attach <Container-ID>، به مجدداً وارد کنسول Container خود شود. درنهایت نیز میتوانید با تایپ دستور exit، Container خود را متوقف (stop) نمایید. به عنوان مثال:
docker ps#
docker attach 3378689f2069
exit#
بنابراین جهت تست، اگر imageی اخیراً تغییراتی داشته است (برای مثال سرویس Nginx نصب شده است)، میتوانید دستور زیر را اجرا نموده تا یک Container جدید تولید شود. اگر خروجی همانند شکل زیر باشد به این معناسب که سرویس Nginx به درستی نصب شده است.
docker run ubuntu-nginx whereis nginx#
همچنین جهت حذف یک Container میتوانید از دستور rm به همراه Container ID یا نام Container خود استفاده نمایید. به عنوان مثال، در اینجا من ابتدا توسط دستور docker ps -a تمام Containerهای در حال اجرا بر روی سیستم/سرور خود را لیست کرده تا Container ID مد نظر خود را بدست آورم و سپس توسط دستور docker rm اقدام به remove کردن آن میکنم:
docker ps -a#
sudo docker rm 36488523933a#
اجرای Nginx داخل Docker Container
در این بخش بر روی این موضوع تمرکز کنیم که چطور شما میتوانید یک سرویس شبکه را اجرا کرده و به آن دسترسی داشته باشید. به عنوان مثال بعد از خرید سرور، یک وب سرور Nginx که در داخل Docker، پیشتر با imageی به نام ubuntu-nginx ایجاد کردیم و سرویس Nginx را بر روی آن نصب نمودیم را در نظر بگیرید.
اولین چیزی که شما نیاز دارید تا ایجاد نمایید، یک Container جدید است و سپس میبایست پورتهای host-container خود را map کرده و بعد توسط دستور زیر وارد shell آن شوید:
docker run -it -p 81:80 ubuntu-nginx /bin/bash#
nginx
&#
در دستور اول option یا گزینه -p باعث map کردن host port به container port میشود. در حالیکه host port میتواند بصورت مستقل و خودسرانه به شرطی که در دسترس باشد (و سرویسهای دیگری بر روی host به آن listen نمیکنند)، container port نیز میبایست دقیقاً به daemon یا سرویس داخلی که در حالت listening است پورت شود.
هنگامیکه شما به Container session خود متصل میشوید، توسط دستور nginx &، daemon یا سرویس Nginx را در background مربوط به Container شما خود اجرا میکنید و با استفاده از کلیدهای ترکیبی Ctrl-p + Ctrl-q میتوانید از کنسول Containerتان detach نمایید.
حال با اجرای دستور docker ps وضعیت Container در حال اجرای خود را مشاهده نمایید. شما همچنین میتوانید socketهای شبکه host خود را توسط دستور netstat -tlpn مشاهده کنید.
docker ps#
یا
netstat -tlpn#
درنهایت جهت مشاهده صفحه وب ارائه شده توسط Nginx Container، یک مرورگر بصورت راهدور در شبکه LAN خود بر روی کلاینتی اجرای نموده و آدرس ماشینتان را توسط پروتکل HTTP بصورت زیر در نوار آدرس آن وارد نمایید.
جهت stop کردن Container در حال اجرا کافیست توسط دستورات زیر ابتدا Container ID یا نام آن را بدست آورده و سپس اقدام به متوقف کردن آن نمایید:
docker ps#
docker stop fervent_massarthy#
docker ps#
همچنین میتوانید به جای روش فوق جهت stop کردن Containerتان، ابتدا وارد container shell command prompt خود شده و سپس دستور exit را تایپ نموده تا پروسه آن پایان یابد.
docker attach fervent_mccarthy#
exit#
استفاده از Docker file
در این بخش قصد داریم تا استفاده از Docker file و ایجاد Docker imageها بصورت خودکار را بررسی نماییم که جهت مدیریت پیکربندیها بسیار مفید خواهد بود. توجه نمایید که فرمت Docker fileها بصورت [INSTRUCTION arguments] است. لیست انواع INSTRUCTIONها در جدول زیر آورده شده است.
جدول 1 لیست انواع INSTRUCTIONها
INSTRUCTION | توضیح |
FROM | جهت تنظیمات Base Image برای subsequent instructionها |
MAINTAINER | جهت تنظیمات Author field برای imageهای تولید شده |
RUN | جهت اجرای هر دستوری زمانیکه Docker image ایجاد شده است. |
CMD | جهت اجرای هر دستوری زمانیکه Docker Container اجرا شده است. |
ENTRYPOINT | جهت اجرای هر دستوری زمانیکه Docker Container اجرا شده است. |
LABEL | جهت اضافه کردن metadata به یک image |
EXPOSE | جهت اطلاع Docker از اینکه Container مزبور در حال listen کردن روی پورتهای شبکه مشخص شده در زمان اجراست. |
ENV | جهت تنظیم کردن environment variable یا متغیر محیطی است. |
ADD | جهت کپی کردن فایلها، دایرکتوریها یا URLهای remote file |
COPY | جهت کپی کردن فایلها یا دایرکتوریها. تفاوت این گزینه با ADD در این است که در COPY امکان مشخص کردن remote URL و همچنین extract کردن خودکار فایلهای آرشیو شده وجود نخواهد داشت. |
VOLUME | جهت ایجاد یک mount point با نام و نشانهای مشخص شده آن به منظور نگهداری از volumeهای mount شده از native host یا Containerهای دیگر |
USER | مجموعهای از user name یا UID |
WORKDIR | مجموعهای از working directory |
حال به عنوان مثال، فرض کنید که در اینجا قصد ایجاد یک Dockerfile جهت نصب سرویس httpd و اضافه کردن فایل index.html و همچنین start کردن سرویس httpd با پورت 80 را داریم. برای این منظور توسط دستور زیر Dockerfile را بوسیله ویرایشگر متنی vi باز کرده:
vi Dockerfile#
و سپس توسط زیر را در آن جهت ایجاد یک Dockerfile جدید وارد نمایید:
FROM centos
MAINTAINER serverworld <[email protected]>
RUN yum -y install httpd
RUN echo "Hello DockerFile" > /var/www/html/index.html
EXPOSE 80
CMD ["-D", "FOREGROUND"]
ENTRYPOINT ["/usr/sbin/httpd"]
در آخر فایل مزبور را ذخیره کرده و از آن خارج شوید. سپس توسط دستور زیر اقدام به ایجاد (build کردن) imageی به نام web_server و tagی به نام lastest در مسیر جاری میکنیم:
docker build -t web_server:lasest #
حال اگر دستور docker images را اجرا کنید، image ایجاد شده را در لیست imageهای Dockerتان مشاهده خواهید نمود:
docker images#
در ادامه جهت اجرای Container ایجاد شده در background بصورت زیر عمل میکنیم:
docker run -d -p 80:80 web_server#
docker ps#
curl http://localhost/#
نحوه نوشتن dockerfile
در این بخش قصد داریم در مورد نحوه نوشتن docker file صحبت کنیم و اینکه چطور میتوان یک docker file نوشت و از روی آن image آماده کرد.
ابتدا چند نکته مهم:
- docker file بهترین روش برای آماده کردن image است.
- docker file یک فایل متنی است که تمام مراحل آمادهسازی image داخل آن قرار داده میشود.
- با استفاده از docker file میتوان فرآیند ایجاد image را بصورت خودکار انجام داد.
- کار با docker file بسیار ساده است و به راحتی میتوان با استفاده از آن imageهای مورد نیاز را آماده کرد.
- با استفاده از دستور docker build میتوان از روی docker file یک docker image آماده کرد.
- فرقی نمیکند که syntaxهای docker file را با حروف بزرگ بنویسید و یا کوچک اما بهتر است که UPPERCASE باشد تا با مابقی موارد docker file تفکیک شود. یعنی اینکه docker file اصطلاحاً case-sensitive نیست.
- حتماً برای editor خودتان Add-on لازم را نصب کنید که syntaxهای مربوط به docker file را برای شما highlighting کند تا کار با آن سادهتر باشد. بسته به editor مورد استفاده شما روشهای مختلفی وجود دارد.
- اگر از docker file استفاده کنید به خوبی میتوانید Version Tracking را رعایت کنید و تمام نسخ imageهای خود را داشته باشید و هر زمان که لازم بود به یکی از آنها رجوع کنید.
- با استفاده از # میتوان در docker file کامنت قرار داد.
- با استفاده از دستور docker history میتوان تمام اقدامات انجام شده بر روی image را مشاهده کنید. در اصل تمام مراحل dockerfile را میتوانید مشاهده کنید.
دستورالعملهای dockerfile
قبل از تکمیل آموزش نصب داکر به دستورهای dockerfile به اختصار اشاره کردیم. در ادامه دستورالعملهای (Syntax) مربوط dockerfile توضیح داده میشود.
- دستورالعمل FROM
همواره یک dockerfile با FROM آغاز میشود. تنها دستورالعملی که میتواند جلوتر از FROM باشد ARG است که در ادامه توضیح داده خواهد شد. با استفاده از FROM میتوان Base Image را مشخص کرد که مابقی موارد بر روی اون image انجام خواهد شد. میتوان چند تا FROM در یک dockerfile داشت و از همه آنها به عنوان Base Image استفاده میکند. به مثال زیر توجه کنید.
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
همانطور که مشاهده میکنید از دو base image استفاده شده است و تنها دستورالعملی که قبل FROM قرار گرفته است، ARG است.
- دستورالعمل RUN
همان دستورالعملهای اجرای داخل shell Linux و یا cmd windows هستند. با هر RUN یک لایه image بر روی base image ایجاد میشود و در انتهای آن commit انجام میشود و یک لایه جدید شامل تمام تغییرات و موارد اجرایی دستور RUN ایجاد میشود.
میتوان در دستور RUN مشخص کرد که از چه shell استفاده نماید. هر لایهای که ایجاد خواهد شد همواره cache میشود تا کلاً فرآیند build با سرعت بیشتری پیش برود. اگر نیاز بود که بدونcache کردن این فرآیند انجام شود میتوانید از آپشن –no-cache استفاده نمایید. اگر image شما ۱۰ لایه باشد و در ساختن آن در لایه ۹ اختلالی ایجاد شود با استفاده از cache، ۸ لایه قبلی مجدد ساخته نمیشود و این موضوع در سرعت ساختن image اهمیت فراوانی خواهد داشت.
- دستورالعمل CMD
این دستورالعمل دارای ۳ فرم استفاده است.
- فرم اول:دستورالعمل اجرایی به همراه پارامتر اول و پارامتر دوم که این روش بهترین نوع CMD است.
- فرم دوم:پارامتر اول و پارامتر دوم که فقط پارامترها را ایجاد میکند.
- فرم سوم:دستورات command line استفاده شود به همراه پارامتر اول و پارامتر دوم که به صورت خط فرمان است.
شما میتوانید یک CMD در dockerfile خود داشته باشید اما اگر بیش از آن داشته باشید تنها آخرین CMD اجرا خواهد شد. هدف اصلی CMD این است که دستورالعمل اجرایی پیشفرض container را ایجاد کند. اگر این موضوع انجام نشود میبایست با استفاده از ENTRYPOINT دستورالعمل اجرایی container را ایجاد نمایید.
دقت کنید که CMD را با RUN اشتباه نکنید. RUN دستورات اجرایی را داخل image انجام داده و نتایج آن را commit میکند اما دستورات CMD حین ساخت image انجام نمیشود و در زمان راهاندازی image و استفاده از آن به عنوان container انجام میگردد.
- دستورالعمل LABEL
با استفاده از این دستورالعمل metadata به image اضافه میکنند. یعنی به image اطلاعات اضافه میکنند. هر label بصورت key-value است. با استفاده از دستور docker inspect میتوان labelهای یک image را مشاهده کرد.
به چند مثال توجه کنید.
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \that label-values can span multiple lines."
- دستورالعمل MAINTAINER
استفاده از این دستورالعمل دیگر منسوخ شده است اما مورد استفاده از آن این بود که نویسنده dockerfile یعنی کسی که آن را آماده کرده است را مشخص نماید. در نسخههای جدید از label برای مشخص کردن نویسنده dockerfile استفاده میکنند. در مثال زیر label مربوط به نویسنده dockerfile آورده شده است.
LABEL maintainer="docker.com <<[email protected]>>"
- دستورالعمل EXPOSE
با استفاده از این دستورالعمل container در زمان اجرای خود این پورت شبکه را listen میکند. میتوانید TCP و یا UDP بودن آن را نیز مشخص نمایید. expose کردن یک پورت در container به منزله Publish کردن آن ناست. به صورت زیر میتوان پورتها را در dockerfile، expose کرد. برای Publish کردن نیاز است که شما container را اجرا کرده و با آپشن -p پورت آن را publish کنید.
EXPOSE 80/tcp
EXPOSE 80/udp
- دستورالعمل ENV
با این دستورالعمل میتوان در dockerfile، environment variables تعریف کرد و هر زمان که نیاز بود از آن در dockerfile استفاده کرد. به اینصورتvariable_name$ یا {variable_name}$ میتوان از آن استفاده کرد. متغیرها بصورت key-value تنظیم میشوند. میتوان بصورت یک env در هر خط آنها را تعریف کرد یا اینکه در یک خط تمام key-valueهای مورد نیاز را تعریف کرد. به مثال زیر توجه کنید.
نیاز است تا ۳ عدد متغیر در داکرفایل تعریف کنیم. میتوانیم در یک ENV آنها را بنویسیم.
ENV myName="Meysam Nazemi" myDog=Rex\ The\ Dog \
myCat=fluffy
یا به صورت ۳ تا ENV آنها را تعریف کنیم.
ENV myName Meysam Nazemi
ENV myDog Rex The Dog
ENV myCat fluffy
- دستورالعمل ADD
با استفاده از این option میتوان فایل و یا دایرکتوری رو از روی host یا بصورت URL از یک لینک به image خود اضافه کرد. pattern استفاده از آن بصورت زیر است.
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
آپشن[–chown=<user>:<group>] تنها برای containerهای Linux قابل استفاده است و برای Windows این option کار نمیکند. از این option میتوان به خوبی برای مشخص کردن سطح دستور کاربر و گروه به فایل استفاده کرد. اگر کاربر و گروهی را که انتخاب میکنید داخل container و در مسیرهای /etc/passwd و /etc/group نباشد فرآیند ساخت image خطا داده و متوقف میشود.
اگر از URL استفاده میکنید که نیاز به Authentication دارد میبایست از RUN به همراه wget و یا curl استفاده کنید که بتوانید کاربر و پسورد آن را وارد کنید. اما اگر بدون Authentication است میتوانید از دستورالعمل ADD استفاده کنید.
اگر در مقصد دایرکتوری که فایل به آن منتقل میشود وجود نداشته باشد آن فایل را در مقصد ایجاد میکند. با استفاده از ADD میتوان فایلهای فشرده tar را نیز منتقل کرد.
- دستورالعمل COPY
این دستورالعمل همانند دستورالعمل ADD است با این تفاوت که نمیتواند از URL دریافت کند و بعد اینکه tar را پشتیبانی نمیکند اما معمولاً برای جابجایی فایل و دایرکتوری از host به image از این دستورالعمل استفاده میکنند.
- دستورالعمل ENTRYPOINT
با استفاده از این دستورالعمل میتوان فایل اجرایی و یا همان پروسه لازم را در container اجرا کرد. نکته مهم اینکه در زمان راهاندازی container با دستور run میتوان entrypoint داخل image را نیز با option مخصوص آن override کرد. با استفاده از entrypoint میتوان یک پروسه را در foreground کانتینر اجرا کرد و اون پروسه باعث میشود که container، run بماند و عملکرد خود را انجام دهد.
معمولاً برای entrypoint یک اسکریپت آماده میکنند که تمام موارد مد نظر را در container انجام میدهد. با استفاده از entrypoint پروسهها بصورت pid 1 راهاندازی میشوند که این موضوع در برخی از سرویسها اهمیت فراوانی دارد.
- دستورالعملهای CMD و ENTRYPOINT
درباره این دستورالعملها موارد زیر را در نظر داشته باشید:
- هر دوی این دستورالعملها برای اجرا کردن یک کامند یا پروسه در هنگام run شدن container هستند.
- در dockerfile باید مشخص شود که CMD و یا ENTRYPOINT چه چیزی باشد.
- همواره ENTRYPOINT باید به صورت اجرایی در داخل container معرفی شود.
- معمولاً از CMD به عنوان راهی برای مشخص کرد ورودی لازم برای دستور اجرایی ENTRYPOINT داخل container استفاده میشود.
- معمولاً CMD با ورودیهای container در حال کار جایگزاری خواهد شد.
گاهی پیش میآید که این موضوع باعث اشتباه کاربران میشود از این رو توجه شما رو به جدول زیر جلب میکنم.
یک نکته مهم دیگه اینکه اگر CMD داخل base image تنظیم شده باشد ENTRYPOINT مقدار آن را خالی میکند در این سناریو CMD در image فعلی دارای مقدار خواهد شد.
- دستورالعمل VOLUME
Volume یک نقطه اتصال با نام مشخص در dockerfile ایجاد میکند. این مقدار میتواند بصورت JSON یا بصورت String باشد. چند نکته مهم:
- volume در Containerهای windows-based یکی از دو مسیر غیر از درایور C و یا اینکه فایل وجود نداشته باشد و یا کلاً خالی باشد انجام میشود.
- اگر تغییری در داخل dockerfile و volume آن بعد از ساختن image اتفاق بیافتد آن تغییر از دست میرود.
- به دلیل امکان قابل حمل بودن imageها، volume قسمت host داخل dockerfile کانفیگ نمیشود. زیرا image در hostهای مختلف میبایست اجرا شود از این رو این قسمت به ازای هر host بر روی آن پیکربندی میشود.
- دستورالعمل USER
با استفاده از این دستورالعمل میتوان برای image خود در زمان اجرا User یا UID و بصورت اختیاری Group یا GID تنظیم کرد. این موضوع در containerهایی که base آنها ویندوز است متفاوت بوده و با دستور net user میتوانند کاربر داخل image را مشخص کنند.
- دستورالعمل WORKDIR
با این دستورالعمل میتوان دایرکتوری که تمام دستورات بعدی در آن run میشود را مشخص کرد. در ضمن بعد از راهاندازی container همواره پروسه جاری در همان مسیر WORKDIR اجرا خواهد شد. از این دستورالعمل میتوان به دفعات در dockerfile استفاده کرد. این دستورالعمل میتواند از متغیرهای محلی نیز استفاده کند. به مثال زیر توجه کنید.
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
پاسخ این مثال /path/$DIRNAME است.
- دستورالعمل ARG
از این دستورالعمل برای پاس دادن متغیر در زمان ساختن image استفاده میشود. برای استفاده از آن باید از آپشن–built-arg <varname>=<value> در زمان ساختن image استفاده کرد. اگر در زمان ساخت image متغییر برای آن در نظر گرفته نشود این موضوع را تحت یک اخطار اطلاعرسانی میکند البته این متغیر میتواند همواره یک مقدار پیشفرض نیز داشته باشد. اگر در زمان ساخت image مقدار متغیر در نظر گرفته نشود از مقدار پیشفرض که در dockerfile وجود دارد استفاده میکند. معمولاً متغیرهایی که با دستورالعمل ENV ایجاد میشوند دستورالعملهای ARG را جایگذاری میکنند. docker بصورت پیشفرض یکسری متغییرهای ARG از پیش تعریف شده دارد که شما بدون معرفی آنها توسط ARG میتوانید در dockerfile از آنها استفاده کنید.
- HTTP_PROXY
- http_proxy
- HTTPS_PROXY
- https_proxy
- FTP_PROXY
- ftp_proxy
- NO_PROXY
- no_proxy
- دستورالعمل ONBUILD
برای زمانی استفاده میشود که بخواهیم از این image به عنوان پایه imageهای دیگه استفاده کنیم و موارد آن در زمانیکه به عنوان base image استفاده میشود فعال میگردد.
- دستورالعمل STOPSIGNAL
با استفاده از این دستورالعمل میتوان سیگنال خروج container را مشخص کرد.
- دستورالعمل HEALTHCHECK
با استفاده از این دستورالعمل به docker میگوییم که چطور این container را تست کند. docker در یک حلقه بینهایت container را مدام تست و بررسی میکند. بعد از فعال کردن این دستورالعمل در container، ۳ حالت خواهد داشت. حالت اول که ابتدای راهاندازی container است بصورت starting است و بعد از راهاندازی آن را بررسی میکند که اگر ok بود آن را healthy و اگر نتیجه بررسی درست نبود آن را unhealthy قرار میدهد. برای اینکه از این قابلیت در image خود استفاده کنید نیاز است که برخی از کانفیگها انجام شود.
- –interval=DURATION (default: 30s)
- –timeout=DURATION (default: 30s)
- –start-period=DURATION (default: 0s)
- –retries=N (default: 3)
بعد از راهاندازی container و گذشت اولین بازه زمانی پروسه health check انجام میشود. اگر در بازه زمانی تست انجام شد و زمان timeout گذشت نتیجه تست fail میشود و حالت container به unhealthy تغییر میکند.
- دستورالعمل SHELL
با استفاده از این دستورالعمل می توان SHELL پیشفرض را تغییر داد. shell پیشفرض برای لینوکس [“bin/sh”, “-c/”] و برای ویندوز [“cmd”, “/S”, “/C”] است. میتوان از shellهایی مانند: zsh، cshو powershellو موارد دیگر استفاده کرد.
فایل .dockerignore
همانند gitignore برای dockerfile عمل میکند و مواردیکه در دایرکتوری dockerfile است اما در dockerfile مورد استفاده قرار نمیگیرد را در آن لیست میکنند. همواره باید در root دایرکتوری خود dockerfile قرار داشته باشد. داخل این فایل با استفاده از خط جدید جداسازی صورت میگیرد. در ادامه یک نمونه dockerignore را مشاهده میکنید.
# comment
*/temp*
*/*/temp*
temp?
طی مثال بالا برای هر خط این موارد انجام میشود.
- خط ۱:این خط بصورت کامل نادیده گرفته خواهد شد.
- خط ۲:کلا هر دایرکتوری و یا فایلی که داخل اسم آن temp باشد نادیده گرفته میشود. مثلاً txt و یا دایرکتوریهای که نام آنها با temp شروع شود نادیده گرفته میشود. این موضوع فقط در دایرکتوری اصلی و یک subdirectory آن اعمال میشود.
- خط ۳:همانند خط ۲ اما در دو مرحله subdirectory آن این کار را انجام میدهد.
- خط ۴:در دایرکتوری اصلی هر فایل و یا دایرکتوری که با temp و یک حرف اضافهتر آن باشد را نادیده میگیرد. به عنوان مثال tempt و یا tempd را نادیده میگیرد.
نکته: هر زمان که خواستید از imageی استفاده کنید، حتماً قبلش dockerfile آن را با دقت مطالعه کرده و اگر مشکل خاصی در dockerfile وجود نداشت از روی آن image خود را بسازید و از آن استفاده نمایید.
مدیریت دیتاها در Docker
در این بخش میخواهیم در مورد موضوع بسیار مهم نگهداری و حفظ دیتا در containerهای docker صحبت کنیم. این نکته اهمیت دارد که هیچگاه نباید دیتای با اهمیت در داخل container وجود داشته باشد. اگر کانفیگ یا دیتای مهمی وجود دارد باید همواره یا در image قرار داشته باشد یا بصورت کامل از داخل container بر روی host یا بر روی storage قابل اعتمادی نگهداری شود.
برای نگهداری دادههای داخل یک container معمولاً از ۳ روش استفاده میکنند:
- روش Volumes:در این روش با استفاده از volume اطلاعات داخل container بر روی host و یا بر روی یک storage دیگری ذخیره میشود البته این امکان نیز وجود دارد که این اطلاعات و یا کانفیگها از روی container دیگری فراخوانی و یا در آن ذخیره شود. بر روی سیستمعامل لینوکس وقتی از درایور local استفاده شود اطلاعات بصورت پیشفرض در مسیر /var/lib/docker/volumes قرار میگیرد. البته این مسیر بصورت پیشفرض است و شما در هنگام نصب و یا بعد از آن میتوانید آن را تغییر دهید.
- روش Bind mounts:با استفاده از این روش دادههای داخل یک container بر روی دایرکتوریهای سیستم host قرار داده و این اطلاعات بر روی سیستم host نگهداری میشود و هر زمان که برای container مشکل پیش بیاید این دادهها بر روی host باقی خواهند ماند.
- روش tmpfs mounts:در این روش اطلاعات بر روی RAM سیستم host قرار داده میشود و با استفاده از این روش نمیتوان بر روی فایلسیستم host اطلاعات را نگهداری کرد.
در ادامه در مورد هر کدام از روشهای بالا توضیحات کاملتری داده میشود:
روش Volume
در این روش با استفاده از دستور مدیریتی docker volume میتوان volume ایجاد کرده و دیتای container را در آن قرار داد. با استفاده از روش Volume، volumeی که ایجاد شده است داخل Container، mount میشود. این روش بسیار ساده بوده و استفاده از آن خیلی مرسوم است. با استفاده از این روش میتوان یک volume را داخل چند تا container نیز استفاده کرد. container و volume بصورت جداگانه مدیریت میشوند و اگر container پاک و یا از کار بیافتد volume بصورت خودکار تغییری نمیکند و پابرجا خواهد بود. در صورتیکه نیاز داشتید volume را پاک کنید میتوانید از دستور مربوط به آن استفاده کنید. همواره باید برای volumeها یک نام انتخاب کنید که اگر این کار در زمان ایجاد volume انجام نشود خود سرویس docker یک اسم random برای آن انتخاب میکند.
درایورهای مختلف برای Volume
درایورهای مختلفی برای docker volume وجود دارد که بصورت پیشفرض درایور local همراه سرویس docker نصب میشود. با استفاده از این درایور volumeها بر روی سیستم host ایجاد میشوند و بصورت پیشفرض در مسیر /var/lib/docker/volumes قرار میگیرند. سرویس docker درایورهای متعددی را پشتیبانی میکند که میتوان به درایور مخصوص مجازیسازی پر قدرت VMware و یا درایور مربوط به سایت DigitalOcean اشاره کرد. تمام این موارد تحت عنوان پلاگینهای docker بررسی و بصورت کامل توضیح داده خواهد شد.
https://github.com/vmware/vsphere-storage-for-docker
https://github.com/omallo/docker-volume-plugin-dostorage
برخی از موارد استفاده Volume
- با استفاده از docker volume یک بار میتوان volume را ایجاد کرد و بارها از آن در containerهای مختلف استفاده کرد. بصورت مستقل از containerها مدیریت میشود و اینکه میتواند بصورت فقط خواندنی (read-only) و یا بصورت خواندن و نوشتن (read/write) در containerهای متعددی mount شود.
- با استفاده از پلاگینهای متعدد volume میتوان اطلاعات داخل container را بر روی خود host و یا hostهای دیگر و storageهای دیگر ذخیره کرد و این امکان به راحتی میسر میشود.
- به راحتی میتوان از volumeهای ایجاد شده در host پشتیبان تهیه کرد. بهتر است برای این کار containerی که از آن volume استفاده میکند را متوقف و سپس پشتیبان لازم از دایرکتوری volume مد نظر تهیه کرد.
- به راحتی و با استفاده از دستور مدیریتی docker volume میتوان آنها را مدیریت کرد.
- volume در سیستمعاملهای ویندوز و لینوکس کار میکند. نکته مهم اینکه برخی از قابلیتها تنها بر روی سیستمعامل لینوکس کارایی دارند.
- volume بهترین و سادهترین روش برای نگهداری دادههای containerها است.
- اشتراکگذاری دیتا بین چندین container در حال اجرا: یک volume به راحتی میتواند به چندین container در حال اجرا mount شود. همچنین در هنگام mount کردن در صورت نیاز میتوانید از optionهای مربوط به read-only نیز استفاده کنید.
توجه: volumeها تنها زمانی پاک میشوند که شما آنها را بصورت صریح پاک کنید.
- جدا کردن تنظیمات فایل سیستم host از Docker runtime: ممکن است شما به دلیل سناریویای که در نظر گرفتهاید نیاز داشته باشید تا فایل سیستم containerها با فایل سیستم host تفاوت داشته باشد. جدا کردن و استفاده از فایل سیستم یکسان در تمام hostها این امکان را به شما میدهد که بدون نگرانی از یکسان نبودن نوع فایل سیستم hostها به مدیریت دیتای آنها بپردازید.
- ذخیره دیتای containerها در محل دیگر: شما میتوانید دیتای volumeها را روی storageهای دیگر و یا برخی از سرویس دهندگان ابری نیز ذخیره کنید.
- نسخه پشتیبان، بازیابی و مهاجرت دیتا: زمانیکه بخواهید از دیتاهای موجود backup تهیه و یا backupهای قبلی را بازگردانی کنید، volumeها بهترین گزینه هستند. به راحتی containerها را stop کنید و دیتا را منتقل نمایید.
روش Bind mounts
این روش از روزهای ابتدایی ارائه docker برقرار بوده است. در این روش یک دایرکتوری host داخل container، mount میشود. نیازی نیست که دایرکتوری داخل host وجود داشته باشد بعد از راهاندازی container اگر وجود نداشته باشد این دایرکتوری توسط سرویس docker ایجاد میشود. این روش به شدت ساده و دم دستی است و محدودیتهای زیادی دارد. این روش دارای دستور مدیریتی نیست و کلاً توسط خط فرمان docker مدیریت نمیشود. این روش به docker host وابسته و محدود به امکانات آن است. بیشتر از این روش برای مواردیکه یکسری کانفیگ فایل بین host و container به اشتراک گذاشته شده است استفاده میشود. به عنوان مثال برای به اشتراک گذاشتن کانفیگ مربوط به DNS بین host و container استفاده میشود. این روش در محیطهای غیر عملیاتی و برای توسعه سریع و آزمایشگاهی بسیار کاربرد دارد.
به صورت پیشفرض تمام فایلها داخل یک container درون لایه writable همان container ایجاد و نگهداری میشوند که باعث ایجاد دو اشکال بزرگ است:
- وجود دیتا به وجود container وابسته است و با پاک شدن آن اطلاعات نیز پاک میشود.
- لایه writable بسیار به host که container روی آن قرار دارد وابسته است.
docker برای نگهداری اصلاعات روی هاست دو گزینه دارد: Volume و Bind mount. اگر docker روی host لینوکسی اجرا شود شما به گزینه tmpfs نیز دسترسی دارید.
به صورت پیشفرض در هنگام نصب Volumeها در دیسک local در مسیر در دسترس هستند:
/var/lib/docker/volumes
این مسیر قابل تغییر بوده و با توجه به نیاز شما میتواند در مسیر دیگر یا روی یک Storage دیگر قرار گیرد. نکته مهم این است که در این قسمت از فایل سیستم Non-Docker processes نباید تغییری ایجاد کنند.
در روش Bind mount، مسیر یک فایل یا دایرکتوری را به یک مسیر روی docker host، mount کرده و میتوان به راحتی فایلها را با Non-Docker processesها تغییر داد.
توجه: روش tmpfs، اطلاعات را روی حافظه RAM از هاست docker قرار میدهد و روی فایل سیستم هاست چیزی نوشته نمیشود.
موارد استفاده از Bind mount
- اشتراکگذاری Config fileها
برای به اشتراکگذاری config fileها بین host و container بهترین روش استفاده از Bind Mount است. بصورت پیشفرض docker برای انجام تنظیمات مربوط به DNS فایل /etc/resolv.conf را از Docker Host به containerها mount میکند.
- محیطهای توسعه نرمافزار و Auto Buildها
در محیطهای توسعه نرمافزار برای نگهداری source codeها و ایجاد buildها بهترین گزینه استفاده از Bind mount است. با استفاده از Bind mount دیگر نیاز نیست با هر بار ساخت container فایلها را به داخل آنها کپی کنید.
- دسترسی به فایل سیستم Host و Socket
ممکن است شما در بعضی containerها نیاز به دسترسی به فایل یا دایرکتوری روی host داشته باشید و یا برای بعضی از container نیاز به استفاده از socketهای خاصی داشته باشید در این حالت Bind mount بهترین گزینه خواهد بود.
موارد استفاده از tmpfs
- ذخیره موقت اطلاعات با سرعت بالا
بعضی برنامهها نیاز دارند تا در زمان کوتاهی دیتای قابل توجهی را ایجاد و پردازش کرده و سپس اطلاعات را در محل دیگر ذخیره کنند. برای جلوگیری از افت Performance اینگونه نرمافزارها باید از tmpfs استفاده کرد. در tmpfs دیتا بصورت موقت و روی Memory سرور قرار میگیرند.
آنچه در این مطلب مطالعه کردید در خصوص چگونگی نصب داکر بود؛ همچنین آموزش داکر لینوکس در این مطلب به طور کامل مطرح شد. اگر هنوز در خصوص نصب Docker سوالی دارید که در این مطلب به آن پاسخ داده نشده است، آن را در بخش نظرات مطرح کنید تا اسرع وقت به آن پاسخ دهیم.