نحوه نصب و استفاده از Docker در اوبونتو 20.04

مقدمه

 در این مقاله از سری مقاله های آموزش در بخش Docker، می خواهیم به آموزش نصب داکر در ubuntu بپردازیم. لطفا ما را در این آموزش همراهی بفرمایید. Docker برنامه ای است که روند مدیریت فرآیندهای برنامه را در container ها ساده می کند. کانتینرها به شما امکان می دهند برنامه های خود را در فرآیندهای resource-isolated اجرا کنید. آنها شبیه ماشین های مجازی هستند، اما کانتینرها قابل portable تر، سازگارتر با منابع و وابسته تر به سیستم عامل میزبان هستند.

برای آشنایی دقیق با اجزای مختلف کانتینر داکر، The Docker Ecosystem: Introduction to Common Components را ببینید.

در این آموزش، Docker Community Edition (CE) را در اوبونتو 20.04 نصب و استفاده می کنید. شما خود Docker را نصب خواهید کرد، با container ها و image ها کار می کنید و یک image را به یک Docker Repository هدایت می کنید.

پیش نیاز ها

برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:

  • یک سرور اوبونتو 20.04 با پیروی از the Ubuntu 20.04 initial server setup guide، شامل یک کاربر sudo non-root و یک فایروال، راه اندازی شده است.
  • اگر می خواهید image های خود را ایجاد کرده و آنها را به سمت Docker Hub سوق دهید، یک اکانت در Docker Hub ایجاد کنید.

مرحله 1 - نصب Docker

بسته نصب Docker موجود در repository رسمی اوبونتو ممکن است آخرین نسخه نباشد. برای اطمینان از دریافت آخرین نسخه، Docker را از repository رسمی Docker نصب خواهیم کرد. برای انجام این کار، ما یک package source جدید اضافه می کنیم، برای اطمینان از دانلود معتبر، کلید GPG را از Docker اضافه می کنیم و سپس بسته را نصب می کنیم.

ابتدا لیست موجود پکیج های خود را آپدیت کنید:

sudo apt update 

در مرحله بعدی، چند پکیج پیش نیاز را نصب کنید که به apt اجازه می دهد از بسته های HTTPS استفاده کند:

sudo apt install apt-transport-https ca-certificates curl software-properties-common 

سپس کلید GPG را برای ریپازیتوری Docker به سیستم خود اضافه کنید:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 

ریپازیتوری Docker را به منابع APT اضافه کنید:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" 

در مرحله بعد، دیتابیس پکیج ها را با پکیج های Docker از repo تازه اضافه شده آپدیت کنید:

sudo apt update 

مطمئن شوید که می خواهید از Docker repo به جای default Ubuntu repo نصب کنید:

apt-cache policy docker-ce 

خروجی مانند این را خواهید دید، اگرچه ممکن است شماره نسخه Docker متفاوت باشد:

خروجی از  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

توجه داشته باشید که docker-ce نصب نشده است، اما کاندید نصب از ریپازیتوری Docker برای Ubuntu 20.04 (focal) است.

در آخر، Docker را نصب کنید:

sudo apt install docker-ce 

اکنون باید داکر نصب شود، daemon شروع شد و فرایند برای بوت فعال شد. بررسی کنید که در حال اجرا است:

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 

 

با نصب Docker نه تنها سرویس Docker (daemon) بلکه docker command line یا Docker client را نیز در اختیارتان قرار می دهد. بعداً در این مقاله آموزشی نحوه استفاده از دستور docker را یاد خواهیم گرفت.

مرحله 2 - اجرای دستور Docker بدون sudo (اختیاری)

به طور پیش فرض، دستور docker فقط می تواند توسط کاربر root یا یک کاربر در docker group اجرا شود، که به طور خودکار در طی مراحل نصب Docker ایجاد می شود. اگر بخواهید دستور docker را بدون پیشوند sudo یا بدون حضور در گروه docker اجرا کنید، خروجی مانند این را خواهید گرفت:

خروجی
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'. 

اگر می خواهید هر زمان که دستور docker را اجرا کردید از تایپ sudo خودداری کنید، نام کاربری خود را به گروه docker اضافه کنید:

sudo usermod -aG docker ${USER} 

برای اعمال عضویت در گروه جدید، از سرور خارج و دوباره لاگین شوید یا دستور زیر را تایپ کنید:

su - ${USER} 

برای ادامه از شما خواسته می شود پسورد خود را وارد کنید.

تأیید کنید که کاربر شما اکنون به گروه docker اضافه شده است:

