مرور کلی
در این فصل با Dockerfile ها کار خواهیم کرد و با دستوراتی مثل FROM، LABEL وCMD آشنا می شویم که با آنها اصطلاحا برنامه ی خود را داکرایز ( dockerize ) می کنیم. آخر این فصل دانش کافی برای داکرایز کردن برنامه های خود را به صورت فایل سیستم های layered (چند لایه) و بکارگیری caching در طی فرآیند build داکر بدست می آورید.
معرفی فصل
در فصل قبل یاد گرفتیم که چطور اولین کانتینر داکر را با pull کردن تصاویر از پیش آماده شده از ریپازیتوری Docker Hub دریافت کرده و run کنیم. گاهی تصاویر از پیش آماده شده را استفاده میکنیم(مثل دیتابیس ها، سرویس های بکاپ و Nginx و ...) ولی در باقی موارد برای برنامه های خود باید تصاویر شخصی سازی شده ایجاد کنیم. در این فصل به سراغ این کار میرویم. زمانی که تصاویر خود را ایجاد میکنیم باید پکیج های مورد نیاز خود را نصب کنیم و تنظیمات مختلفی را روی تصاویر از پیش تعریف شده ی داکر( pre-built Docker images ) اعمال کنیم. در این فصل تصاویر شخصی سازی شده را ایجاد و آن را اجرا می کنیم.
این کار را با یک فایل متنی به نام Dockerfile انجام می دهیم. این فایل شامل دستوراتی است که میتوانند توسط داکر برای ایجاد یک تصویر استفاده شوند. تمام تصاویر داکری با این فایل و دستور docker build (یا docker image build ) ساخته می شوند.
نکته:
از نسخه ی 1.13 ساختار Docker CLI دچار تغییراتی شد و ساختار های COMMAND SUBCOMMAND معرفی شدند . مثلا دستور docker image build به جای docker build معرفی شد. هدف این تغییر ساختاری خوانا تر کردن دستورات Docker CLI بود. هردو دستور در حال حاضر استفاده می شوند ولی قرار است دستورات قدیمی در آینده منسوخ شوند. اگر در جست و جو های خود به دستورات قدیمی برخوردید و دیدید که کار نمیکنند، فرض کنید که SUBCOMMAND هستند (مثل build ) و COMMAND مربوط به آن را پیدا کنید(در اینجا image ).
یک تصویر داکری شامل چند لایه است. هر لایه دستورات مختلف Dockerfile را اجرا میکنند. این لایه ها بعد از تعریف توسط نویسنده ی Dockerfile برای کسانی که قصد استفاده از تصویر را دارند به صورت read-only هستند. این لایه ها به صورت ترتیبی یکی پس از دیگری اجرا می شوند و یک تصویر نهایی را ایجاد میکنند. این تصاویر را میتوانید در registry های داکری مثل Docker Hub ذخیره کنید.
یک container داکر یک نسخه ی در حال اجرای یک تصویر داکر است و از هر تصویر میتوان تعداد مختلفی container در حال اجرا داشت که با دستور docker run (یا طبق نکته ی قبل: docker container run ) ایجاد و فعال می شوند. زمانی که یک container داکر از یک تصویر داکر تولید می شود، یک لایه ی writeable جدید به لایه های read-only اضافه می شود. در قسمت قبل دیدیم که میتوانیم کانینر ها را با دستور docker ps (یا طبق نکته ی قبل: docker container list ) مشاهده کنیم. تصویر زیر را برای درک بهتر این مسئله ببینید:
طبق تصویر بالا میتوانیم بیشتر از یک لایه ی read-only داشته باشیم و برای هر دستور در Dockerfile این لایه ها ایجاد می شوند. زمانی که یک Container ایجاد کنیم نیز یک لایه ی read-write به لایه های تصاویر اضافه می شود که از طریق Container در دسترس است که به آن Container layer میگوییم. این لایه وظیفه ی مدیریت تغییرات کانتینر در حال اجرا را به عهده دارد.
در ادامه ابتدا Dockerfile می نویسیم و از آن Docker image استخراج می کنیم. سپس از تصویر ایجاد شده کانتینر خود را ایجاد می کنیم و با اجزای داخلی این فایل آشنا می شویم.