docker یکی از تکنولوژی های مدرن اما مورد نیاز بسیاری از توسعه دهندگان است. در این مقاله به بررسی مقدماتی نصب و استفاده از docker خواهیم پرداخت. در قدم اول باید بدانیم docker چیست. ویکی پدیا docker را به شکل زیر تعریف می کند:
an open-source project that automates the deployment of software applications inside containers by providing an additional layer of abstraction and automation of OS-level virtualization on Linux.
ترجمه: داکر پروژه ای متن باز جهت اتوماسیون فرآیند استقرار نرم افزار در یک نگهدارنده است و این کار را با ارائه لایه های انتزاعی اضافی و اتوماسیون مجازی سازی هم سطح با سیستم عامل در لینوکس انجام می دهد.
طبیعتا این جمله بیش از حد پیچیده است و برای درک آن نیاز به توضیحات اضافی داریم.
تا مدت بسیار زیادی برای برای مجازی سازی از ماشین های مجازی یا Virtual Machines (سرواژه: VM) استفاده می شد. این ماشین های مجازی یک سیستم عامل مجازی را درون خود اجرا می کردند و در اختیار شما قرار می دادند. نقطه قوت این ماشین های مجازی ایزوله سازی تمام process های سیستم عامل مجازی از سیستم عامل اصلی بود؛ یعنی اگر مشکلی در یکی از سیستم های عامل رخ می داد در سیستم عامل دیگر تاثیری نمی گذاشت چرا که این دو سیستم عامل عملا از هم جدا بودند.
البته استفاده از ماشین های مجازی هزینه سنگینی داشت چرا که قدرت پردازشی زیادی از سیستم خرج راه اندازی و نگهداری یک یا چند سیستم عامل دیگر می شد و سرعت را تا حد زیادی کاهش می داد. به همین خاطر به container ها یا نگهدارنده ها رسیدیم که به جای سوار کردن یک سیستم عامل دیگر، از مکانیسم های سطح پایین همان سیستم عامل موجود استفاده می کند. این مسئله یعنی container هایی مانند داکر (docker) به کسری از قدرت پردازشی سیستم برای اجرا شدن نیاز دارند و از ماشین های مجازی بسیار سبک تر هستند.
در صورت علاقه به مطالعه بیشتر می توانید به مقاله مفصل من با عنوان «آشنایی با ساختار و معماری Docker» مراجعه کنید. من در آن مقاله معماری داکر را مفصلا توضیح داده ام.
مزیت اصلی داکر اینجاست که برنامه شما را به همراه وابستگی هایش در یک پکیج ایزوله شده قرار می هد. بدین شکل می توانید برنامه خود را در هر سیستمی راه اندازی کنید. مثلا اگر از سرور های ابری استفاده می کنید یا اخیرا سرور شخصی خود را خریده اید یا از دیتاسنتر های خاص استفاده می کنید هیچ مشکلی نخواهید داشت. فرآیند راه اندازی برنامه در تمام آن ها یکی است و با چند دستور ساده انجام می شود! همچنین داکر به شما اجازه می دهد دسترسی کاملی روی منابع سیستم داشته باشید بنابراین می توانید برنامه خود را بهینه تر کنید.
برای یادگیری داکر به زبان برنامه نویسی خاصی نیاز نیست، بلکه تنها باید با کار با ترمینال یا command prompt راحت باشید. البته ما در این مقاله از گیت و دستورات آن نیز استفاده می کنیم بنابراین آشنایی با گیت یک مزیت محسوب می شود. در نهایت برای درک بهتر داکر پیشنهاد می شود با نحوه استقرار (deploy) برنامه های تحت وب آشنا باشید اما این مورد الزامی نیست.
برای نصب داکر ابتدا باید به صفحه دانلود داکر رفته و بر اساس سیستم عامل خود یکی از گزینه های موجود را انتخاب کنید. من در این بخش نحوه نصب را برای کاربران لینوکس و کاربران ویندوز توضیح می دهم بنابراین به تیتر مورد نظر خود رفته و بر اساس توضیحات من عمل کنید.
در قدم اول به صفحه دانلود داکر برای ویندوز رفته و نرم افزار Docker Desktop را دانلود نمایید. قبل از شروع فرآیند نصب باید کار هایی را در سیستم خودمان انجام بدهیم.
پیش نیاز اول استفاده از ویندوز 10 است. برای استفاده از داکر در ویندوز باید ویندوز 10 نسخه 1903 و بیلد 18362 یا جدیدتر را داشته باشید.
دومین کار فعال کردن قابلیت WSL (مخفف Windows Subsystem for Linux) در ویندوز است. WSL قابلیتی در ویندوز ۱۰ است که یک لایه سبک را ایجاد می کند تا کاربران بتوانند نسخه های پشتیبانی شده از لینوکس را روی ویندوز اجرا کنند بدون اینکه نیازی به استفاده از ماشین های مجازی و امثال آن داشته باشند. البته این روش فقط برای اجرای باینری های لینوکس است و به شما رابط گرافیکی نمی دهد یا سیستم شما دو سیستم عامل پیدا نخواهد کرد. برای فعال سازی این قابلیت دو راه وجود دارد. راه اول که روش کاملا ساده ای است، باز کردن command line با دسترسی ادمین (Administrator privileges) و سپس اجرای دستور زیر در آن است:
wsl --install
با اجرای این دستور فرآیند نصب باید به صورت خودکار برایتان شروع شود. طبیعتا فرآیند نصب نیاز به اینترنت دارد چرا که باید فایل های لینوکس را دانلود کند بنابراین از قبل اینترنت آماده برای دانلود داشته باشید. با اجرای این دستور نیازی به هیچ کار دیگری نخواهید داشت و فقط باید به سوالاتی که از شما پرسیده می شود پاسخ دهید (تعیین username و password و امثال آن).
در صورتی که دوست ندارید از command line استفاده کنید باید settings در سیستم خود را باز کرده و روی Apps کلیک نمایید، سپس به بخش Programs and Features بروید:
با کلیک روی این گزینه پنجره جدیدی باز می شود که برنامه های نصب شده شما را نشان می دهد. در سمت چپ این پنجره گزینه ای به نام Turn Windows features on or off وجود دارد. روی آن کلیک کنید تا پنجره windows features باز شود. در این پنجره به دنبال گزینه Windows Subsystem for Linux بگردید و تیک آن را فعال کنید:
در نهایت روی OK کلیک کرده و سیستم خود را ریستارت کنید. در مرحله بعدی Microsoft Store را باز کرده و distro خاص لینوکس خود را پیدا کنید (اکثر افراد Ubuntu را انتخاب می کنند اما شما می توانید از Debian یا Kali linux یا Suse و امثال آن ها نیز استفاده کنید). حالا مانند تصویر زیر روی دکمه install کلیک کنید:
پس از اتمام عملیات نصب روی دکمه launch کلیک نمایید. در این بخش از شما خواسته می شود یک یوزرنیم و پسورد را برای سیستم عامل لینوکسی خود انتخاب نمایید:
با انجام این کار فرآیند نصب تمام می شود.
البته روش دیگری برای نصب WSL به صورت دستی نیز وجود دارد که بسیار پیچیده تر است و واقعا نیازی به انجام آن نیست (برای کاربران حرفه ای در نظر گرفته شده است). توضیحات بیشتر از نحوه نصب این برنامه در وب سایت رسمی ماکروسافت موجود است.
در نهایت مطمئن باشید قابلیت هایی مانند hardware virtualization (مجازی سازی سخت افزاری) و Hyper-V Windows Features در سیستم فعال باشند.
حالا که Docker Desktop را دانلود کرده اید باید آن را نصب کنید. فرآیند نصب بسیار ساده است و نیازی به فرآیند پیچیده ای ندارد. با نصب Docker Desktop نرم افزارهای زیر برایتان نصب خواهند شد:
اگر آیکون داکر (یک وال آبی) را در بخش notification ویندوز (سمت راست پایین صفحه در کنار ساعت) مشاهده کردید یعنی داکر اجرا شده است بنابراین می توانید از ترمینال به آن دسترسی داشته باشید. برای تست این موضوع یک command line را باز کنید (من PowerShell را ترجیح می دهم) و سپس دستور docker version را در آن اجرا کنید. اگر همه چیز را درست انجام داده باشید این دستور نسخه داکر نصب شده را به شما خواهد داد. در صورتی که با اجرای این پیام خطا دریافت کردید یعنی فرآیند نصب داکر موفقیت آمیز نبوده است. بهتر است یک بار سیستم را ریستارت کرده و مجددا تلاش کنید.
همچنین با کلیک راست روی آیکون داکر در بخش notification به تنظیمات یا settings دسترسی خواهید داشت. این بخش به شما اجازه می دهد جزئیاتی مانند آپدیت های خودکار یا تعداد هسته های CPU اختصاص داده شده به داکر یا مقدار RAM و امثال این تنظیمات را تغییر بدهید.
نصب داکر از طریق repository رسمی ubuntu پیشنهاد نمی شود چرا که repository رسمی ubuntu دیر به دیر لیست خود را به روز رسانی می کند بنابراین همیشه قدیمی تر از آخرین نسخه داکر است. برای حل این مشکل از repository اصلی خود داکر استفاده می کنیم. همانطور که می دانید برای انجام این کار به یک کلید GPG نیاز داریم تا دانلودهایمان را تایید کنیم بنابراین تمام این مراحل را با هم انجام می دهیم.
در ابتدا باید لیست برنامه های repository را به روز رسانی کنید:
sudo apt update
در مرحله بعدی به چند پکیج نیاز داریم که پیش نیاز داکر هستند و باید روی سیستم ما نصب باشند. من این پکیج ها را با دستور زیر نصب می کنم:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
در مرحله بعدی کلید GPG را به سیستم خودمان اضافه می کنیم:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
در نهایت repository مورد نظر را به APT سیستم اضافه می کنیم:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
حالا که یک ورودی جدید در APT داریم باید آن را یک بار آپدیت کنیم، بنابراین دوباره می گوییم:
sudo apt update
قبل از اجرای دستور نصب باید مطمئن شویم که فرآیند دانلود از repository داکر انجام می شود تا اشتباها از ubuntu repository دانلود نکنیم. برای این کار دستور زیر را اجرا کنید:
apt-cache policy docker-ce
خروجی این دستور باید چیزی شبیه به این خروجی باشد:
docker-ce: Installed: (none) Candidate: 5:19.03.9~3-0~ubuntu-focal Version table: 5:19.03.9~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
همانطور که می بینید آدرس نصب روی download.docker.com قرار گرفته است بنابراین تنها کاری که باقی مانده است انجام فرآیند نصب می باشد:
sudo apt install docker-ce
با اجرای دستور بالا فرآیند دانلود و نصب به صورت خودکار انجام می شود بنابراین پس از پایان آن باید داکر برایتان نصب شده و در حال اجرا باشد. ما می توانیم صحت این مسئله را با systemctl بررسی کنیم:
sudo systemctl status docker
خروجی دستور بالا باید به شکل زیر باشد:
docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 24321 (dockerd) Tasks: 8 Memory: 46.4M CGroup: /system.slice/docker.service └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
در این خروجی عبارت active را مشاهده می کنید که یعنی داکر در حال اجرا است و مشکلی نداریم.
زمانی که داکر را نصب می کنید یک user group برای سرور ubuntu شما ساخته می شود و کاربری به نام root برایش در نظر گرفته می شود به همین دلیل از این به بعد تمام دستورات داکر به صورت sudo اجرا می شود. اگر دوست ندارید همیشه از sudo استفاده کنید بهتر است نام کاربری خودتان را به این user group اضافه کنید:
sudo usermod -aG docker ${USER}
حالا برای اینکه در قالب حساب کاربری خودتان و نه root وارد شوید باید یک بار از سرور خارج شده یا با دستور su کاربر خود را تغییر دهید:
su - ${USER}
برای اطمینان از اینکه نام کاربری شما به user group داکر اضافه شده است از دستور زیر استفاده کنید:
id -nG
این دستور نتیجه زیر را نشان خواهد داد:
Amir sudo docker
با اینکه نحوه نصب داکر برای کاربران ویندوز و لینوکس متفاوت است اما پس از آنکه فرآیند نصب را پشت سر گذاشتیم همه چیز برای اجرای دستورات داکر در ترمینال یا command line یکسان است. ساختار کلی استفاده از دستورات داکر بدین شکل است:
docker [option] [command] [arguments]
در صورتی که می خواهید تمام دستورات موجود در داکر را ببینید باید دستور زیر را در ترمینال اجرا کنید:
docker
با اجرای این دستور لیستی از دستورات داکر را مشاهده می کنید:
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
برای اینکه گزینه های ممکن برای هر کدام از این درخواست ها را ببینید باید از ساختار زیر استفاده کنید:
docker docker-subcommand --help
طبیعتا باید به جای docker-subcommand یکی از دستورات بالا را قرار دهید. همچنین در صورتی که می خواهید اطلاعاتی کلی در رابطه با داکر در سیستم خود داشته باشید باید دستور زیر را اجرا کنید:
docker info
container ها از image ها ساخته شده اند. در واقع هر image مجموعه ای از دستورالعمل هایی است که یک container را می سازد. شما می توانید با استفاده از image ها یک برنامه را به همراه تنظیمات سرور در یک قالب مستقل قرار بدهید تا بتوانید از آن در هر محیط دیگری استفاده کنید.
این image ها روی وب سایتی به نام Docker Hub میزبانی می شوند. Docker Hub دقیقا مانند npm برای پروژه های جاوا اسکریپتی است. انواع برنامه ها و تنظیمات مختلف در این وب سایت موجود است و شما می توانید برای پروژه های خود آن ها را دانلود کرده و از آن ها استفاده کنید. برای اینکه مطمئن شویم سیستم ما می تواند این image ها را از Docker Hub دانلود کند از یک image ساده استفاده می کنیم:
docker run hello-world
hello-word یک image ساده است که برای تست کردن داکر استفاده می شود. با اجرای این دستور چنین نتیجه ای را می گیرید:
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
اگر این نتیجه را گرفتید یعنی داکر به درستی برایتان کار می کند. در همین گزارش می بینید که عبارتPull complete نمایش داده شده است که یعنی دانلود image موفقیت آمیز بوده است. در واقع داکر در ابتدا نتوانسته است چنین image را در سیستم ما به صورت محلی (local) پیدا کند بنابراین آن را از Docker Hub دانلود کرده است. در انتهای همین گزارش می بینید که عبارت زیر نمایش داده شده است:
Hello from Docker! This message shows that your installation appears to be working correctly.
این عبارت محتوای image ما است. این image (همان hello-world) پس از دانلود شدن توسط داکر اجرا شده است بنابراین پیام درون آن برای ما نمایش داده شده است. در صورتی که می خواهید image خاصی را جست و جو کنید باید از دستور search استفاده نمایید:
docker search ubuntu
این دستور لیستی از پکیج هایی را برای ما برمی گرداند که عبارت ubuntu را در نام خود دارند:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK] dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK] ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ...
عبارت OK در ستون OFFICIAL در گزارش بالا مشخص می کند که image ساخته شده توسط شرکت سازنده آن مدیریت شده و به روز رسانی می شود. حالا می توانید یکی از این پکیج ها را با دستور pull دانلود کنید:
docker pull ubuntu
کاربران لینوکس توجه داشته باشند که اگر حساب کاربری خودتان را به user group داکر اضافه نکرده باشید احتمالا دستور بالا به شما خطا می دهد و برای حل آن باید sudo را به ابتدای آن اضافه کنید. طبیعتا با اجرای این دستور نتیجه همیشگی را می بینید:
Using default tag: latest latest: Pulling from library/ubuntu d51af753c3d3: Pull complete fc878cd0a91c: Pull complete 6154df8ff988: Pull complete fee5db0ff82f: Pull complete Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest
پس از اینکه پکیج را دانلود کردید می توانید با استفاده از دستور run آن را اجرا کنید. همچنین در صورتی که می خواهید ببینید چه image هایی را روی سیستم خود دانلود کرده اید باید از دستور docker images استفاده کنید. با اجرای این دستور لیستی از تمام image های دانلود شده نمایش داده می شود:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB
ما تا به حال فقط یک image را اجرا کرده ایم که آن هم hello-world نام داشت. این container از آن دسته container هایی است که با اجرا شدن فقط یک پیام ساده را نمایش داده و سپس بسته می شود اما تمام container ها بدین شکل عمل نمی کنند. بسیاری از container ها پس از دستور run دائما در حال اجرا باقی خواهند ماند چرا که container ها دقیقا مانند ماشین های مجازی هستند با این تفاوت که منابع سیستمی کمتری مصرف می کنند. به طور مثال بیایید یک container به نام ubuntu را اجرا کنیم:
docker run -it ubuntu
توجه داشته باشید که در داکر فلگ ها را به هم می چسبانیم بنابراین it- خودش دو فلگ جداگانه i- و t- است. زمانی که از process های تعامل پذیر مانند shell ها استفاده می کنید باید این دو فلگ را به همین شکل (it-) پاس بدهید تا بتوانیم با آن container تعامل داشته باشیم. با اجرای این دستور ترمینال شما تغییر کرده و به شکل زیر در می آید:
root@d9b100f2f636:/#
این مسئله به ما می گوید که در حال حاضر وارد محیط container شده ایم. همانطور که می بینید ما با حساب کاربری root وارد شده ایم و آیدی container ما نیز d9b100f2f636 است. در حال حاضر در محیط Ubuntu (یکی از نسخه های لینوکس) هستیم بنابراین می توانیم هر دستوری که در ubuntu اجرا می کنیم را نیز اجرا کنیم. مثلا در ابتدا اطلاعات پکیج هایمان را به روز رسانی می کنم:
apt update
سپس node.js را نصب می کنیم:
apt install nodejs
با انجام این کار node.js از repository رسمی Ubuntu دانلود و نصب می شود. برای اطمینان از اینکه برنامه ما نصب شده است می توانیم از دستور زیر استفاده کنید:
node -v
اگر با اجرای این دستور نسخه node نمایش داده شد (مثلا شماره ای مثل v10.19.0) یعنی همه چیز درست کار می کند اما اگر خطایی دریافت کردید یعنی مشکلی وجود داشته است (مثلا دسترسی به اینترنت قطع بوده است و غیره). در نهایت برای خارج شدن از این container دستور exit را در ترمینال تایپ کرده و اینتر بزنید. با این کار ترمینال به حالت اولیه و عادی اش برمی گردد.
زمانی که می گوییم یک container فعال یا active است یعنی در حال اجرا است. مثلا hello-worl فقط چند ثانیه اجرا شد، یک پیام را نمایش داد و سپس متوقف شد بنابراین فقط چند ثانیه active بود اما ubuntu متوقف نمی شود مگر آنکه خودتان به صورت دستی متوقفش کنید بنابراین همیشه active است. برای مشاهده لیست کاملی از container های فعال باید دستور زیر را اجرا کنید:
docker ps
چیزی که برایتان نمایش داده می شود احتمالا بدین شکل است:
CONTAINER ID IMAGE COMMAND CREATED
همانطور که در نتیجه بالا می بینید هیچ container ای در حال اجرا نیست اما این بدین معنی نیست که از سیستم شما پاک شده اند. برای نمایش تمام container ها (چه فعال و چه غیر فعال) باید فلگ a- را نیز به دستور بالا اضافه کنید:
docker ps -a
با اجرای این دستور نتیجه زیر را می گیرید:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
همانطور که می بینید ما دو container به نام های ubuntu و hello-world را داریم و هم کدام یک id خاص نیز دارند. البته برخی اوقات تعداد container ها آنچنان زیاد می شود که نمی خواهید تمام آن ها را مشاهده کنید بلکه فقط به دنبال آخرین (جدیدترین) container ساخته شده هستید. در این حالت باید از فلگ l- استفاده کنید:
docker ps -l
با اجرای این دستور نتیجه زیر را می گیرید:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
همانطور که می بینید فقط آخرین container ساخته شده (ubuntu) برگردانده شده است. اگر می خواهید یکی از این container های غیر فعال را فعال کنید تا اجرا شوند باید از دستور start و به شکل زیر کمک بگیرید:
docker start 1c08a7a0d0e4
رشته عجیب 1c08a7a0d0e4 همان ID مربوط به container ما است. حالا برای مطمئن شدن از اجرای این container باید دستور docker ps را اجرا کنیم. نتیجه به شکل زیر خواهد بود:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
یعنی ubuntu در حال اجرا است. برای متوقف کردن این container نیز دستور docker stop را مانند docker start با آیدی مربوطه اجرا می کنید. نکته جالب اینجاست که می توانید به جای آیدی از نام تعیین شده برای container توسط داکر نیز استفاده کنید (ستون NAMES):
docker stop quizzical_mcnulty
برای حذف container ها از سیستم نیز با دستور rm (مخفف remove) و به همین شکل عمل می شود. به مثال زیر توجه کنید:
docker rm youthful_curie
نام youthful_curie همان نامی است که برای container ما (hello-world) تعیین شده بود.
image ها مانند save های بازی های کامپیوتری هستند و container مانند وضعیت بازی در آن لحظه است. طبیعتا وقتی در حال بازی هستید، وضعیت بازی تغییر می کند (مثلا شلیک می کنید و تعداد گلوله هایتان کمتر می شود). ما در بازی های کامپیوتری می توانیم یک save را overwrite کنیم یعنی آن را به همان لحظه بازی تغییر بدهیم. container ها نیز به همین شکل هستند و می توانیم آن ها را در قالب یک image ذخیره کنیم!
ما در این مقاله image مربوط به ubuntu را نصب کرده و سپس node.js را روی آن نصب کردیم. وضعیت image این است که ubuntu را دارد اما وضعیت container ما این است که node.js نیز روی ubuntu نصب شده است. ما شاید بخواهیم بعدا عینا همین container را داشته باشیم و دیگر نخواهیم این کار ها را انجام بدهیم. شاید هم پروژه خود را دقیقا به همین شکل راه اندازی کرده باشیم و تنظیمات مختلفی را روی آن انجام داده باشیم و حالا بخواهیم آن را در قالب یک image ذخیره کنیم تا دیگر نیازی به تنظیم دوباره آن نباشد، بلکه هر وقت نیاز به آن داشتیم مستقیما image را بارگذاری کنیم.
برای ساخت یک image جدید از container فعلی به شکل زیر عمل می کنیم:
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
فلگ m- مخفف message و به معنی commit message است، یعنی شما در قالب پیامی به دیگران می گویید که این image چیست و چه کاری را روی آن انجام داده اید. فلگ a- مخفف author یا «نویسنده» است که باید در آن نام خود را بنویسید. container_id همان آیدی container مورد نظر است و repository نیز معمولا همان یوزرنیم شما در docker hub می باشد مگر آنکه چیزی را تغییر داده باشید. در نهایت new_image_name نیز نام جدید image مورد نظر شما است.
به طور مثال اگر نام کاربری من AmirZM باشد و آیدی container من نیز d9b100f2f636 باشد برای ذخیره آن در قالب یک image جدید می توانم بدین شکل عمل کنم:
docker commit -m "added Node.js to Ubuntu" -a "AmirZM" d9b100f2f636 AmirZM/ubuntu-nodejs
زمانی که چنین دستوری را اجرا می کنید، image مورد نظر به صورت محلی (فقط در سیستم خودتان) ذخیره می شود اما در ادامه مقاله توضیح خواهم داد که چطور می توانید آن را به docker hub ارسال و ثبت کنید. حالا اگر دوباره image هایمان را با دستور docker images لیست کنیم، image جدید را می بینیم:
EPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB // های قدیمی image
به فرآیند ارسال یک image به سرور های docker hub فرآیند push می گویند. اولین مرحله برای push کردن image ساخته شده، داشتن یک حساب در سایت docker hub است بنابراین اگر حسابی ندارید به این سایت رفته و یک حساب جدید بسازید. در مرحله بعدی باید از ترمینال وارد حسابتان شوید که با دستور زیر انجام می شود:
docker login -u docker-registry-username
با اجرای دستور بالا از شما خواسته می شود که رمز عبور حساب خود را وارد کنید. اگر رمز عبور صحیح را اجرا کرده باشید عملیات ورود موفقیت آمیز خواهد بود.
اگر نام کاربری داکر شما (docker-registry-username) با نام کاربری محلی (سیستم خودتان) تفاوت داشته باشد، باید image هایتان را با یوزرنیم سایت tag کنید. مثلا به جای دستور قبلی برای ایجاد image از چنین دستوری استفاده می کردید:
docker tag AmirZM/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
پس از اینکه وارد حسابتان شدید، می توانید به راحتی و با استفاده از دستور زیر image را push کنید:
docker push docker-registry-username/docker-image-name
به طور مثال اگر بخواهیم image خودمان (ubuntu-nodejs) را push کنیم باید از دستور زیر استفاده کنیم:
docker push AmirZM/ubuntu-nodejs
طبیعتا اجرای این دستور زمان بر بوده و نیاز به اینترنت خواهد داشت چرا که کل image شما روی سرور های docker hub آپلود خواهد شد. پس از اتمام فرآیند آپلود باید چنین نتیجه ای را بگیرید:
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...
از این به بعد در هر جایی باشید می توانید با استفاده از دستور زیر، برنامه خودتان را دانلود کنید:
docker pull AmirZM/ubuntu-nodejs
یادتان باشد که داکر دنیای بزرگی دارد بنابراین هنوز چیز های زیادی برای یادگیری باقی مانده است اما با خواندن این مقاله باید بتوانید برنامه های خودتان را تبدیل به image کرده و آن ها را اجرا کنید.
منابع: وب سایت های docker-curriculum و docker
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.