اوبنتوداکردواپسلینوکس

آموزش نصب Docker روی اوبونتو – راهنمای گام‌به‌گام

مقدمه

Docker مدیریت پروسه‌های اپلیکیشن را در کانتینرها ساده می‌کند؛ محیط‌هایی ایزوله از نظر منابع که نسبت به ماشین‌های مجازی قابل‌حمل‌تر و بهینه‌تر از نظر مصرف منابع هستند.

برای آشنایی مفصل با اجزای مختلف یک کانتینر Docker، مقاله «اکوسیستم Docker: معرفی اجزای رایج» را مطالعه کنید.

این آموزش نصب Docker Community Edition (CE) روی اوبونتو، کار با کانتینرها و ایمیج‌ها، ارسال (Push) ایمیج‌ها به Docker Hub و مدیریت چرخه حیات کانتینرها را پوشش می‌دهد. همچنین شامل نصب با پشتیبانی GPU، عیب‌یابی خطاهای رایج و بهترین شیوه‌های امنیتی است.

مستقرسازی اپلیکیشن‌ها را با پارمین کلود ساده کنید و در چند دقیقه، مستقیماً از گیت‌هاب اپلیکیشن خود را منتشر کنید.

نکات کلیدی

  • Docker را از مخزن رسمی آن نصب کنید: کلید GPG و مخزن Docker را اضافه کرده و سپس docker-ce را با apt نصب کنید تا جدیدترین نسخه را دریافت کنید.
  • می‌توانید Docker را بدون sudo اجرا کنید: کاربر خود را با دستور sudo usermod -aG docker ${USER} به گروه docker اضافه کنید و سپس از سیستم خارج شده و دوباره وارد شوید.
  • کانتینرها و ایمیج‌ها را با دستوراتی مانند docker run، docker ps، docker stop، docker rm و docker images مدیریت کنید تا کانتینرها را بسازید، فهرست کنید، متوقف و حذف کنید و ایمیج‌ها را ببینید.
  • تغییرات اعمال‌شده در یک کانتینر را با docker commit در یک ایمیج جدید ذخیره کنید و با docker push آن‌ها را به Docker Hub ارسال کنید تا روی سایر سیستم‌ها قابل استفاده باشند.
  • پشتیبانی GPU را با نصب nvidia-container-toolkit فعال کنید و هنگام اجرای کانتینرهایی که به GPU نیاز دارند، از فلگ --gpus استفاده کنید.

پیش‌نیازها

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

  • یک سرور اوبونتو که طبق راهنمای راه‌اندازی اولیه سرور اوبونتو آماده شده باشد (سازگار با اوبونتو 22.04 و نسخه‌های جدیدتر)؛ شامل یک کاربر غیر root با دسترسی sudo و یک فایروال.
  • یک حساب کاربری در Docker Hub، در صورتی که بخواهید ایمیج‌های خودتان را بسازید و به Docker Hub ارسال کنید؛ همان‌طور که در مراحل ۷ و ۸ نشان داده شده است.

مرحله ۱ — نصب Docker

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

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

sudo apt update

سپس چند پکیج پیش‌نیازی را نصب کنید که به apt اجازه می‌دهند از پکیج‌ها از طریق HTTPS استفاده کند:

sudo apt install ca-certificates curl gnupg

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

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://docker-ce.parmincloud.ir/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

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

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://docker-ce.parmincloud.ir/ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

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

sudo apt update

مطمئن شوید که قصد دارید از مخزن Docker نصب کنید، نه از مخزن پیش‌فرض اوبونتو:

apt-cache policy docker-ce

خروجی مشابه این را می‌بینید؛ البته شماره نسخه Docker ممکن است متفاوت باشد:

خروجی:

docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://docker-ce.parmincloud.ir/ jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://docker-ce.parmincloud.ir/ jammy/stable amd64 Packages

توجه کنید که docker-ce نصب نشده است، اما نسخه کاندید برای نصب از مخزن Docker برای اوبونتو می‌آید.

در نهایت، Docker را نصب کنید:

sudo apt install docker-ce

