برای نصب داکر روی اوبونتو ۲۴.۰۴ مطمئن‌ترین راه، مخزن رسمی خود داکر است: کلید 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 فقط می‌گوید پیدا نشد و مشکلی پیش نمی‌آید:

bash
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 می‌گذاریم:

bash
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) را هم از خود سیستم می‌خوانیم تا دستی چیزی ننویسیم:

bash
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 دیدید، یعنی فایل کلید درست دانلود نشده یا دسترسی خواندن ندارد؛ دو دستور آخر مرحله‌ی قبل را دوباره اجرا کنید.

۳. نصب بسته‌ها

bash
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 برای اجرای چند سرویس با یک فایل

بعد از نصب، سرویس داکر خودکار بالا می‌آید. وضعیتش را ببینید:

bash
sudo systemctl status docker --no-pager
docker --version
docker compose version

تست نصب با hello-world

ساده‌ترین تست، اجرای ایمیج رسمی hello-world است:

bash
sudo docker run hello-world

این دستور ایمیج کوچک hello-world را از Docker Hub می‌گیرد، یک کانتینر از آن می‌سازد، کانتینر پیامی چاپ می‌کند و تمام می‌شود. اگر جمله‌ی Hello from Docker! را دیدید، یعنی همه‌ی زنجیره سالم است: CLI به سرویس وصل شده، سرویس ایمیج را گرفته و containerd کانتینر را اجرا کرده است.

کانتینری که ساخته شد بعد از اجرا در حالت Exited باقی می‌ماند. برای تمیزکاری:

bash
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 اضافه کنید:

bash
sudo groupadd -f docker
sudo usermod -aG docker "$USER"

عضویت در گروه از ورود بعدی اعمال می‌شود؛ یک بار خارج شوید و دوباره وارد شوید (یا در همین نشست newgrp docker بزنید). بعد این را امتحان کنید:

bash
docker run --rm hello-world

یک نکته‌ی امنیتی مهم: عضو گروه docker عملاً root است. هر کسی که به سوکت داکر دسترسی دارد می‌تواند کانتینری بسازد که کل فایل‌سیستم میزبان را mount کند و هر کاری بخواهد با آن بکند. پس فقط کاربرهایی را به این گروه اضافه کنید که به آن‌ها دسترسی root هم می‌دادید. اگر این برایتان قابل قبول نیست، حالت rootless داکر گزینه‌ی بعدی است که مستنداتش در docs.docker.com آمده است.

فعال‌کردن داکر هنگام بوت

روی اوبونتو، سرویس‌ها معمولاً بعد از نصب خودشان enable می‌شوند، ولی صریح‌گفتنش ضرری ندارد:

bash
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

با این کار بعد از هر ری‌استارت، داکر بالا می‌آید و کانتینرهایی که restart: unless-stopped یا --restart unless-stopped دارند هم دوباره اجرا می‌شوند.

محدودکردن حجم لاگ کانتینرها

درایور لاگ پیش‌فرض داکر (json-file) هیچ سقفی ندارد و کانتینری که پرحرف باشد می‌تواند در چند هفته دیسک را پر کند. یک سقف سراسری در /etc/docker/daemon.json بگذارید:

/etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
bash
sudo systemctl restart docker

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

داکر و دیوار آتش ufw

این یکی خیلی‌ها را غافلگیر می‌کند: داکر برای پورت‌هایی که با -p منتشر می‌کنید مستقیم قانون iptables می‌سازد و این قوانین پیش از قوانین ufw بررسی می‌شوند. یعنی اگر بنویسید -p 5432:5432، پورت پایگاه‌داده از اینترنت باز است، حتی اگر در ufw بسته باشد.

راه ساده این است که سرویس‌هایی که نباید از بیرون دیده شوند را فقط روی localhost منتشر کنید:

bash
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 نصب شده، با به‌روزرسانی معمول سیستم به‌روز می‌شود:

bash
sudo apt-get update
sudo apt-get upgrade

به‌روزرسانی Docker Engine سرویس را ری‌استارت می‌کند و کانتینرهای در حال اجرا متوقف و (اگر سیاست restart داشته باشند) دوباره اجرا می‌شوند. روی سرورِ در حال سرویس، این کار را در زمانی انجام دهید که چند ثانیه قطعی قابل تحمل باشد. اگر می‌خواهید داکر با unattended-upgrades بی‌خبر به‌روز نشود، بسته‌ها را hold کنید و به‌روزرسانی را دستی انجام دهید:

bash
sudo apt-mark hold docker-ce docker-ce-cli containerd.io

حذف کامل داکر

برای برداشتن بسته‌ها:

bash
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

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

bash
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 بالا می‌آوریم.