برای نصب داکر روی اوبونتو ۲۴.۰۴ مطمئنترین راه، مخزن رسمی خود داکر است: کلید GPG داکر را اضافه میکنید، مخزن download.docker.com را به apt معرفی میکنید و پنج بستهی docker-ce، docker-ce-cli، containerd.io، docker-buildx-plugin و docker-compose-plugin را نصب میکنید. بعد کاربرتان را به گروه docker اضافه میکنید، سرویس را روی بوت فعال میکنید و با docker run hello-world نصب را تست میکنید. کل کار کمتر از پنج دقیقه طول میکشد.
در ادامه همین مراحل را دقیق و با توضیح انجام میدهیم، و به چند سؤال رایج هم جواب میدهیم: فرق بستهی docker.io خود اوبونتو با docker-ce چیست، گروه docker چه خطری دارد، و اگر روزی خواستید داکر را کامل پاک کنید چه باید کرد. همهی دستورها برای Ubuntu 24.04 (Noble) نوشته شدهاند، ولی روی بقیهی نسخههای پشتیبانیشدهی اوبونتو هم بدون تغییر کار میکنند. اگر سرور تازه است، پیشنهاد میکنیم اول ساعت اول یک سرور تازه را انجام دهید و بعد سراغ داکر بیایید.
پیش از نصب: بستههای قدیمی و ناسازگار را بردارید
اگر قبلاً داکر را از مخزن خود اوبونتو یا با اسکریپتی دیگر نصب کردهاید، ممکن است بستههایی روی سیستم باشد که با نسخهی رسمی تداخل دارند. این دستور آنها را برمیدارد؛ اگر هیچکدام نصب نباشد، apt فقط میگوید پیدا نشد و مشکلی پیش نمیآید:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y "$pkg"
done
این دستور ایمیجها، کانتینرها و volumeهایی را که در /var/lib/docker هستند پاک نمیکند. پس اگر دادهای در داکر قبلی داشتید، سر جایش میماند.
نصب Docker Engine از مخزن رسمی داکر
۱. اضافهکردن کلید GPG داکر
apt فقط بستههایی را میپذیرد که امضایشان با کلیدی معتبر بخواند. کلید داکر را در مسیر استاندارد /etc/apt/keyrings میگذاریم:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
۲. معرفی مخزن به apt
در اوبونتو ۲۴.۰۴ قالب جدید deb822 (فایلهایی با پسوند .sources) قالب پیشفرض است. اسم نسخه (noble) را هم از خود سیستم میخوانیم تا دستی چیزی ننویسیم:
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt-get update
اگر در خروجی apt-get update خطای امضا یا NO_PUBKEY دیدید، یعنی فایل کلید درست دانلود نشده یا دسترسی خواندن ندارد؛ دو دستور آخر مرحلهی قبل را دوباره اجرا کنید.
۳. نصب بستهها
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
هر بسته کار مشخصی دارد:
| بسته | کارش |
|---|---|
docker-ce |
خود Docker Engine، یعنی سرویس dockerd |
docker-ce-cli |
دستور docker که با آن با سرویس حرف میزنید |
containerd.io |
runtime زیرین که کانتینرها را واقعاً اجرا میکند |
docker-buildx-plugin |
سازندهی ایمیج (BuildKit)؛ docker build از آن استفاده میکند |
docker-compose-plugin |
دستور docker compose برای اجرای چند سرویس با یک فایل |
بعد از نصب، سرویس داکر خودکار بالا میآید. وضعیتش را ببینید:
sudo systemctl status docker --no-pager
docker --version
docker compose version
تست نصب با hello-world
سادهترین تست، اجرای ایمیج رسمی hello-world است:
sudo docker run hello-world
این دستور ایمیج کوچک hello-world را از Docker Hub میگیرد، یک کانتینر از آن میسازد، کانتینر پیامی چاپ میکند و تمام میشود. اگر جملهی Hello from Docker! را دیدید، یعنی همهی زنجیره سالم است: CLI به سرویس وصل شده، سرویس ایمیج را گرفته و containerd کانتینر را اجرا کرده است.
کانتینری که ساخته شد بعد از اجرا در حالت Exited باقی میماند. برای تمیزکاری:
sudo docker ps -a
sudo docker rm $(sudo docker ps -aq --filter ancestor=hello-world)
sudo docker rmi hello-world
کارهای بعد از نصب
اجرای docker بدون sudo
بهطور پیشفرض فقط root به سوکت داکر (/var/run/docker.sock) دسترسی دارد. برای اینکه کاربر خودتان بدون sudo با داکر کار کند، او را به گروه docker اضافه کنید:
sudo groupadd -f docker
sudo usermod -aG docker "$USER"
عضویت در گروه از ورود بعدی اعمال میشود؛ یک بار خارج شوید و دوباره وارد شوید (یا در همین نشست newgrp docker بزنید). بعد این را امتحان کنید:
docker run --rm hello-world
یک نکتهی امنیتی مهم: عضو گروه docker عملاً root است. هر کسی که به سوکت داکر دسترسی دارد میتواند کانتینری بسازد که کل فایلسیستم میزبان را mount کند و هر کاری بخواهد با آن بکند. پس فقط کاربرهایی را به این گروه اضافه کنید که به آنها دسترسی root هم میدادید. اگر این برایتان قابل قبول نیست، حالت rootless داکر گزینهی بعدی است که مستنداتش در docs.docker.com آمده است.
فعالکردن داکر هنگام بوت
روی اوبونتو، سرویسها معمولاً بعد از نصب خودشان enable میشوند، ولی صریحگفتنش ضرری ندارد:
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
با این کار بعد از هر ریاستارت، داکر بالا میآید و کانتینرهایی که restart: unless-stopped یا --restart unless-stopped دارند هم دوباره اجرا میشوند.
محدودکردن حجم لاگ کانتینرها
درایور لاگ پیشفرض داکر (json-file) هیچ سقفی ندارد و کانتینری که پرحرف باشد میتواند در چند هفته دیسک را پر کند. یک سقف سراسری در /etc/docker/daemon.json بگذارید:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
sudo systemctl restart docker
این تنظیم فقط روی کانتینرهایی اعمال میشود که از این به بعد ساخته شوند؛ کانتینرهای موجود را باید یک بار دوباره بسازید.
داکر و دیوار آتش ufw
این یکی خیلیها را غافلگیر میکند: داکر برای پورتهایی که با -p منتشر میکنید مستقیم قانون iptables میسازد و این قوانین پیش از قوانین ufw بررسی میشوند. یعنی اگر بنویسید -p 5432:5432، پورت پایگاهداده از اینترنت باز است، حتی اگر در ufw بسته باشد.
راه ساده این است که سرویسهایی که نباید از بیرون دیده شوند را فقط روی localhost منتشر کنید:
docker run -d -p 127.0.0.1:5432:5432 --name db -e POSTGRES_PASSWORD=change-me postgres:17
و برای سرویسهایی که فقط باید با هم حرف بزنند، اصلاً پورت منتشر نکنید و آنها را در یک شبکهی داکر بگذارید؛ این دقیقاً همان کاری است که در داکر کامپوز به زبان ساده انجام میدهیم.
تفاوت docker.io و docker-ce
در مخزن خود اوبونتو بستهای به اسم docker.io هست و خیلیها میپرسند چرا همان را نصب نکنیم. هر دو Docker Engine هستند، ولی از دو منبع متفاوت:
docker.io |
docker-ce |
|
|---|---|---|
| منبع | مخزن اوبونتو | مخزن رسمی داکر |
| نگهدارنده | اوبونتو/دبیان | شرکت Docker |
| نسخه | ثابت در طول عمر نسخهی اوبونتو، فقط وصلهی امنیتی | آخرین نسخهی پایدار، بهروزرسانی مرتب |
| Compose | بستهی جدای docker-compose-v2 |
docker-compose-plugin |
| Buildx | بستهی جدا، معمولاً عقبتر | docker-buildx-plugin |
docker.io بد نیست؛ اگر ثبات و بهروزرسانی از طریق همان مخزن اوبونتو برایتان مهمتر است، انتخاب معقولی است. ولی مستندات داکر، مثالهای اینترنت و قابلیتهای جدید Compose و Buildx با نسخهی رسمی جلو میروند و برای بیشتر کارهای امروزی docker-ce دردسر کمتری دارد. مهمترین نکته این است که این دو را با هم نصب نکنید؛ برای همین در اول کار بستههای ناسازگار را برداشتیم.
بهروزرسانی داکر
چون داکر از مخزن apt نصب شده، با بهروزرسانی معمول سیستم بهروز میشود:
sudo apt-get update
sudo apt-get upgrade
بهروزرسانی Docker Engine سرویس را ریاستارت میکند و کانتینرهای در حال اجرا متوقف و (اگر سیاست restart داشته باشند) دوباره اجرا میشوند. روی سرورِ در حال سرویس، این کار را در زمانی انجام دهید که چند ثانیه قطعی قابل تحمل باشد. اگر میخواهید داکر با unattended-upgrades بیخبر بهروز نشود، بستهها را hold کنید و بهروزرسانی را دستی انجام دهید:
sudo apt-mark hold docker-ce docker-ce-cli containerd.io
حذف کامل داکر
برای برداشتن بستهها:
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
ایمیجها، کانتینرها و volumeها بعد از این دستور هنوز روی دیسک هستند. اگر واقعاً میخواهید همه چیز پاک شود، و مطمئنید دادهی لازمی در volumeها ندارید، اینها را هم پاک کنید:
sudo rm -rf /var/lib/docker /var/lib/containerd
sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.asc
پایگاهدادهای که در کانتینر اجرا میشد، دادهاش در همین /var/lib/docker/volumes بود. پیش از این دستور، اگر شک دارید، یک نسخهی پشتیبان بگیرید؛ در پشتیبانگیری با قاعدهی ۳-۲-۱ توضیح دادهایم چرا یک نسخه کافی نیست.
جمعبندی
- داکر را از مخزن رسمی
download.docker.comنصب کنید، نه با کپیکردن اسکریپتهای ناشناس. - پیش از نصب، بستههای
docker.ioو مشابه را بردارید تا دو نسخه با هم تداخل نکنند. - با
docker run hello-worldنصب را تست کنید. - گروه
dockerمعادل root است؛ فقط کاربرهای مورد اعتماد را به آن اضافه کنید. - برای لاگ کانتینرها سقف بگذارید و پورتهای داخلی را فقط روی
127.0.0.1منتشر کنید، چون داکر از کنار ufw رد میشود.
قدم بعدی طبیعی، اجرای چند سرویس با هم است؛ در داکر کامپوز به زبان ساده یک برنامهی وب را همراه PostgreSQL و Redis بالا میآوریم.