Docker اکنون باید نصب شده باشد، دیمن آن راه‌اندازی شده باشد و پروسه برای شروع هنگام بوت فعال شده باشد. بررسی کنید که در حال اجراست:

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 Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 7854 (dockerd)
      Tasks: 7
     Memory: 38.3M
        CPU: 340ms
     CGroup: /system.slice/docker.service
             └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

نصب Docker حالا نه‌تنها سرویس Docker (دیمن) بلکه ابزار خط فرمان docker یعنی کلاینت Docker را هم به شما می‌دهد. در ادامه این آموزش، نحوه استفاده از دستور docker را بررسی می‌کنیم.

مرحله ۲ — اجرای دستور Docker بدون Sudo (اختیاری)

به‌صورت پیش‌فرض، دستور docker فقط می‌تواند توسط کاربر root یا کاربری در گروه docker اجرا شود؛ گروهی که به‌طور خودکار در فرایند نصب 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 اضافه شده است:

groups

خروجی:

sammy sudo docker

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

sudo usermod -aG docker username

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

در ادامه، دستور docker را بررسی می‌کنیم.

مرحله ۳ — استفاده از دستور Docker

استفاده از docker شامل پاس دادن یک زنجیره از گزینه‌ها (Option) و دستورات به‌همراه آرگومان‌هاست. سینتکس به این شکل است:

docker [option] [command] [arguments]

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

docker

فهرست کامل زیردستورات موجود Docker شامل موارد زیر است:

دستورتوضیح
attachاتصال ورودی، خروجی و خطای استاندارد محلی به یک کانتینر در حال اجرا
buildساخت یک ایمیج از یک Dockerfile
commitساخت یک ایمیج جدید از تغییرات یک کانتینر
cpکپی فایل‌ها/پوشه‌ها بین یک کانتینر و فایل‌سیستم محلی
createساخت یک کانتینر جدید
diffبررسی تغییرات فایل‌ها یا دایرکتوری‌های فایل‌سیستم یک کانتینر
eventsدریافت رویدادهای لحظه‌ای از سرور
execاجرای یک دستور در یک کانتینر در حال اجرا
exportخروجی‌گرفتن از فایل‌سیستم یک کانتینر به‌صورت آرشیو tar
historyنمایش تاریخچه یک ایمیج
imagesفهرست ایمیج‌ها
importوارد کردن محتوای یک tarball برای ساخت ایمیج فایل‌سیستم
infoنمایش اطلاعات کل سیستم
inspectبرگرداندن اطلاعات سطح پایین از اشیای Docker
killمتوقف‌کردن اجباری یک یا چند کانتینر در حال اجرا
loadبارگذاری یک ایمیج از آرشیو tar یا STDIN
loginورود به یک رجیستری Docker
logoutخروج از یک رجیستری Docker
logsدریافت لاگ‌های یک کانتینر
pauseتوقف موقت همه پروسه‌های یک یا چند کانتینر
portفهرست نگاشت‌های پورت یا یک نگاشت خاص برای کانتینر
psفهرست کانتینرها
pullدریافت یک ایمیج یا مخزن از یک رجیستری
pushارسال یک ایمیج یا مخزن به یک رجیستری
renameتغییر نام یک کانتینر
restartری‌استارت یک یا چند کانتینر
rmحذف یک یا چند کانتینر
rmiحذف یک یا چند ایمیج
runاجرای یک دستور در یک کانتینر جدید
saveذخیره یک یا چند ایمیج در یک آرشیو tar (به‌صورت پیش‌فرض به STDOUT ارسال می‌شود)
searchجست‌وجوی ایمیج‌ها در Docker Hub
startراه‌اندازی یک یا چند کانتینر متوقف‌شده
statsنمایش جریان زنده آمار مصرف منابع کانتینر(ها)
stopتوقف یک یا چند کانتینر در حال اجرا
tagساخت تگی برای TARGET_IMAGE که به SOURCE_IMAGE اشاره می‌کند
topنمایش پروسه‌های در حال اجرای یک کانتینر
unpauseخارج‌کردن از توقف موقت همه پروسه‌های یک یا چند کانتینر
updateبه‌روزرسانی پیکربندی یک یا چند کانتینر
versionنمایش اطلاعات نسخه Docker
waitمنتظر ماندن تا توقف یک یا چند کانتینر و سپس چاپ کدهای خروج آن‌ها