id -nG 
خروجی
sammy sudo docker 

اگر لازم است کاربری را به گروه docker اضافه کنید که لاگین نشده است، نام کاربری را اعلام کنید:

sudo usermod -aG docker username 

در ادامه این مقاله فرض بر این است که شما از دستور docker به عنوان کاربری که در گروه docker است استفاده می کنید. اگر این کار را نکردید، لطفاً دستورات را با sudo وارد کنید.

دستور docker را در مرحله بعدی بررسی می کنیم.

مرحله 3 - استفاده از دستور Docker

استفاده از docker شامل ارسال زنجیره ای از گزینه ها و دستورات به دنبال  آرگومان ها است. به صورت زیر:

docker [option] [command] [arguments] 

برای مشاهده همه subcommand های موجود، تایپ کنید:

docker 

از Docker 19، لیست کامل دستورات موجود شامل موارد زیر است:

خروجی
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، از دستور زیر استفاده کنید:

docker info 

می خواهیم برخی از این دستورات را بررسی کنیم. ما با کار با image ها شروع خواهیم کرد.

مرحله 4 - کار با Docker Image

کانتینرهای داکر از image های داکر ساخته شده اند. به طور پیش فرض، Docker این image ها را از Docker Hub، می خواند. هرکسی می تواند Docker image های خود را در Docker Hub میزبانی کند، بنابراین اکثر برنامه ها و توزیع های لینوکس مورد نیاز شما image ها را در آنجا host می کنند.

برای بررسی اینکه آیا می توانید به image ها از Docker Hub دسترسی پیدا کرده و دانلود کنید ، دستور زیر را تایپ کنید:

docker run hello-world 

خروجی زیر نشان می دهد که Docker به درستی کار می کند:

خروجی

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. ... 

داکر در ابتدا قادر به یافتن hello-world image به صورت لوکال نبود، بنابراین image را از Docker Hub که ریپازیتوری پیش فرض است دانلود کرد. پس از دانلود image، داکر کانتینری از image و برنامه موجود در container اجرا شده ایجاد کرده و پیام را نمایش می دهد.

با استفاده از دستور docker همراه با زیر دستور search می توانید image های موجود در Docker Hub را جستجو کنید. به عنوان مثال، برای جستجوی Ubuntu image، تایپ کنید:

docker search ubuntu 

 داخل Docker Hub جستجو شده و لیستی از تمام image هایی که نام آنها با رشته جستجو مطابقت دارد را برمی گرداند. در این حالت، خروجی مشابه این خواهد بود:

خروجی
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 در سیستم خود دانلود کنید.

دستور زیر را برای دانلود ubuntu image اجرا کنید:

docker pull ubuntu 

خروجی زیر را مشاهده خواهید کرد:

خروجی
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 

پس از دانلود image، می توانید یک کانتینر را با استفاده از image دانلود شده با دستور run اجرا کنید. همانطور که با مثال hello-world مشاهده کردید، اگر هنگام اجرای docker با دستور run ایمیجی دانلود نشده باشد، Docker client ابتدا image را دانلود می کند، سپس یک container را با استفاده از آن اجرا می کند.

برای دیدن image های دانلود شده ، تایپ کنید:

docker images 

خروجی شبیه به شکل زیر است:

خروجی
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 های جدید استفاده شوند، سپس می توانند در Docker Hub یا سایر رجیستری های Docker آپلود شوند.

می خواهیم نحوه اجرای کانتینرها را با جزئیات بیشتری بررسی کنیم.

مرحله 5 - اجرای یک کانتینر Docker

کانتینر hello-world که در مرحله قبل اجرا کردید نمونه ای از کانتینر است که پس از انتشار test message اجرا و خارج می شود. container ها می توانند بسیار مفیدتر از این موارد باشند و می توانند تعاملی باشند. آنها شبیه ماشین های مجازی هستند و فقط از نظر منابع مناسب ترند.

به عنوان مثال، بیایید یک کانتینر را با استفاده از آخرین image از اوبونتو اجرا کنیم. ترکیبی از کلیدهای -i و -t به شما امکان دسترسی shell به container را می دهد:

docker run -it ubuntu 

خط فرمان شما باید تغییر کند تا نشان دهد که اکنون داخل container کار می کنید و باید به این شکل درآید:

خروجی

root@d9b100f2f636:/# 

 

re

به container id در خط فرمان توجه داشته باشید. در این مثال، d9b100f2f636 است. بعداً برای شناسایی کانتینر که می خواهید حذف کنید، به آن container ID احتیاج دارید.

