هر داکرفایل یک اسکریپت متشکل از دستورات مختلف و آرگومان هایی است که به صورت خودکار عملیاتی روی یک ایمیج پایه برای ایجاد یک ایمیج جدید انجام می دهد . برای سازماندهی همه چیز استفاده می شود و تاحدزیادی به ساده سازی اجرای فرآیندها کمک می کند (ازشروع تا پایان )
داکرفایل ها با تعریف یک ایمیج آغاز می شوند ایمیجی که قراراست نقطه شروع ساخت فرآیندها باشد . با تعقیب متدهای مختلف ، دستورات و آرگومان ها (یا شرایط) منجر به ایجاد یک ایمیج جدید می شوند که برای ساخت کانتینر های داکر بکار می روند .
دایمون داکر با تعریف محتوای داکرفایل ها یک ایمیج می سازد که در ادامه خواهم گفت اما پیش از آن لازم می دانم کمی درمورد سینتکس داکرفایل صحبت کنم .
Syntax یا نحو در برنامه نویسی به معنای یک ساختار برای دستور ، آرگومان ها و هرچیزی که برای ساختن یک برنامه لازم است می باشد ( به عبارتی توابع یا مجموعه ای از دستورالعمل ها )
این ساختارها براساس قوانین واضح و شفاف تعریف می شوند و توسط برنامه نویس دنبال می شوند تا با هرنرم افزار کاربردی کامپیوتر تعامل برقرار کنند . اگر یک اسکریپت ساختار درستی نداشته باشد برنامه کامپیوتر قادر به تجزیه و تحلیل ان نخواهد بود .
داکرفایل ها با نحو ساده و روشنی به کار می روند که باعث می شود کاربران بتوانند ساده و راحت آنها را ایجاد و بکار برند .
دستورات داکرفایل :
درحال حاضر حدود ده ها مجموعه دستورات مختلف از داکرفایل ها وجود دارد که می توان برای ساخت یک ایمیج بکار برد . قبل از اینکه کار با داکرفایل را شروع کنیم بهتر است با هم کمی از این دستورات را بررسی کنیم :
همه این دستورات با توجه به نحو یا سینتکس شان که در ادامه گفته خواهد شد داخل یک فایل متنی لیست خواهند شد و این فایل متنی همان داکرفایل ما را تشکیل می دهد . بااین حال ، برخی از این دستورات می توانند در هرمکانی قرار بگیرند .
ADD
این دستور دو آرگومان دارد : یک منبع و یک مقصد که فایل ها را از منبع به مقصد در خود فایل سیستم کانتینر کپی می کند اگر منبع کپی یک آدرس اینترنتی باشد آن وقت محنویات آدرس دانلود شده و در مقصد مشخص شده قرار خواهد گرفت .
مثال :
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD
دستور CMD بسیار شبیه دستور RUN می تواند برای اجرای یک دستور خاص استفاده شود .بااین حال ، برخلاف آن در طول ساخت ، اجرا نمی شود بلکه زمانی که یک کانتینر ساخته شده است ، بکار می رود . بنابراین باید به عنوان یک دستور پیش فرض یا اولیه در نظر گرفت .
مثال :
# Usage 1: CMD application “argument”, “argument”, ..
CMD “echo” “Hello docker!”
ENTRYPOINT
این دستور برنامه های پیش فرضی که هرزمان یک کانتینر ایجاد می شود استفاده می شوند را تنظیم می کند و برای مثال اگر شما یک برنامه خاص داخل ایمیج نصب کرده باشید و بخواهید این ایمیج را فقط برای اجرای اون برنامه استفاده کنید می توانید آن را با ENTRYPOINT تعریف کنید و هرزمان یک کانتینر از آن کانتینر ایجاد شد برنامه شما هدف آن خواهد بود .
اگر شما ENTRYPOINT را با CMD همراه کنید ، آنوقت می توانید “application” را از CMD حذف و فقط “argument” هایی که به ENTRYPOINT منتقل خواهد شد ر ا در خط دستور قرار دهید.
مثال :
# Usage: ENTRYPOINT application “argument”, “argument”, ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD “Hello docker!”
ENTRYPOINT echo
ENV
دستور ENV برای تنظیم متغیرهای محیطی استفاده می شود . این متغیرها شامل جفت “key= value” هستند که با کانتینر توسط اسکریپت ها و برنامه های مشابه قابل دسترسی هستند . این قابلیت داکر ، انعطاف پذیری زیادی برای اجرای برنامه ها ایجاد می کند .
مثال :
# Usage: ENV key value
ENV SERVER_WORKS 4
XPOSE
این دستور برای تخصیص پورت خاصی برای فعال سازی شبکه بین فرآیند در حال اجرا داخل کانتینر و فضای بیرون بکار می رود .
مثال :
# Usage: EXPOSE [port]
EXPOSE 8080
FROM
این دستور به احتمال زیاد مهم ترین دستور برای داکرفایل هااست . این دستور ایمیج پایه مورد استفاده برای اجرای فرآیند ساخت را مشخص می کند . می تواند هر ایمیجی باشد حتی ایمیجی که شما همین الان ایجاد کرده اید . اگر ایمیجی که FROM تعریف می کند روی هاست داکر نباشد ، آن وقت داکر سعی می کند که آن را پیدا و دانلود کند (از ایندکس ایمیج ها) بنابراین باید اولین دستوری باشد که در داخل داکرفایل اعلان می شود .
مثال :
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
یکی از دستوراتی که می تواند در هرجایی از فایل قرار بگیرد اما بهتر است در ابتدا اعلام شود . این دستور اجرایی نیست و نویسنده ایمیج را مشخص می کند . اما بهتر است بعد از FROM قرار گیرد .
مثال :
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
این دستور مرکزی ترین دستور اجرایی داکرفایل ها است یک دستور را به عنوان آرگومان می گیرد و با اجرای آن فرمی از ایمیج اجرا می شود . بر خلاف CMD ، برای ساخت ایمیج بکار می رود ( تشکیل لایه ای دیگر در بالای قبلی که کامیت شده است )
مثال :
# Usage: RUN [command]
RUN aptitude install -y riak
USER
برای تعیین UID یا نام کاربری ای که کانتینر را براساس ایمیج ساخته شده استفاده می کند .
مثال :
# Usage: USER [UID]
USER 751
VOLUME
دستور VOLUME برای فعال سازی دسترسی از کانتینرتان به یک مسیر روی ماشین میزبان (مثلا نصب آن ) بکار می رود .
# Usage: VOLUME [“/dir_1”, “/dir_2” ..]
VOLUME [“/my_files”]
WORKDIR
شما با استفاده از CDM یک دستور اجرا می کنید . با WORKDIR جاییکه باید این دستور اجرا شود را تعیین می کنید .
مثال :
# Usage: WORKDIR /path
WORKDIR ~/
خب حالا نوبت اون رسیده که ببینیم چطور می شه از یک داکرفایل استفاده کرد . استفاده از داکرفایل ها ساده است مثل اجرای دایمون داکر . خروجی بعد از اجرای اسکریپت ، ID ایمیج جدید داکر است .فرض کنید می خواهید در مسیری که قرار دارید یک ایمیج با استفاده از داکرفایل موجود بسازید اسم داکرفایل هم my_mongodb است دستور اجرای داکر فایل به صورت زیر خواهد بود :
sudo docker build -t my_mongodb .
خب حالا با یک مثال ساده این بخش از داکر را هم به اتمام می رسانیم . می خواهیم یک ایمیج برای نصب MongoDB با استفاده از داکرفایل بسازیم :
سعی می کنیم این مثال ساده رو مرحله به مرحله عنوان کنیم تا در نهایت به فایل نهایی برسیم :
قدم اول : ایجاد یک داکرفایل خالی
با استفاده از یک ادیتور ساده اولین داکرفایل را ایجاد می کنیم :
sudo nano Dockerfile
قدم دوم : تعریف فایل و هدف آن
این بخش اختیاریه اما به نظرمن خیلی کارخوبیه که خودمون رو عادت بدیم اول همه فایل ها یا اسکریپت هایی که ایجاد می کنیم هدفمون رو از ایجادش بنویسیم :
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
قدم سوم : تعیین ایمیج مبنای کار
# Set the base image to Ubuntu
FROM ubuntu
قدم چهارم : تعریف نویسنده
# File Author / Maintainer
MAINTAINER Example FSKarimi
قدم پنجم : آپدیت لیست ریپازیتوری های برنامه
این بخش لازم نیست بااین حال بهتره باشه
# Update the repository sources list
RUN apt-get update
قدم ششم : تعیین آرگومان ها و دستورات لازم برای دانلود MongoDB
################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen’ | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
قدم هفتم : تعیین پورت پیش فرض برای اجرای مانگو
# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD [“–port 27017”]
# Set default container command
ENTRYPOINT usr/bin/mongod
همانطور که می بینید اول با استفاده از دستورEXPOSE پورت پیش فرض را تعیین کردیم سپس با استفاده از CMD این دستور را به کانتینر درحال اجرا معرفی میکنیم و سپس با دستور ENTRYPOINT مسیر اجرای دستور را مشخص کردیم .
قدم هشتم : ذخیره داکرفایل
بعد از اینکه هرچیزی را در جای خودش قرار دادید زمان ذخیره و خروج از داکرفایل است .
قدم نهم: ساخت اولین ایمیج
همانطور که قبلا هم توضیح داده بودم حالا زمان آن رسیده که اولین ایمیج خود را از MongoDB با کمک داکرفایل ایجاد کنیم .
sudo docker build -t my_mongodb .
-t برای تگ زدن به ایمیج استفاده می شود .
قدم دهم : اجرای یک نمونه MongoDB
استفاده از ایمیج ساخته شده ؛ اخرین بخش کار ایجاد یک کانتینر برای اجرای یک نمونه MongoDB است .
sudo docker run -name my_first_mdb_instance -i -t my_mongodb
به جای my_first_mdb_instance ما می توانیم هر اسمی که بخواهیم قرار بدیم اما اگر نامی تعیین نشه بعدا باید با شناسه ها کار کنیم که کار رو خیلی پیچیده تر می کنند .