برای دیدن گزینه‌های موجود برای یک دستور خاص، تایپ کنید:

docker docker-subcommand --help

برای دیدن اطلاعات کل سیستم درباره Docker، از این دستور استفاده کنید:

docker info

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

مرحله ۴ — کار با ایمیج‌های Docker

کانتینرهای Docker از ایمیج‌های Docker ساخته می‌شوند. به‌صورت پیش‌فرض، Docker این ایمیج‌ها را از Docker Hub دریافت می‌کند؛ رجیستری Docker که توسط Docker (شرکت پشت پروژه Docker) مدیریت می‌شود. هر کسی می‌تواند ایمیج‌های Docker خود را روی Docker Hub میزبانی کند؛ بنابراین بیشتر اپلیکیشن‌ها و توزیع‌های لینوکسی که به آن‌ها نیاز دارید، ایمیج‌هایی در آنجا دارند.

برای بررسی اینکه می‌توانید به ایمیج‌های Docker Hub دسترسی داشته و آن‌ها را دانلود کنید، تایپ کنید:

docker run hub.cr.parmincloud.ir/library/hello-world

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

خروجی:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

...

Docker در ابتدا نتوانست ایمیج hello-world را به‌صورت محلی پیدا کند؛ پس آن را از Docker Hub دانلود کرد. پس از دانلود ایمیج، Docker از روی آن یک کانتینر ساخت و اپلیکیشن داخل کانتینر اجرا شد و پیام را نمایش داد.

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

docker search ubuntu

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

خروجی:

NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   14048     [OK]
websphere-liberty                WebSphere Liberty multi-architecture images …   283       [OK]
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   112       [OK]
neurodebian                      NeuroDebian provides neuroscience research s…   88        [OK]
open-liberty                     Open Liberty multi-architecture images based…   51        [OK]
...

در ستون OFFICIAL، علامت OK نشان می‌دهد که ایمیج توسط شرکت پشت پروژه ساخته و پشتیبانی می‌شود. وقتی ایمیجی را که می‌خواهید استفاده کنید شناسایی کردید، می‌توانید آن را با زیردستور pull به کامپیوتر خود دانلود کنید.

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

docker pull hub.cr.parmincloud.ir/library/ubuntu

خروجی زیر را می‌بینید:

خروجی:

Using default tag: latest
latest: Pulling from library/ubuntu
e0b25ef51634: Pull complete
Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

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

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

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

همان‌طور که بعداً در این آموزش می‌بینید، ایمیج‌هایی که برای اجرای کانتینرها استفاده می‌کنید قابل تغییر هستند و می‌توان از آن‌ها برای تولید ایمیج‌های جدید استفاده کرد که سپس می‌توانند به Docker Hub یا سایر رجیستری‌های Docker ارسال (Push که اصطلاح فنی آن است) شوند.

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

مرحله ۵ — اجرای یک کانتینر Docker

کانتینر hello-world که در مرحله قبل اجرا کردید، نمونه‌ای از کانتینری است که پس از نمایش یک پیام آزمایشی، اجرا شده و خارج می‌شود. کانتینرها می‌توانند خیلی مفیدتر از این باشند و می‌توانند تعاملی (Interactive) باشند. در نهایت، آن‌ها شبیه ماشین‌های مجازی هستند؛ فقط از نظر منابع بهینه‌تر.

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

docker run -it hub.cr.parmincloud.ir/library/ubuntu

خط فرمان شما باید تغییر کند تا این واقعیت را منعکس کند که اکنون در حال کار داخل کانتینر هستید و باید این شکل را به خود بگیرد:

root@d9b100f2f636:/#

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

حالا می‌توانید هر دستوری را داخل کانتینر اجرا کنید. مثلاً، بیایید پایگاه داده پکیج‌ها را داخل کانتینر به‌روز کنیم. نیازی به پیشوند sudo برای هیچ دستوری نیست؛ چون داخل کانتینر به‌عنوان کاربر root کار می‌کنید:

apt update

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

apt install nodejs

این دستور، Node.js را از مخزن رسمی اوبونتو داخل کانتینر نصب می‌کند. وقتی نصب تمام شد، تأیید کنید که Node.js نصب شده است:

node -v

