نصب 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 تصویرها و کانتینرهای بلااستفاده را پاک میکند. برای دادهی زیاد یک دیسک جدا وصل کنید. |
قدم بعدی
- Nginx و گواهی رایگان Let's Encrypt جلوی کانتینرها
- اتصال و mount دیسک ابر آریانت برای دادهی کانتینرها
- ساخت سرور با Terraform و CLI آریانت
سرور خود را بسازید
برای اجرای کانتینرها یک سرور ابری آریانت بسازید؛ ساعتی حساب میشود و هر وقت لازم نداشتید حذفش میکنید. در پنل آریانت از «سرور ابری / Cloud Computing ← سرور جدید» Ubuntu 24.04 را انتخاب کنید و نمونهی cloud-init بالا را در اسکریپت راهاندازی بگذارید.