پرش به مطلب اصلی

نصب Docker و Docker Compose روی اوبونتو

Docker برنامه‌ها را همراه همه‌ی وابستگی‌هایشان در کانتینر اجرا می‌کند و Docker Compose چند کانتینر (مثلاً وب، پایگاه داده و کش) را با یک فایل compose.yaml بالا می‌آورد. در این آموزش Docker Engine و افزونه‌ی Compose را از مخزن رسمی Docker نصب می‌کنید (نسخه‌ی مخزن اوبونتو قدیمی‌تر است)، یک سرویس نمونه اجرا می‌کنید و یاد می‌گیرید پورت‌ها را بدون باز ماندن ناخواسته منتشر کنید.

پیش‌نیازها​

  • یک سرور ابری یا VPS با Ubuntu 24.04 یا 22.04
  • کاربر با دسترسی sudo (اولین اتصال SSH و امن‌سازی)
  • دست‌کم ۱ گیگابایت رم برای کارهای سبک؛ برای چند سرویس، پلن بزرگ‌تر یا swap
سرورهای داخل ایران

سایت download.docker.com و Docker Hub دسترسی از IPهای ایران را محدود می‌کنند و ممکن است خطای 403 Forbidden بگیرید. روی سرورهای دیتاسنترهای ایران، از یک mirror داخلی مخزن و رجیستری استفاده کنید یا سرور را در دیتاسنترهای خارج از ایران بسازید.

۱. حذف بسته‌های قدیمی یا ناسازگار​

اگر قبلاً Docker را از مخزن اوبونتو نصب کرده‌اید، آن را بردارید (اگر نصب نباشند، دستور فقط پیام می‌دهد):

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y $pkg
done

تصویرها و حجم‌های قبلی در /var/lib/docker می‌مانند.

۲. افزودن مخزن رسمی Docker​

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

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

این دستورها نام نسخه (noble برای 24.04 و jammy برای 22.04) را خودشان پیدا می‌کنند.

۳. نصب Docker Engine و Compose​

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

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

sudo systemctl is-enabled docker
sudo docker run --rm hello-world
docker compose version
یادداشت

Compose نسخه‌ی ۲ یک افزونه است و با docker compose (با فاصله) اجرا می‌شود، نه docker-compose.

۴. اجرای Docker بدون sudo (اختیاری)​

sudo usermod -aG docker $USER

یک بار خارج و دوباره وارد SSH شوید، سپس docker ps را بدون sudo امتحان کنید.

اخطار

عضو گروه docker عملاً دسترسی root به سرور دارد. فقط کاربرانی را اضافه کنید که به آن‌ها دسترسی root می‌دهید.

۵. اولین پروژه با Docker Compose​

mkdir -p ~/hello && cd ~/hello
cat > compose.yaml <<'EOF'
services:
web:
image: nginx:alpine
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
EOF

docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080

پاسخ HTTP/1.1 200 OK یعنی کانتینر کار می‌کند. با docker compose logs -f لاگ‌ها را ببینید و با docker compose down سرویس را متوقف کنید.

restart: unless-stopped باعث می‌شود کانتینر پس از ری‌استارت سرور خودش بالا بیاید.

۶. Docker و فایروال​

Docker برای پورت‌های منتشرشده قوانین iptables خودش را می‌سازد و این قوانین پیش از ufw بررسی می‌شوند. یعنی ports: - "8080:80" پورت ۸۰۸۰ را روی همه‌ی IPهای سرور باز می‌کند، حتی اگر ufw آن را بسته باشد.

راه‌های امن:

  • پورت را فقط روی 127.0.0.1 منتشر کنید (مثل نمونه‌ی بالا) و یک reverse proxy مثل Nginx جلوی آن بگذارید.
  • برای ارتباط سرورها با هم، پورت را روی IP شبکه‌ی خصوصی منتشر کنید، مثلاً "10.0.1.10:5432:5432".
  • از فایروال ابر آریانت استفاده کنید؛ بیرون از سرور اجرا می‌شود و Docker نمی‌تواند از آن عبور کند.

۷. محدود کردن حجم لاگ‌ها (پیشنهادی)​

لاگ کانتینرها به‌طور پیش‌فرض بی‌سقف رشد می‌کند و ممکن است دیسک را پر کند. درایور local لاگ‌ها را فشرده و چرخشی نگه می‌دارد:

sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"log-driver": "local"
}
EOF
sudo systemctl restart docker

این تنظیم فقط روی کانتینرهایی که از این به بعد ساخته می‌شوند اثر دارد؛ پروژه‌ها را با docker compose up -d --force-recreate دوباره بسازید.

نصب خودکار هنگام ساخت سرور​

در ابر آریانت می‌توانید در مرحله‌ی «اسکریپت راه‌اندازی (cloud-init)» هنگام ساخت سرور (یا --user-data-file در CLI و user_data در Terraform) Docker را خودکار نصب کنید. این نمونه از اسکریپت نصب سریع Docker استفاده می‌کند که برای آزمایش مناسب است؛ برای محیط تولید روش مخزن بالا را ترجیح دهید:

#cloud-config
runcmd:
- curl -fsSL https://get.docker.com | sh

خطاهای رایج​

خطاراه‌حل
permission denied while trying to connect to the Docker daemon socketیا با sudo اجرا کنید، یا کاربر را به گروه docker اضافه کرده و دوباره وارد SSH شوید.
403 Forbidden هنگام apt-get update یا docker pullمحدودیت دسترسی از ایران؛ بخش «سرورهای داخل ایران» بالا را ببینید.
toomanyrequests: You have reached your pull rate limitسقف دانلود ناشناس Docker Hub. با docker login وارد شوید یا از رجیستری دیگری استفاده کنید.
bind: address already in useپورت را سرویس دیگری گرفته است: sudo ss -tlnp | grep 8080.
دیسک پر شدdocker system df مصرف را نشان می‌دهد؛ docker system prune تصویرها و کانتینرهای بلااستفاده را پاک می‌کند. برای داده‌ی زیاد یک دیسک جدا وصل کنید.

قدم بعدی​

سرور خود را بسازید​

برای اجرای کانتینرها یک سرور ابری آریانت بسازید؛ ساعتی حساب می‌شود و هر وقت لازم نداشتید حذفش می‌کنید. در پنل آریانت از «سرور ابری / Cloud Computing ← سرور جدید» Ubuntu 24.04 را انتخاب کنید و نمونه‌ی cloud-init بالا را در اسکریپت راه‌اندازی بگذارید.