شماره نسخه را در ترمینال خود می‌بینید:

خروجی:

v12.22.9

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

برای خروج از کانتینر، در خط فرمان exit تایپ کنید.

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

مرحله ۶ — مدیریت کانتینرهای Docker

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

docker ps

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

خروجی:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

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

برای دیدن همه کانتینرها — فعال و غیرفعال — دستور docker ps را با سوییچ -a اجرا کنید:

docker ps -a

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

خروجی:

CONTAINER ID   IMAGE         COMMAND   CREATED         STATUS                     PORTS     NAMES
1c08a7a0d0e4   ubuntu        "bash"     About a minute ago   Exited (0) 7 seconds ago             dazzling_taussig
587000e49d53   hello-world   "/hello"   5 minutes ago        Exited (0) 5 minutes ago             adoring_kowalevski

برای دیدن آخرین کانتینری که ساخته‌اید، سوییچ -l را به آن بدهید:

docker ps -l

خروجی:

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
1c08a7a0d0e4   ubuntu    "bash"    3 minutes ago   Exited (0) 2 minutes ago             dazzling_taussig

برای راه‌اندازی یک کانتینر متوقف‌شده، از docker start به‌همراه شناسه کانتینر یا نام کانتینر استفاده کنید. بیایید کانتینر مبتنی بر Ubuntu با شناسه 1c08a7a0d0e4 را راه‌اندازی کنیم:

docker start 1c08a7a0d0e4

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

خروجی:

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
1c08a7a0d0e4   ubuntu    "bash"    6 minutes ago   Up 8 seconds             dazzling_taussig

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

docker stop dazzling_taussig

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

docker rm adoring_kowalevski

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

کانتینرها می‌توانند به ایمیج تبدیل شوند که می‌توانید از آن برای ساخت کانتینرهای جدید استفاده کنید. بیایید ببینیم این چطور کار می‌کند.

مرحله ۷ — Commit کردن تغییرات یک کانتینر در یک ایمیج Docker

وقتی یک ایمیج Docker را راه‌اندازی می‌کنید، می‌توانید مثل ماشین مجازی، فایل‌ها را بسازید، تغییر دهید و حذف کنید. تغییری که ایجاد می‌کنید فقط به همان کانتینر اعمال می‌شود. می‌توانید آن را راه‌اندازی و متوقف کنید، اما به‌محض اینکه آن را با دستور docker rm نابود کنید، تغییرات برای همیشه از بین می‌روند.

این بخش نشان می‌دهد که چطور وضعیت یک کانتینر را به‌عنوان یک ایمیج Docker جدید ذخیره کنید.

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

سپس تغییرات را با استفاده از دستور زیر در یک نمونه ایمیج Docker جدید ثبت (Commit) کنید:

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

سوییچ -m برای پیام Commit است که به شما و دیگران کمک می‌کند بدانید چه تغییراتی ایجاد کرده‌اید، در حالی که -a برای مشخص‌کردن نویسنده استفاده می‌شود. مقدار container_id همان شناسه‌ای است که قبلاً در این آموزش هنگام شروع نشست تعاملی Docker یادداشت کردید. مگر اینکه مخازن اضافی روی Docker Hub ساخته باشید، مخزن (Repository) معمولاً نام کاربری Docker Hub شماست.

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

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

وقتی یک ایمیج را Commit می‌کنید، ایمیج جدید به‌صورت محلی روی کامپیوتر شما ذخیره می‌شود. بعداً در این آموزش یاد می‌گیرید که چطور یک ایمیج را به یک رجیستری Docker مانند Docker Hub ارسال (Push) کنید تا دیگران به آن دسترسی داشته باشند.

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

docker images

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

خروجی:

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB
...

در این مثال، ubuntu-nodejs ایمیج جدیدی است که از ایمیج موجود ubuntu در Docker Hub مشتق شده است. تفاوت اندازه، تغییراتی را که اعمال شده‌اند منعکس می‌کند؛ و در این مثال، تغییرِ نصب NodeJS بوده است. بنابراین دفعه بعد که لازم باشد کانتینری با Ubuntu و NodeJS از قبل نصب‌شده اجرا کنید، می‌توانید فقط از ایمیج جدید استفاده کنید.