اکنون می توانید هر دستوری را درون container اجرا کنید. به عنوان مثال، بیایید package database را در داخل کانتینر آپدیت کنیم. نیازی به پیشوند فرمان با sudo نیست، زیرا به عنوان کاربر root داخل کانتینر کار می کنید:

apt update 

سپس هر برنامه ای را در آن نصب کنید. بیایید Node.js را نصب کنیم:

apt install nodejs 

این Node.js را از Ubuntu repository در container نصب می کند. هنگامی که نصب به پایان رسید، تأیید کنید که Node.js نصب شده است:

node -v 

شماره ورژن نمایش داده شده را در ترمینال خود مشاهده خواهید کرد:

خروجی
v10.19.0 

 

re

هر تغییری که داخل container ایجاد کنید فقط در آن container اعمال می شود.

برای خروج از کانتینر، exit را در اعلان تایپ کنید.

در ادامه به مدیریت کانتینرهای موجود در سیستم خود می پردازیم.

مرحله 6 - مدیریت Docker Container ها

پس از مدتی استفاده از Docker، کانتینرهای فعال (running) و غیرفعال زیادی در سیستم خود خواهید داشت. برای مشاهده موارد active، از دستور زیر استفاده کنید:

docker ps 

خروجی مشابه موارد زیر را مشاهده خواهید کرد:

خروجی
CONTAINER ID IMAGE COMMAND CREATED 

 

re

در این آموزش، شما دو کانتینر را اجرا کرده اید. یکی از ایمیج hello-world و دیگری از ایمیج ubuntu. هر دو کانتینر دیگر کار نمی کنند، اما همچنان در سیستم شما وجود دارند.

برای مشاهده همه کانتینرها ی فعال و غیرفعال، docker ps را با سوئیچ -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

برای مشاهده اخرین کانتینری که ایجاد کرده اید، از سوئیچ -l استفاده کنید:

docker ps -l 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  
Copy

برای راه اندازی یک کانتینر متوقف شده، از docker start و به دنبال آن container ID یا نام کانتینر استفاده کنید. اجازه دهید container مبتنی بر اوبونتو را با شناسه 1c08a7a0d0e4 اجرا کنیم:

docker start 1c08a7a0d0e4 

container استارت می شود و برای دیدن وضعیت آن می توانید از docker ps استفاده کنید:

خروجی
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty 

برای متوقف کردن کانتینر در حال اجرا، از docker stop و به دنبال آن شناسه یا نام کانتینر استفاده کنید. این بار ما از نامی که به container اختصاص داده شده استفاده خواهیم کرد که quizzical_mcnulty است:

docker stop quizzical_mcnulty 

وقتی تصمیم گرفتید به کانتینری احتیاج ندارید، آن را با استفاده از دستور docker rm و به دنبال آن شناسه یا نام کانتینرحذف کنید. با استفاده از دستور docker ps -a شناسه یا نام کانتینر مرتبط با hello-world image را پیدا کرده و آن را حذف کنید.

docker rm youthful_curie 

می توانید container جدیدی را استارت کرده و با استفاده از کلید --name نام آن را بگذارید. همچنین می توانید از سوئیچ --rm برای ایجاد کانتینری استفاده کنید که با متوقف شدن خود را حذف کند. برای اطلاعات بیشتر در این مورد و موارد دیگر به دستور docker run help مراجعه کنید.

کانتینرها را می توان به image هایی تبدیل کرد که بتوانید برای ساخت کانتینرهای جدید استفاده کنید. در ادامه با انجام این کار آشنا می شویم.

مرحله 7 - انجام تغییرات در یک کانتینر به یک Docker Image

هنگام راه اندازی Docker image، فایل ها را می توانید درست مانند یک ماشین مجازی ایجاد، اصلاح و حذف کنید. تغییراتی که ایجاد می کنید فقط در آن container اعمال می شود. می توانید آن را استارت و استاپ کنید، اما همین که با دستور docker rm آن را حذف کردید، تغییرات برای همیشه از بین می روند.

این بخش به شما نشان می دهد چگونه می توانید حالت یک container را به عنوان یک Docker image جدید ذخیره کنید.

پس از نصب Node.js داخل کانتینر اوبونتو، اکنون یک کانتینر در حال اجرا است که یک image را اجرا می کند، اما کانتینر با image یی که برای ایجاد آن استفاده کرده اید متفاوت است. ممکن است بخواهید بعداً از این کانتینر Node.js به عنوان پایه ای برای image های جدید استفاده کنید.

