آموزش مقدماتی نصب و پیکربندی Docker

Docker Installation and Configuration

27 خرداد 1400
آموزش مقدماتی نصب و پیکربندی Docker

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.

ترجمه: داکر پروژه ای متن باز جهت اتوماسیون فرآیند استقرار نرم افزار در یک نگهدارنده است و این کار را با ارائه لایه های انتزاعی اضافی و اتوماسیون مجازی سازی هم سطح با سیستم عامل در لینوکس انجام می دهد.

طبیعتا این جمله بیش از حد پیچیده است و برای درک آن نیاز به توضیحات اضافی داریم.

آشنایی با container ها و مزیت آن ها

تا مدت بسیار زیادی برای برای مجازی سازی از ماشین های مجازی یا 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 بروید:

بخش features و programs در تنظیمات وبندوز 10
بخش features و programs در تنظیمات وبندوز 10

با کلیک روی این گزینه پنجره جدیدی باز می شود که برنامه های نصب شده شما را نشان می دهد. در سمت چپ این پنجره گزینه ای به نام Turn Windows features on or off وجود دارد. روی آن کلیک کنید تا پنجره windows features باز شود. در این پنجره به دنبال گزینه Windows Subsystem for Linux بگردید و تیک آن را فعال کنید:

فعال کردن قابلیت subsystems linux در ویندوز
فعال کردن قابلیت subsystems linux در ویندوز

در نهایت روی OK کلیک کرده و سیستم خود را ریستارت کنید. در مرحله بعدی Microsoft Store را باز کرده و distro خاص لینوکس خود را پیدا کنید (اکثر افراد Ubuntu را انتخاب می کنند اما شما می توانید از Debian یا Kali linux یا Suse و امثال آن ها نیز استفاده کنید). حالا مانند تصویر زیر روی دکمه install کلیک کنید:

نصب ubuntu از فروشگاه ماکروسافت
نصب ubuntu از فروشگاه ماکروسافت

پس از اتمام عملیات نصب روی دکمه launch کلیک نمایید. در این بخش از شما خواسته می شود یک یوزرنیم و پسورد را برای سیستم عامل لینوکسی خود انتخاب نمایید:

راه اندازی WSL برای ubuntu در ویندوز
راه اندازی WSL برای ubuntu در ویندوز

با انجام این کار فرآیند نصب تمام می شود.

البته روش دیگری برای نصب WSL به صورت دستی نیز وجود دارد که بسیار پیچیده تر است و واقعا نیازی به انجام آن نیست (برای کاربران حرفه ای در نظر گرفته شده است). توضیحات بیشتر از نحوه نصب این برنامه در وب سایت رسمی ماکروسافت موجود است.

در نهایت مطمئن باشید قابلیت هایی مانند hardware virtualization (مجازی سازی سخت افزاری) و Hyper-V Windows Features در سیستم فعال باشند.

حالا که Docker Desktop را دانلود کرده اید باید آن را نصب کنید. فرآیند نصب بسیار ساده است و نیازی به فرآیند پیچیده ای ندارد. با نصب Docker Desktop نرم افزارهای زیر برایتان نصب خواهند شد:

  • Docker Engine
  • Docker CLI client
  • Docker CLI client
  • Notary
  • Kubernetes
  • Credential Helper

اگر آیکون داکر (یک وال آبی) را در بخش notification ویندوز (سمت راست پایین صفحه در کنار ساعت) مشاهده کردید یعنی داکر اجرا شده است بنابراین می توانید از ترمینال به آن دسترسی داشته باشید. برای تست این موضوع یک command line را باز کنید (من PowerShell را ترجیح می دهم) و سپس دستور docker version را در آن اجرا کنید. اگر همه چیز را درست انجام داده باشید این دستور نسخه داکر نصب شده را به شما خواهد داد. در صورتی که با اجرای این پیام خطا دریافت کردید یعنی فرآیند نصب داکر موفقیت آمیز نبوده است. بهتر است یک بار سیستم را ریستارت کرده و مجددا تلاش کنید.

همچنین با کلیک راست روی آیکون داکر در بخش notification به تنظیمات یا settings دسترسی خواهید داشت. این بخش به شما اجازه می دهد جزئیاتی مانند آپدیت های خودکار یا تعداد هسته های CPU اختصاص داده شده به داکر یا مقدار RAM و امثال این تنظیمات را تغییر بدهید.

نصب برای کاربران Ubuntu

نصب داکر از طریق 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

آشنایی با دستورات 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

کار با image های docker

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ها در داکر

ما تا به حال فقط یک 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های داکر

زمانی که می گوییم یک 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) تعیین شده بود.

ثبت تغییرات container به image

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

به فرآیند ارسال یک 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

نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهشید
27 خرداد 1400
عالی بود. متاسفانه توی فضای وب فارسی به تکنولوژی های جدید پرداخته نمیشه اونم به این شکل و به طور تخصصی. ممنونم که مقاله رو بخش بخش نکردید جا به جایی بین مقالات سخته لطفا تا زمانی که مقاله بیش از حد طولانی نشده قسمت بندی نکنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.