همچنین می‌توانید ایمیج‌ها را از یک Dockerfile بسازید که به شما امکان می‌دهد نصب نرم‌افزار در یک ایمیج جدید را خودکار کنید. برای اطلاعات بیشتر، مستندات رسمی Docker درباره مرجع Dockerfile را ببینید.

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

مرحله ۸ — ارسال (Push) ایمیج‌های Docker به یک رجیستری

پس از ساخت یک ایمیج جدید، می‌توانید آن را با ارسال (Push) به Docker Hub یا یک رجیستری Docker دیگر به اشتراک بگذارید. برای ارسال ایمیج‌ها باید در رجیستری حساب کاربری داشته باشید.

برای ارسال ایمیج خود، ابتدا وارد Docker Hub شوید:

docker login -u docker-registry-username

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

توجه: اگر نام کاربری رجیستری Docker شما با نام کاربری محلی‌ای که برای ساخت ایمیج استفاده کردید متفاوت باشد، باید ایمیج خود را با نام کاربری رجیستری تگ بزنید. برای مثال داده‌شده در مرحله قبل، این دستور را تایپ می‌کنید:

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

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

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

برای ارسال ایمیج ubuntu-nodejs به مخزن sammy، دستور به این شکل خواهد بود:

docker push sammy/ubuntu-nodejs

این فرایند ممکن است به دلیل آپلود ایمیج‌ها کمی طول بکشد، اما وقتی کامل شد، خروجی شبیه این خواهد بود:

خروجی:

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

...

پس از ارسال یک ایمیج به رجیستری، باید در داشبورد حساب شما فهرست شود؛ همان‌طور که در تصویر زیر نشان داده شده است.

[تصویر: نمایش ایمیج جدید Docker در Docker Hub]

اگر یک تلاش برای Push با خطایی از این نوع نتیجه شود، احتمالاً هنوز وارد نشده‌اید:

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

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

نصب Docker با پشتیبانی GPU

برای نصب Docker با پشتیبانی GPU، باید فرایندی کمی متفاوت از نصب استاندارد Docker را دنبال کنید. دلیل این است که پشتیبانی GPU به درایورهای NVIDIA نصب‌شده روی سیستم میزبان و پیکربندی اضافی Runtime نیاز دارد تا کانتینرهای Docker بتوانند به منابع GPU دسترسی داشته باشند. مراحل نصب Docker با پشتیبانی GPU به این شرح است:

  • مطمئن شوید سیستم شما دارای یک GPU سازگار انویدیا است.
  • درایور NVIDIA مربوط به GPU خود را نصب کنید. می‌توانید دستورالعمل نصب را در وب‌سایت NVIDIA پیدا کنید.
  • پکیج nvidia-container-toolkit را نصب کنید که ابزارهای لازم برای تعامل Docker با GPU انویدیا را فراهم می‌کند.

مراحل نصب

مخزن NVIDIA Container Toolkit را اضافه کنید:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

فهرست پکیج‌های خود را به‌روز کرده و پکیج nvidia-container-toolkit را نصب کنید:

sudo apt update && sudo apt install nvidia-container-toolkit

Runtime مربوط به NVIDIA Container Toolkit را برای Docker پیکربندی کرده و سپس Docker را ری‌استارت کنید:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

تأیید کنید که Runtime انویدیا در دسترس است:

sudo docker info | grep Runtime

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

 Runtimes: io.containerd.runc.v2 runc nvidia
 Default Runtime: runc

وجود nvidia در فهرست Runtimes، فعال بودن پشتیبانی GPU را تأیید می‌کند.

استفاده از پشتیبانی GPU

برای استفاده از پشتیبانی GPU با کانتینرهای Docker خود، باید هنگام اجرای کانتینر، فلگ –gpus را مشخص کنید. مثلاً:

docker run --gpus all hub.cr.parmincloud.ir/nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi

اگر خطای «manifest unknown» دیدید، یک تگ معتبر CUDA را از صفحه NVIDIA CUDA Images انتخاب کرده و دوباره امتحان کنید.

برای اطلاعات بیشتر درباره نصب و استفاده از Docker با پشتیبانی GPU، به منابع زیر مراجعه کنید:

  • NVIDIA Docker
  • Docker GPU Support
  • NVIDIA CUDA Images