سپس با استفاده از دستور زیر تغییرات را در نمونه Docker image جدید انجام دهید.

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name 

سوئیچ -m برای commit message است که به شما و دیگران کمک می کند تا بدانید شما چه تغییراتی ایجاد کرده اید، سوئیچ  -a برای تعیین نویسنده استفاده می شود. container_id همان چیزی است که قبلاً در آموزش هنگام  interactive Docker به آن اشاره کردیم. تا زمانی که ریپازیتوری اضافی در Docker Hub ایجاد نکنید، repository معمولاً نام کاربری Docker Hub شما است.

به عنوان مثال، برای کاربر sammy، با شناسه کانتینر d9b100f2f636:

docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs 

وقتی یک image را commit می کنید، image جدید به صورت لوکال در سیستم شما ذخیره می شود. بعداً در این آموزش، شما می آموزید که چگونه یک image را به یک رجیستری Docker مانند Docker Hub منتقل کنید تا دیگران بتوانند به آن دسترسی پیدا کنند.

با ذکر مجدد Docker images، ایمیج جدید و قدیمی که از آن گرفته شده است نشان داده می شود:

docker images 

خروجی مانند این را مشاهده خواهید کرد:

خروجی
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ... 

در این مثال، ubuntu-nodejs ایمیج جدیدی است که از ubuntu image موجود از Docker Hub گرفته شده است. اختلاف اندازه نشان دهنده تغییراتی است که ایجاد شده است. و در این مثال، تغییر در نصب NodeJS بود. بنابراین دفعه بعدی که باید یک کانتینر را با استفاده از اوبونتو با NodeJS از پیش نصب شده اجرا کنید، می توانید از imageجدید استفاده کنید.

همچنین می توانید تصاویر را از یک Dockerfile بسازید، که به شما امکان می دهد نصب نرم افزار را در یک image جدید به صورت خودکار انجام دهید.که خارج از محدوده این آموزش است.

حالا بیایید image جدید را با دیگران به اشتراک بگذاریم تا آنها بتوانند از آن کانتینر درست کنند.

مرحله 8 - push کردن Docker Image ها به یک Docker Repository

گام منطقی بعدی پس از ایجاد یک image جدید از image موجود، به اشتراک گذاشتن آن با دوستان خود، در Docker Hub یا سایر رجیستری Docker است که به آن دسترسی دارید. برای انتقال image به Docker Hub یا هر رجیستری دیگر Docker، باید یک اکانت در آن داشته باشید.

این بخش به شما نشان می دهد که چگونه یک Docker image را به Docker Hub منتقل کنید.

برای انتقال image خود، ابتدا وارد Docker Hub شوید.

docker login -u docker-registry-username 

از شما خواسته می شود با استفاده از رمز عبور Docker Hub خود احراز هویت کنید. اگر پسورد صحیحی را تعیین کرده باشید، احراز هویت باید موفقیت آمیز باشد.

توجه: اگر نام کاربری رجیستری Docker شما با نام کاربری لوکال که برای ایجاد image استفاده کرده اید متفاوت است، باید image خود را با نام کاربری رجیستری خود تگ کنید. تایپ کنید:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs 

سپس می توانید image خود را با استفاده از دستور زیر انتقال دهید:

docker push docker-registry-username/docker-image-name 

برای انتقال ubuntu-nodejs image به sammy repositor، دستور زیررا وارد کنید:

docker push sammy/ubuntu-nodejs 

ممکن است با آپلود image ها، مراحل کار کمی طول بکشد اما پس از اتمام، خروجی به این شکل خواهد بود:

خروجی
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ... 

پس از انتقال  یک image به یک رجیستری، باید آن را در داشبورد لیست کنید، مانند آنچه در تصویر زیر نشان داده شده است.

New Docker image listing on Docker Hub

 

اگر انتقال منجر به چنین خطایی شود، پس احتمالاً وارد سیستم نشده اید:

خروجی
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required 

با ورود به docker login تلاش را تکرار کنید. سپس تأیید کنید که در صفحه Docker Hub repository شما وجود دارد.

اکنون می توانید با استفاده از docker pull sammy/ubuntu-nodejs ایمیج را به ماشین جدیدی منتقل کنید و از آن برای اجرای container جدید استفاده کنید.

نتیجه

در این آموزش شما Docker را نصب کردید، با image ها و container ها کار کردید و یک image اصلاح شده را به Docker Hub منتقل کردید.

امیدواریم این آموزش از سری مقاله های آموزشی docker برای شما مفید واقع شده باشد.

× در حال پاسخ به: