<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های حسین محمد گنجی</title><link>https://virgool.ir/feed/@ganjiid</link><description>DevOps engineer</description><language>fa</language><pubDate>2026-11-11 12:49:43</pubDate><image><url>https://files.virgool.ir/upload/users/1602126/avatar/5X1UVv.jpeg</url><title>حسین محمد گنجی</title><link>https://virgool.ir/@ganjiid</link></image><item><title>توضیح ساختار لایه ای Docker</title><link>https://virgool.ir/@ganjiid/docker-layers-explained-ez7mmjdlps6h</link><description>همه شما با مفهوم داکر و کانتینر ها آشنا هستید و میدونید که چی هستن و چکار میکنن (ایشالا). اما این وسط یه سری نکته هست که ممکنه هر کسی بهش نپرداخته باشه که یادش بگیره و حتی خیلی هامون تا وقتی که یک چیزی کار کنه ممکنه که اصلاً دنبال بهبود کارایی اون چیز نریم برای مثال: داکر فایل که تو مرحله بیلد به کار میره و داخلش دستورهای لازم برای ساختن یک ایمیج رو میدیمخب بریم سراغ اصل مطلب:داکر برای کم کردن زمان ساخت یک ایمیج از کشینگ استفاده میکنه که در واقع عملیات کشینگش به این صورت هست که یه ساختار لایه ای داره که بهش اجازه میده تا عملیات بیلد رو تکه تکه و قابل تفکیک و همچنین مناسب برای استفاده مجدد جلو ببره.Dockerfile&#xA;&#xA;FROM ubuntu:18.04&#xA;RUN apt-get update&#xA;RUN apt-get install -y build-essential&#xA;WORKDIR /app&#xA;COPY app/hello.c /app/&#xA;RUN gcc -o hello hello.c&#xA;ENTRYPOINT [ &#34;/app/hello&#34; ]داخل داکر فایل هر خط از فایلی که ما می نویسیم در واقع خودش به یک ایمیج کوچیک تبدیل میشه که داکر با درون هم قرار دادن این ایمیج ها ایمیج نهایی و کانتینر مقصد رو براتون میسازه اما نکته ای که این وسط قابل اشاره است اینکه داکر از ایمیج های ریز برای عملیات کشینگ استفاده میکنه تا در هر بار بیلد تمام مراحل از اول انجام نشه و با توجه به ساختار نستد این ایمیج ها هر ایمیجی که دچار تغییر بشه اون ایمیج و تمامی ایمیج هایی که درون اون نست &#34;nest&#34; شدن باید از اول پیاده سازی بشن در واقع با هر بار تغییر تو هر خط فقط اون خط و خط های بعد از اون اجرا می شوند که این به زمان بیلد بشدت کمک میکنه و اون رو تا حد زیادی کاهش میده مخصوصاً جایی که نیاز به دانلود یک ایمیج باشد یا نصب یک یا چند پکیج نیاز باشد یا ....خب ببینیم وقتی داکر فایل بالا رو برای اولین بار اجرا میکنیم چی میشه:$ docker build -t stage0 . &#xA;&#xA;Sending build context to Docker daemon  77.31kB&#xA;Step 1/7 : FROM ubuntu:18.04&#xA;18.04: Pulling from library/ubuntu&#xA;f22ccc0b8772: Pull complete&#xA;3cf8fb62ba5f: Pull complete&#xA;e80c964ece6a: Pull complete&#xA;Digest: sha256:fd25e706f3dea2a5ff705dbc3353cf37f08307798f3e360a13e9385840f73fb3&#xA;Status: Downloaded newer image for ubuntu:18.04&#xA; ---&gt; 2c047404e52d&#xA;&#xA;Step 2/7 : RUN apt-get update&#xA; ---&gt; Running in a8d65ab87a93&#xA;Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]&#xA;Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]&#xA;...&#xA;Fetched 21.8 MB in 20s (1078 kB/s)&#xA;Reading package lists...&#xA;Removing intermediate container a8d65ab87a93&#xA; ---&gt; fcdd591c3bfd&#xA;&#xA;Step 3/7 : RUN apt-get install -y build-essential&#xA; ---&gt; Running in c15a1c650b0a&#xA;Reading package lists...&#xA;Building dependency tree...&#xA;...&#xA;Processing triggers for libc-bin (2.27-3ubuntu1.3) ...&#xA;Removing intermediate container c15a1c650b0a&#xA; ---&gt; 9fbbc8093ab5&#xA;&#xA;Step 4/7 : WORKDIR /app&#xA; ---&gt; Running in fed79856ded7&#xA;Removing intermediate container fed79856ded7&#xA; ---&gt; 8bec0c4a2826&#xA;&#xA;Step 5/7 : COPY app/hello.c /app/&#xA; ---&gt; 5bf5977f4128&#xA;&#xA;Step 6/7 : RUN gcc -o hello hello.c&#xA; ---&gt; Running in 48c0f7dc9fcb&#xA;Removing intermediate container 48c0f7dc9fcb&#xA; ---&gt; 8a99d3e111df&#xA;&#xA;Step 7/7 : CMD [ &#34;/app/hello&#34; ]&#xA; ---&gt; Running in 2cc8c55e417b&#xA;Removing intermediate container 2cc8c55e417b&#xA; ---&gt; 87a0e7eb81da&#xA;&#xA;Successfully built 87a0e7eb81da&#xA;Successfully tagged stage0:latest&#xA;$و اما برای دومین بار که بیلد میشه:$ docker build -t stage0 .&#xA;Sending build context to Docker daemon  77.31kB&#xA;Step 1/7 : FROM ubuntu:18.04&#xA; ---&gt; 2c047404e52d&#xA;&#xA;Step 2/7 : RUN apt-get update&#xA; ---&gt; Using cache&#xA; ---&gt; fcdd591c3bfd&#xA;&#xA;Step 3/7 : RUN apt-get install -y build-essential&#xA; ---&gt; Using cache&#xA; ---&gt; 9fbbc8093ab5&#xA;&#xA;Step 4/7 : WORKDIR /app&#xA; ---&gt; Using cache&#xA; ---&gt; 8bec0c4a2826&#xA;&#xA;Step 5/7 : COPY app/hello.c /app/&#xA; ---&gt; 3853b3aff546&#xA;&#xA;Step 6/7 : RUN gcc -o hello hello.c&#xA; ---&gt; Running in 580c3f378281&#xA;Removing intermediate container 580c3f378281&#xA; ---&gt; 583b361ff9a2&#xA;&#xA;Step 7/7 : CMD [ &#34;/app/hello&#34; ]&#xA; ---&gt; Running in a2d18fe0c6b9&#xA;Removing intermediate container a2d18fe0c6b9&#xA; ---&gt; 8fb6676c5b38&#xA;&#xA;Successfully built 8fb6676c5b38&#xA;Successfully tagged stage0:latestبه اون  using cache دقت کردید دیگه ایشالا؟بعد از دونستن یه همچین مفهومی میتونیم درک کنیم که چرا جای خط ها در داکر فایل مهمه و این که منظور من از او عکس هفت سنگ چیه.دقیقا مثل هفت سنگ که هر تعدادی سنگ بریزه باید شما باز اون سنگ و سنگای بالاییش رو روی هم بچینید که یه ساختار ۷ تایی درست کنید داکر هم مجبوره همینطوری کار کنه!بعضی وقت ها بیلد ها صرفاً با عوض کردن جای یک خط پایپ لاین از بالای ربع ساعت به ۱ الی ۲ دقیقه میرسد که این بهبود عملکرد جایی که یک سیستم بزرگ برای پیاده سازی داشته باشیم بشدت ملموس است جایی که حداقل زمان بیلد ۲۰ دقیقه خواهد بود و حداکثر زمان می تواند حتی ساعت ها طول بکشد بنابراین اهمیت جایگذاری هر خط در جای مناسب خودش یکی از نکاتی است که باید در نوشتن داکر فایل به آن توجه شود برای این باید به دو نکته توجه کرد :۱ - نکته اول اینکه هر خطی که ممکن است تغییرات بیشتری در آن رخ بدهد باید پایین تر قرار گیرد نسبت به بقیه لایه هایی که در آن ها تغییرات کمتری داریم پس هرچه فرکانس تغییر ها بالاتر جایگذاری پایینتر! ۲ - دومین نکته این است که برای درست کردن یک ساختار خیلی وقت ها نیاز است که یک لایه قبل از لایه های دیگر قرار بگیرد و در واقع محیط کار را برای لایه بعدی آماده کند بنا بر این در اینجا علاوه بر فرکانس تغییرات باید به پیش نیاز ها هم توجه کردبا ترکیب دو اصل بالا میتوانیم داکر فایلی بسازیم که از لحاظ صحت عملکرد سالم و از لحاظ کارایی و زمان بیلد در بهینه ترین حالت خود قرار گیرداینو یادمون نره که داکر فایل خیلی کم نیاز به تغییر داره و هر بار تقریباً همون فایل برای ساخت ایمیج استفاده میشه پس با یه مقدار وقت گذاشتن بیشتر و بهینه کردن و جایگذاری درست هر خط از داکر فایل خودتونو برای یه مدت زیادی بیمه کنید&#34;&#34;&#34;یه نکته ی خیلی مهم هم این آخر بهتون بگم که استفاده از تگ های latest یکی از بدترین کاراییه که میتونید با خودتون بکنید پس یه لطف به خودتون بکنید و ورژن هاتون رو فیکس کنید که نه برنامه تون به مشکل بخوره نه زمان بیلد رو چند برابر کنید.&#34;&#34;&#34;</description><category>حسین محمد گنجی</category><author>حسین محمد گنجی</author><pubDate>Tue, 24 May 2022 15:04:32 +0430</pubDate></item></channel></rss>