با دنبال‌کردن این مراحل و استفاده از منابع ارائه‌شده، باید بتوانید Docker را با پشتیبانی GPU به‌طور موفق روی سیستم خود نصب و استفاده کنید.

پیکربندی بهترین شیوه‌های امنیتی Docker

امنیت Docker Engine برای محافظت از کانتینرها و سیستم میزبان در برابر آسیب‌پذیری‌های احتمالی حیاتی است. چند شیوه برتر که باید رعایت کنید:

  • از اصل حداقل دسترسی (Least Privilege) استفاده کنید: قابلیت‌های (Capabilities) غیرضروری لینوکس را حذف کنید و از کانتینرهای Privileged اجتناب کنید (مثلاً ترجیحاً از --cap-drop=ALL استفاده کنید و فقط مواردی را که لازم است، دوباره اضافه کنید).
  • به‌عنوان کاربر غیر root اجرا کنید: ایمیج‌هایی را ترجیح دهید که کاربر غیر root تعریف کرده‌اند، یا یک کاربر را به‌صورت صریح با --user مشخص کنید.
  • از در معرض گذاشتن سوکت Docker اجتناب کنید: مسیر /var/run/docker.sock را داخل کانتینرها ماونت نکنید، مگر اینکه کاملاً به آن بار کاری اعتماد داشته باشید.
  • کانتینرها را به‌صورت پیش‌فرض تقویت (Harden) کنید: در صورت سازگاری، از گزینه‌هایی مانند --read-only، --tmpfs /tmp و --security-opt no-new-privileges استفاده کنید.
  • Docker را به‌روز نگه دارید: به‌طور منظم Docker Engine و پلاگین‌های مرتبط را به‌روز کنید تا اصلاحات امنیتی دریافت شوند.
  • ایمیج‌ها را تأیید و به‌طور منظم اسکن کنید: منابع معتبر را ترجیح دهید، برای محیط production تگ‌ها/Digestها را پین (Pin) کنید و اسکن ایمیج‌ها را بخشی از فرایند CI/CD قرار دهید.

استفاده از Docker Compose

Docker Compose به شما اجازه می‌دهد اپلیکیشن‌های چندکانتینری را با یک فایل پیکربندی واحد تعریف و اجرا کنید.

نصب Docker Compose (پلاگین Compose v2)

اگر Docker را از مخزن رسمی در مرحله ۱ نصب کرده باشید، می‌توانید پلاگین Compose v2 را با apt نصب کنید:

sudo apt update
sudo apt install docker-compose-plugin

نصب را تأیید کنید:

docker compose version

ساخت یک فایل Compose مینیمال

دایرکتوری‌ای برای یک اپ نمونه بسازید و وارد آن شوید:

mkdir compose-demo && cd compose-demo

یک فایل compose.yaml بسازید:

compose.yaml

services:
  web:
    image: hub.cr.parmincloud.ir/library/nginx:alpine
    ports:
      - "8080:80"

سرویس را در پس‌زمینه راه‌اندازی کنید:

docker compose up -d

تأیید کنید که در حال اجراست:

docker compose ps

مشاهده لاگ‌ها:

docker compose logs --tail=50

توقف و حذف سرویس:

docker compose down

حذف پکیج‌های Docker

حذف پکیج‌های Docker ممکن است هنگام ارتقای Docker یا پاک‌سازی سیستم شما لازم باشد. مراحلی که باید دنبال کنید:

  • فهرست‌کردن همه پکیج‌های نصب‌شده Docker: از دستور dpkg -l | grep docker برای فهرست‌کردن همه پکیج‌های نصب‌شده Docker استفاده کنید.
  • حذف پکیج Docker: از دستور sudo apt remove docker-ce برای حذف پکیج Docker استفاده کنید.
  • حذف وابستگی‌های Docker: از دستور sudo apt autoremove برای حذف وابستگی‌هایی که دیگر لازم نیستند استفاده کنید.
  • به‌روزرسانی فهرست پکیج‌ها: از دستور sudo apt update برای به‌روزرسانی فهرست پکیج‌های خود پس از حذف پکیج‌های Docker استفاده کنید.

