
مقدمه
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 اجرا کنید.




