از زمان معرفی Docker، توسعهدهندگان و مدیران سیستم به دنبال راههایی برای سادهتر و کارآمدتر کردن مدیریت برنامهها و سرویسهای خود بودهاند. Docker یکی از ابزارهایی است که به شما این امکان را میدهد که برنامهها و توابع خود را در یک محیط کاملاً مستقل و قابل حمل اجرا کنید. یکی از اصول مهم در Docker، استفاده از Dockerfiles است. در این مقاله، به بررسی اصول Docker و نحوه استفاده از Dockerfiles میپردازیم.
من با استفاده از آخرین تصویر اوبونتو نشان میدهم، آن تصویر را بهروزرسانی و ارتقا میدهم و سپس بسته build-ssential
را نصب میکنم. این یک Dockerfile نسبتاً ابتدایی خواهد بود، اما می توانید به راحتی بر اساس آن بسازید.
با استفاده از یک تصویر داکر، نه تنها امکان استقرار یک کانتینر پس از دیگری وجود دارد، بلکه بسیار آسان است. هنگامی که تصویر را از یک رجیستری (مانند Docker Hub) بیرون کشیدید، هر کانتینر میتواند با یک دستور docker منفرد مستقر شود. اما چه اتفاقی میافتد وقتی متوجه میشوید که مجبور هستید چندین کانتینر (هر کدام برای هدفی متفاوت) را از یک تصویر مستقر کنید؟ ناگهان مدیریت آن ظروف ممکن است کمی دست و پا گیر شود.
مثلاً بگویید آخرین تصویر اوبونتو را برای توسعه down می کنید. قبل از اینکه بتوانید با آن کانتینر توسعه دهید، تعدادی اصلاح وجود دارد که می خواهید در تصویر ایجاد کنید (مانند ارتقاء نرم افزار و افزودن بسته های توسعه لازم برای کار در دست).
برای این کار، میتوانید هر تصویر را در صورت نیاز به صورت دستی ویرایش کنید (ایجاد یک تصویر جدید برای هر تغییر ضروری در موضوع)، یا میتوانید یک Dockerfile برای هر تغییر بسازید. هنگامی که Dockerfile خود را ساخته اید، می توانید به سرعت همان تصویر را بارها و بارها بسازید، بدون اینکه نیازی به صرف زمان برای انجام آن به صورت دستی داشته باشید. Dockerfiles با دقت ساخته شده می تواند در زمان و تلاش شما صرفه جویی کند.
Dockerfile چیست؟
یک Dockerfile یک فایل متنی است که دستورات لازم برای ساخت یک تصویر Docker از برنامه شما را تعیین میکند. این فایل شامل دستوراتی مانند مراحل نصب، تنظیمات محیطی و تعریف وابستگیها است. این اصول اساسی در ساخت تصاویر Docker است.
اصول Dockerfile
قبل از اینکه Dockerfile خود را بسازیم، باید بفهمید چه چیزی فایل را تشکیل می دهد. این یک فایل متنی به نام Dockerfile خواهد بود که شامل کلمات کلیدی خاصی است که نحوه ساخت یک تصویر خاص را دیکته می کند. کلمات کلیدی خاصی که می توانید در یک فایل استفاده کنید عبارتند از:
ADD فایل ها را از یک منبع روی میزبان در سیستم فایل خود کانتینر در مقصد تعیین شده کپی می کند.
CMD می تواند برای اجرای یک دستور خاص در داخل کانتینر استفاده کرد.
ENTRYPOINT یک برنامه پیش فرض را تنظیم می کند تا هر بار که یک کانتینر با تصویر ایجاد می شود استفاده شود.
ENV متغیرهای محیطی را تنظیم می کند.
EXPOSE یک پورت خاص را برای فعال کردن شبکه بین کانتینر و دنیای خارج مرتبط می کند.
FROM تصویر پایه مورد استفاده برای شروع فرآیند ساخت را تعریف می کند.
MAINTAINER نام کامل و آدرس ایمیل سازنده تصویر را تعریف می کند.
RUN دستورالعمل اجرایی مرکزی برای Dockerfiles است.
USER UID (یا نام کاربری) را که قرار است کانتینر را اجرا کند، تنظیم می کند.
VOLUME برای فعال کردن دسترسی از کانتینر به دایرکتوری در دستگاه میزبان استفاده می شود.
WORKDIR مسیری را تعیین میکند که دستوری که با CMD تعریف شده است، اجرا شود.
LABEL به شما امکان می دهد یک برچسب به تصویر داکر خود اضافه کنید.
همه کلمات کلیدی برای عملکرد Dockerfile لازم نیستند. در مورد، مثال ما فقط از FROM
، MAINTAINER
و RUN
استفاده می کند.
ساخت Dockerfile
قبل از ایجاد Dockerfile، باید یک دایرکتوری جدید ایجاد کنیم تا بتوانیم از آن کار کنیم. دایرکتوری dockerbuild
را با دستور زیر ایجاد می کنیم:
mkdir ~/dockerbuild
با دستور زیر به دایرکتوری تازه ایجاد شده بروید:
cd ~/dockerbuild
اکنون ما Dockerfile خود را ایجاد می کنیم. فایل جدید را با دستور زیر ایجاد کنید:
nano Dockerfile
در آن فایل، موارد زیر را قرار دهید:
FROM ubuntu:latest
MAINTAINER NAME EMAIL
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y build-essential
Where NAME is your full name and EMAIL is your email address.
آن فایل را ذخیره و ببندید.
ساختن تصویر شما
با تکمیل Dockerfile، اکنون می توانید تصویر را از آن فایل بسازید. دستور را (از داخل دایرکتوری dockerbuild/~) صادر کنید:
docker build -t "NAME:Dockerfile" .
جایی که NAME
نام تصویر جدیدی است که باید ایجاد شود.
به عنوان مثال: فرض کنید می خواهید تصاویری برای توسعه وب، توسعه برنامه و توسعه امنیت ایجاد کنید. می توانید دستورات زیر را وارد کنید:
docker build -t "appdev:Dockerfile" .
docker build -t "webdev:Dockerfile" .
docker build -t "secdev:Dockerfile" .
با این کار فرآیند دانلود ubuntu:latest
تصویر و ساخت تصویر مطابق با Dockerfile آغاز می شود.
هنگامی که build (ها) کامل شد، دستور را زیر را وارد کنید:
docker images
شما باید تمام تصاویر جدید ساخته شده را ببینید که اکنون برای استفاده در دسترس هستند.
Dockerfile برای CentOS
فرض کنید می خواهید با استفاده از CentOS تصویری ایجاد کنید که تصویر موجود در CentOS را به روز می کند و یک وب سرور نصب می کند.
برای این، ابتدا یک دایرکتوری جدید با دستور ایجاد می کنیم:
mkdir ~/centos
با دستور زیر به آن دایرکتوری بروید:
cd ~/centos
Dockerfile جدید را با دستور زیر ایجاد کنید:
nano Dockerfile
دسورات زیر را در آن فایل قرار دهید:
FROM centos:7
MAINTAINER NAME EMAIL
RUN yum makecache
RUN yum upgrade -y
RUN yum install -y httpd
جایی که NAME
نام شما و EMAIL
آدرس ایمیل شما است.
ذخیره کنید و فایل را ببندید.سپس تصویر را با دستور بسازید:
docker build -t "webdev_centos:Dockerfile" .
بسته به میزان ارتقای لازم، این ساخت خاص کمی بیشتر از تصویر اوبونتو طول می کشد. پس از تکمیل ساخت، دستور images docker
را وارد کنید تا ببینید که تصویر جدید ساخته شده (بر اساس CentOS) شما آماده است.
نتیجه
ساخت تصویر آسان شد!
و این تمام چیزی است که برای ساخت تصاویر Docker با Dockerfiles وجود دارد. این یک روش بسیار کارآمدتر و استاندارد برای ایجاد تصاویر جدید نسبت به اعمال تغییرات در یک تصویر از قبل موجود. هنگامی که با Dockerfiles مسلط شدید، هیچ محدودیتی برای انواع تصاویری که می توانید ایجاد کنید وجود ندارد.
در این مقاله، اصول Docker و نحوه استفاده از Dockerfiles را بررسی کردیم. با ایجاد Dockerfiles متناسب با برنامههای خود میتوانید مدیریت و اجرای برنامهها را بهبود بخشیده و از مزایای Docker بهرهبرداری کنید.
سوالات متداول
چه زمانی باید از Dockerfile استفاده کنم؟
زمانی که نیاز به توزیع/همکاری در سیستم عامل برنامه با یک تیم وجود دارد، باید از Dockerfile استفاده کرد. از Dockerfile به عنوان سیستم کنترل نسخه برای کل سیستم عامل برنامه استفاده کنید. یا از Dockerfile برای اجرای کد روی لپ تاپ در همان محیط سروری که روی آن کار می کنید استفاده کنید.
آیا Dockerfile یک فایل متنی است؟
Dockerfile یک سند متنی است که شامل تمام دستوراتی است که کاربر برای فراخوانی خط فرمان برای جمع آوری یک تصویر نیاز دارد. با کمک Dockerfile، کاربران می توانند یک ساخت خودکار ایجاد کنند که چندین دستورالعمل خط فرمان را پشت سر هم اجرا می کند.
چگونه یک Dockerfile ساده ایجاد کنم؟
برای ایجاد یک Dockerfile، Docker و Docker Hub را راه اندازی کنید. کانتینر اصلی Docker را ایجاد کنید و سپس یک فایل روی آن ایجاد کنید. تغییراتی در کانتینر ایجاد کنید و در نهایت یک تصویر جدید ایجاد کنید.
زبان داکرفایل چیست؟
برای نوشتن Docker از زبان Go استفاده می شود. Dockerfile یک فایل متنی است که حاوی مجموعهای از دستورالعملها و دستورات است که بهطور خودکار به ترتیب در محیط داکر برای ساختن یک تصویر داکر جدید اجرا میشوند.
Docker compose در مقابل Dockerfile چیست؟
تفاوت اصلی بین Docker compose و Docker در این است که محتویات Docker نحوه ایجاد و ساخت یک تصویر Docker را توضیح میدهد، در حالی که Docker compose دستوری است که کانتینرهای Docker را بر اساس تنظیمات توصیفشده در فایل docker-composed.yaml اجرا میکند.
فایل dockerignore. چیست؟
یک فایل dockerignore. به شما امکان می دهد لیستی از فایل ها یا دایرکتوری هایی را مشخص کنید که داکر قرار است در طول فرآیند ساخت نادیده گرفته شود. این شبیه به فایل gitignore. است که هنگام ساخت مخازن Git استفاده می شود. می توانید لیست فایل ها و دایرکتوری ها را در داخل فایل dockerignore. مشخص کنید.
چگونه یک داکر کانتینر را متعهد کنم؟
ابتدا باید یک تصویر داکر را بکشید. سپس کانتینر را مستقر کنید، آن را تغییر دهید و تغییرات را در تصویر انجام دهید. هنگامی که به تغییرات متعهد می شوید، اساساً یک تصویر جدید با یک لایه اضافی ایجاد می کنید که لایه اصلی تصویر را تغییر می دهد.
کاربرد Docker در DevOps چیست؟
یک تصویر ظرف Docker در DevOps یک بسته نرمافزاری سبک، قابل اجرا و مستقل است که شامل همه چیزهایی است که برای اجرای برنامه، زمان اجرا، ابزارهای سیستم، تنظیمات، کتابخانههای سیستم و کد لازم است. کانتینرها خطوط لوله ساخت/تست/استقرار را در DevOps ساده می کنند.
آیا Dockerfile COPY بازگشتی است؟
COPY و ADD دو دستوری هستند که داکر برای کپی کردن فایل ها از هاست به تصویر داکر هنگام ساخت آن ارائه می کند. دستور COPY فایل ها را به صورت بازگشتی با توجه به فهرست ها یا فایل های مبدأ و مقصد صریح کپی می کند.
آیا Dockerfile یک تصویر داکر است؟
یک تصویر Docker به طور خودکار با خواندن دستورالعمل های یک Dockerfile ساخته می شود، یک فایل متنی حاوی تمام دستورات مورد نیاز برای ساخت یک تصویر داده شده. یک Dockerfile به مجموعهای از دستورالعملها و قالببندیهای خاص پایبند است و در هنگام ساخت یک تصویر Docker تولید میکند.