ایمیج‌ها، کانتینرها، والیوم‌ها یا فایل‌های پیکربندی سفارشی روی میزبان شما به‌طور خودکار حذف نمی‌شوند.

هشدار: دستورات زیر به‌طور دائمی همه ایمیج‌ها، کانتینرها، والیوم‌ها و داده‌های Docker را حذف می‌کنند. با احتیاط استفاده کنید:

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

سورس‌لیست و Keyringها را حذف کنید:

sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.gpg

خطاهای رایج و عیب‌یابی

راه‌اندازی‌نشدن دیمن Docker

اگر دیمن Docker راه‌اندازی نشود، می‌تواند به دلایل مختلفی مانند مشکلات پیکربندی، تداخل با سایر سرویس‌ها یا محدودیت‌های منابع سیستم باشد. برای عیب‌یابی این مشکل، ممکن است پیام‌های خطایی مانند این مشاهده کنید:

Failed to start Docker Application Container Engine.

یا:

docker.service: Main process exited, code=exited, status=1/FAILURE

برای رفع این مشکل:

  • وضعیت سرویس Docker را بررسی کنید: sudo systemctl status docker
  • لاگ‌های Docker را از نظر خطا بررسی کنید: sudo journalctl -u docker
  • مطمئن شوید سرویس Docker برای شروع هنگام بوت فعال است: sudo systemctl enable docker
  • سرویس Docker را ری‌استارت کنید: sudo systemctl restart docker

خطاهای دسترسی هنگام اجرای دستورات Docker

خطاهای دسترسی زمانی رخ می‌دهند که کاربرِ در حال اجرای دستورات Docker، دسترسی کافی نداشته باشد. برای عیب‌یابی این مشکل، ممکن است پیام‌هایی مانند این ببینید:

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

برای رفع این مشکل:

  • مطمئن شوید کاربر بخشی از گروه docker است: sudo usermod -aG docker ${USER}
  • برای اعمال تغییرات عضویت در گروه، از سیستم خارج شده و دوباره وارد شوید
  • همچنین می‌توانید قبل از اجرای دستورات Docker از sudo استفاده کنید: sudo docker <command>

با دنبال‌کردن این مراحل، باید بتوانید خطاهای رایج مربوط به راه‌اندازی‌نشدن دیمن Docker و خطاهای دسترسی هنگام اجرای دستورات Docker را رفع کنید.

سوالات متداول

۱. چطور Docker را روی اوبونتو نصب کنم؟

برای نصب Docker روی اوبونتو (سازگار با اوبونتو 22.04 و نسخه‌های جدیدتر)، این مراحل را دنبال کنید:

۱. فهرست پکیج‌های خود را به‌روز کنید:

sudo apt update

۲. پکیج‌های لازم را نصب کنید:

sudo apt install ca-certificates curl gnupg

۳. کلید GPG مربوط به Docker را اضافه کنید:

sudo install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://docker-ce.parmincloud.ir/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && sudo chmod a+r /etc/apt/keyrings/docker.gpg

۴. مخزن Docker را اضافه کنید:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://docker-ce.parmincloud.ir/ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

۵. فهرست پکیج‌های خود را دوباره به‌روز کنید:

sudo apt update

۶. Docker را نصب کنید:

sudo apt install docker-ce

۲. چطور تأیید کنم که Docker روی اوبونتو نصب شده است؟

برای تأیید نصب Docker روی اوبونتو، دستور زیر را اجرا کنید:

sudo systemctl status docker

این دستور وضعیت سرویس Docker را به شما نشان می‌دهد. اگر Docker نصب و در حال اجرا باشد، باید خروجی‌ای ببینید که نشان می‌دهد سرویس فعال و در حال اجراست. نمونه‌ای از چیزی که ممکن است ببینید:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2025-04-08 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 7854 (dockerd)
      Tasks: 7
     Memory: 38.3M
        CPU: 340ms
     CGroup: /system.slice/docker.service
             └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

۳. چطور Docker را بدون sudo اجرا کنم؟

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

۱. کاربر خود را به گروه docker اضافه کنید:

sudo usermod -aG docker ${USER}

۲. برای اعمال تغییرات، از سیستم خارج شده و دوباره وارد شوید.

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا