تا اینجا با مفهومهای ایمیج و کانتینر در داکر آشنا شدی [آشنادی]؛ و آموختی چگونه با استفاده [استفادن] از ایمیجهای عمومی موجود در مخزن داکر (داکر هاب) یه کانتینر بسازی و اجرایش کنی [باجرایی اش]. در این درسگفتار میآموزی چگونه یه ایمیج پایه را سفارشی کنی [بسفاریسی]؛ بعبارتی، میآموزی چگونه یه ایمیج بسازی بطوریکه درونش مجموعهای از نرمافزارها نصب شده باشد [نصبشته باشد].
توجه. چون علاقه زیادی به آسان کردن [آسانیدن] و باقاعده کردن زبان دارم، واژگان زیادی ساختهام؛ که بدلیل ناشناخته بودن اشان تنها برای شناساندن ازشان استفاده کردهام [استفادهام]. ریشهی بیشتر این واژگان آشکار است؛ و در ویکیواژه تعریفشان کردهام [تعریفتهام اشان] یا خواهم کرد [تعریفینم اشان].
امیدوارم خوشایندت باشد.
سخنی با خواننده. قصد دارم [قصتادم] خودآموز داکر را از پایه برای برنامهنویسان تازهکاری که هیچ آشنایی با داکر ندارند بنویسم. ولی چون امکان دستهبندی [گروهیستن] مقالهها در ویرگول وجود ندارد، عنوان مقالههای این مجموعه را همانند زیر میگذارم:
خودآموز داکر: درس <شماره درس> - <موضوع درس>
که «شماره درس» از ۰۱ شروع شده [شروعارده]. پس، بعنوان مثال، برای یافتن درس چهارم کافیه عبارت «خودآموز داکر: درس ۰۴» را در ویرگول جستجو کنی [بجویی]. درضمن، پیشنهاد میکنم [میتوصیم] درسها را بترتیب بخوانی.
برای سفارشیکردن [سفاریستن] یه ایمیج کافیه:
ساختار دستورالعملها [راهنمالها] بشکل زیر است:
و پرکاربردترین راهنمالها:
FROM name:tag # مثال FROM alpine:latest
RUN [commands] # مثال. نصبیدن مفسر پایتون RUN apk add --update python3
CMD ["executable", "param1", "param2", ....] # مثال. اجراییدن مفسر پایتون CMD ["python3"]
غول داکر دستورالعملها [راهنمالها] را خطبهخط [خطبخط]، از بالا به پایین، اجرا میکند [میاجراید]. هر خط در یه کانتینر میانی، که از ایمیج گام پیش ایجاد شده [ایجادشته]، اجرا میشود؛ و در پایان هر گام یه ایمیج میانی از روی کانتینر میانی ایجاد میشود [ایجادشد] و کانتینر هه حذف میشود [حذفشد]:
برای فهمیدن بهتر، کدهای زیر را در فایل داکر بنام Dockerfile وارد کن:
# اعلانیدن ایمیج پایه FROM alpine:latest # نصبیدن پایتون۳ RUN apk add --update python3 # اعلانیدن دستور شروعش CMD [ "python3" ]
و در مسیر فایل هه دستور زیر را برای ساختن ایمیج سفارشیت اجرا کن [باجرای]:
docker build .
حالا، در خروجی دستور هه دیده میشود که در گام نخست چون ایمیج alpine در ایمیجهای محلیم وجود داشته از هاب داکر بارگیری نشده [نبارگیرشته]:
Sending build context to Docker daemon 2.048kB Step 1/3 : FROM alpine:latest ---> 0ac33e5f5afa
و تنها شناسهاش برگردانده شده:
docker images # خروجی REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 0ac33e5f5afa 4 weeks ago 5.57MB
در گام دوم، دستور apk add --update python3 در یه کانتینر میانی اجرا شده، و در پایان کانتینر هه حذف و ازرویش یه ایمیج میانی ساخته شده:
Step 2/3 : RUN apk add --update python3 ---> Running in cbf848245de4 # اجراییدن کانتینر میانی fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz (1/13) Installing libbz2 (1.0.8-r1) (2/13) Installing expat (2.4.7-r0) (3/13) Installing libffi (3.4.2-r1) (4/13) Installing gdbm (1.22-r0) (5/13) Installing xz-libs (5.2.5-r1) (6/13) Installing libgcc (10.3.1_git20211027-r0) (7/13) Installing libstdc++ (10.3.1_git20211027-r0) (8/13) Installing mpdecimal (2.5.1-r1) (9/13) Installing ncurses-terminfo-base (6.3_p20211120-r0) (10/13) Installing ncurses-libs (6.3_p20211120-r0) (11/13) Installing readline (8.1.1-r0) (12/13) Installing sqlite-libs (3.36.0-r0) (13/13) Installing python3 (3.9.7-r4) Executing busybox-1.34.1-r5.trigger OK: 56 MiB in 27 packages Removing intermediate container cbf848245de4 # حذفیدن کانتینر میانی هه ---> e4493fed1929 # شناسه ایمیج میانی
در گام سوم هم یه کانتینر میانی ازروی ایمیج میانی گام پیش ایجاد، و دستور شروعش پیشفرض برایش تعیین شده [تعینشته]:
Step 3/3 : CMD [ "python3" ] ---> Running in d7da112eada8 Removing intermediate container d7da112eada8 ---> 0dbc7566ebd4 # شناسه ایمیج میانه مرحله سوم Successfully built 0dbc7566ebd4 # شناسه ایمیج نهایی
و درآخر هم ایمیج هه در مخزن ایمیجهای محلیمان انبار شده [نگران تگ عجیبش نباش، در ادامه میآموزی که چگونه به ایمیجهایت تگ بدهی]:
REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 0dbc7566ebd4 21 minutes ago 54MB alpine latest 0ac33e5f5afa 4 weeks ago 5.57MB