یک registry داکر امکان ذخیره و توزیع تصاویر داکری را به ما می دهد. دیدیم که زمانی که یک تصویر را pull میکنیم تصویر به صورت لایه لایه و بخش های مختلف به جای یک بخش کامل دریافت می شود. این لایه ها در زمان ساخت تصویر بر روی هر سیستمی که تصویر ساخته شود ایجاد می شوند.

تصاویر Docker همواره به صورت چند لایه ساخته می شوند(مگر اینکه بسیار کوچک باشند و تصویر پایه ی آنها تصویر پایه باشد و کدی درون آن نباشد که در آن صورت تنها یک لایه خواهیم داشت). زمانی که یک تصویر را بر اساس یک Dockerfile ایجاد میکنیم لایه های بیشتری به لایه های تصویر parent اضافه می شود؛ هر لایه شامل تمام تغییرات filesystem قبل از اجرای هر دستور است و لایه ی آخر هم در انتهای عملیات تعریف شده در Dockerfile ایجاد می شود تا آخرین تغییرات را در لایه ی آخر ذخیره کند. این لایه ها همگی read-only هستند.

زمانی که یک container را از image ایجاد میکنیم دو لایه ی readable و writable به ترتیب روی لایه های قبلی ایجاد می شود. به لایه ی writable اصطلاحا container layer نیز میگوییم.

در مثال بعدی از دستور docker history استفاده می کنیم تا این مسئله را بهتر مشاهده کنیم


نکته 1:

پرکابردترین ریپازیتوری های عمومی داکر ریپازیتوری های زیر هستند:

  1. داکر هاب:Docker Hub
  2. گیتهاب پکیجز: ghcr.io

تنها از داکر هاب بیش از 20 میلیارد دریافت تصویر در هر ماه انجام میشود اما شرکتهای بزرگی که ریپازیتوری های شخصی خود را ندارند، عموما از سرویس گیتهاب استفاده میکنند و پیش بینی می شود که سرویس گیتهاب حدود 0.20 درصد از ترافیک تصاویر داکری را دارد. یعنی حداقل 4 میلیارد بار در ماه تصاویر از این ریپازیتوری دانلود می شوند.

نکته 2:

لایه های بیشتر به معنی بزرگتر شدن تصویر هستند!

بزرگتر شدن تصویر به افزایش منابع حافظه( storage ) منجر می شود!

بزرگتر شدن تصویر و افزایش منابع حافظه به معنی افزایش زمان build و مصرف disk space در محیط های development ه production است!


زمانی که بر اساس Dockerfile یک تصویر می سازیم ، زمانی که به دستورات RUN، ADD و COPY می رسیم، لایه های جدید ایجاد می شوند. باقی دستورات لایه های میانی( intermediate ) ایجاد می کنند. لایه های میانی 0B (صفر بایت) هستند پس تاثیری در افزایش سایز تصاویر ندارند.

میتوانیم در ترمینال از دستور docker history برای دیدن لایه های استفاده شده در تصویر استفاده کنیم. این دستور را به صورت زیر بکار می بریم:

docker history <image_name|image_id>

برای کسب اطلاعات بیشتر نیز میتوانیم از دستور مدرن تر docker image inspect استفاده کنیم. این دستور مکان وجود این لایه ها را نیز در حافظه باز می گرداند.

docker image inspect <image_id>

در ادامه ی بررسی تصاویر نیز از دستور docker import به منظور کپی کردن running system در یک TAR file استفاده میکنیم.