TürkiyeVPS

نصب داکر روی اوبونتو ۲۴.۰۴ و اجرای اولین کانتینر

داکر را از مخزن رسمی روی سرور مجازی اوبونتو ۲۴.۰۴ نصب کنید، اولین کانتینر را اجرا کنید و با Docker Compose یک سرویس پایدار بالا بیاورید؛ همراه با نکات فایروال و رم کم.

7 دقیقه مطالعه

بیشترین وقتی که هنگام راه‌اندازی یک برنامه روی سرور هدر می‌رود، صرف وابستگی‌ها می‌شود: نسخه‌ی اشتباه PHP، یک کتابخانه‌ی جاافتاده، یا بسته‌ای که با پروژه‌ی دیگری تداخل دارد. داکر (Docker) این مشکل را با اجرای هر برنامه داخل یک کانتینر همراه با همه‌ی نیازهایش حل می‌کند. در این راهنما داکر را روی اوبونتو ۲۴.۰۴ نصب می‌کنیم، اولین کانتینر را اجرا می‌کنیم و با Docker Compose سرویسی می‌سازیم که بعد از ری‌استارت هم سر پا بماند. در پایان می‌توانید n8n، Uptime Kuma یا برنامه‌ی خودتان را با یک دستور روی سرور مجازی بالا بیاورید.

داکر چیست و چه فرقی با ماشین مجازی دارد؟

سرور مجازی (VPS) شما خودش یک ماشین مجازی با هسته و سیستم‌عامل مستقل است. کانتینرهای داکر پروسه‌هایی ایزوله هستند که از هسته‌ی همان سرور استفاده می‌کنند؛ به همین دلیل در چند ثانیه اجرا می‌شوند و منابع کمی مصرف می‌کنند.

برای شروع، دانستن سه مفهوم کافی است:

  • ایمیج (image): بسته‌ی فقط‌خواندنی برنامه و وابستگی‌هایش (مثلاً nginx یا postgres).
  • کانتینر (container): نمونه‌ی در حال اجرای یک ایمیج.
  • والیوم (volume): فضایی که داده‌ها حتی بعد از حذف کانتینر در آن باقی می‌مانند.

پیش‌نیازها

  • یک سرور مجازی با اوبونتو ۲۴.۰۴ و کاربری با دسترسی sudo.
  • آشنایی مقدماتی با خط فرمان. اگر تازه‌کار هستید، مقاله‌ی دستورهای پایه‌ی لینوکس شروع خوبی است.

در مخازن خود اوبونتو بسته‌ای به نام docker.io هم وجود دارد، اما برای نسخه‌ی به‌روز و افزونه‌ی Compose از مخزن رسمی apt داکر استفاده می‌کنیم.

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

اگر قبلاً داکر را به روش دیگری نصب کرده‌اید، بسته‌های قدیمی را حذف کنید. اگر هیچ‌کدام نصب نباشد، 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

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

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

در خروجی آخرین دستور باید خطوطی از download.docker.com ببینید. نام رمز اوبونتو ۲۴.۰۴، noble است.

۳. نصب Docker Engine و افزونه‌ی Compose

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

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

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

برای Docker Compose لازم نیست چیز دیگری دانلود کنید؛ بسته‌ی docker-compose-plugin دستور docker compose (نسخه‌ی ۲، با فاصله) را اضافه می‌کند. ابزار قدیمی docker-compose (با خط تیره) منسوخ شده است.

۴. اولین آزمایش: hello-world

sudo docker run hello-world

داکر ایمیج را از Docker Hub دانلود می‌کند، یک کانتینر اجرا می‌کند و پیام «Hello from Docker!» را چاپ می‌کند. اگر این پیام را می‌بینید، نصب درست انجام شده است.

۵. استفاده از داکر بدون sudo

اگر نمی‌خواهید هر بار sudo بنویسید، کاربرتان را به گروه docker اضافه کنید:

sudo usermod -aG docker $USER
newgrp docker
docker ps

به جای newgrp می‌توانید یک بار از سرور خارج شوید و دوباره وارد شوید.

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

۶. اولین کانتینر واقعی: Nginx

یک وب‌سرور اجرا می‌کنیم و آن را روی پورت 8080 منتشر می‌کنیم:

docker run -d --name web -p 8080:80 nginx:stable
  • -d: اجرا در پس‌زمینه.
  • --name web: یک نام قابل‌به‌خاطرسپاری برای کانتینر.
  • -p 8080:80: پورت 8080 سرور به پورت 80 کانتینر وصل می‌شود.

آدرس http://SERVER_IP:8080 را در مرورگر باز کنید تا صفحه‌ی خوش‌آمد Nginx را ببینید. دستورهایی که هر روز به کارتان می‌آید:

docker ps              # running containers
docker ps -a           # all containers, including stopped
docker logs -f web     # live logs (Ctrl+C to exit)
docker exec -it web sh # shell inside the container
docker stop web        # stop
docker rm web          # remove

به ترتیب: فهرست کانتینرهای در حال اجرا، فهرست همه‌ی کانتینرها، دیدن لاگ زنده، ورود به داخل کانتینر، توقف و حذف.

۷. سرویس پایدار با Docker Compose

به جای حفظ کردن دستورهای طولانی docker run، بهتر است سرویس را در یک فایل تعریف کنید. به عنوان مثال Uptime Kuma را راه‌اندازی می‌کنیم؛ ابزاری کاربردی برای مانیتور کردن سرورها و سایت‌ها:

mkdir -p ~/uptime-kuma && cd ~/uptime-kuma
nano compose.yaml
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - kuma-data:/app/data

volumes:
  kuma-data:
docker compose up -d
docker compose ps
docker compose logs -f

سه تنظیم مهم در این فایل:

  • restart: unless-stopped: اگر کانتینر از کار بیفتد یا سرور ری‌استارت شود، خودکار دوباره اجرا می‌شود؛ مگر اینکه خودتان آن را متوقف کرده باشید. گزینه‌های دیگر no، always و on-failure هستند.
  • volumes: داده‌ها در والیوم kuma-data نگه داشته می‌شوند و با به‌روزرسانی ایمیج یا ساخت دوباره‌ی کانتینر از بین نمی‌روند.
  • 127.0.0.1:3001:3001: پورت فقط از داخل خود سرور در دسترس است و دسترسی عمومی باید از طریق یک reverse proxy با HTTPS داده شود. برای یک تست سریع می‌توانید موقتاً "3001:3001" بنویسید.

برای به‌روزرسانی:

docker compose pull
docker compose up -d

هشدار مهم: پورت‌های داکر از UFW عبور می‌کنند

این رایج‌ترین تله برای تازه‌کارهاست. داکر برای پورت‌های منتشرشده مثل -p 8080:80 قوانین iptables مخصوص خودش را می‌نویسد و این قوانین قبل از قوانین UFW بررسی می‌شوند. یعنی حتی اگر ufw deny 8080 بزنید، پورت همچنان روی اینترنت باز می‌ماند.

راه‌حل ساده است:

  • اگر سرویس پشت reverse proxy (مثل Nginx یا Caddy) اجرا می‌شود، پورت را با پیشوند 127.0.0.1: منتشر کنید تا فقط به‌صورت محلی در دسترس باشد.
  • پورت پایگاه داده‌ها (PostgreSQL، MySQL، Redis) را اصلاً منتشر نکنید؛ سرویس‌های داخل یک فایل Compose با نام سرویس به هم دسترسی دارند.
  • پورت‌های باز را مرتب با ss -tulpn و docker ps بررسی کنید.

پاک‌سازی دیسک

ایمیج‌ها و کانتینرهای متوقف‌شده به مرور فضای دیسک را پر می‌کنند؛ مخصوصاً روی دیسک‌های کوچک:

docker system df       # how much space Docker uses
docker system prune    # remove stopped containers, unused networks, dangling images

دستور اول نشان می‌دهد داکر چقدر فضا گرفته و دستور دوم کانتینرهای متوقف، شبکه‌های بلااستفاده و ایمیج‌های بی‌صاحب را پاک می‌کند. docker system prune -a همه‌ی ایمیج‌های بلااستفاده را حذف می‌کند و دفعه‌ی بعد دوباره دانلود می‌شوند. قبل از افزودن --volumes دو بار فکر کنید؛ داده‌های والیوم قابل بازگشت نیستند.

داکر روی سرور مجازی با رم کم

خود داکر سبک است، اما کانتینرها به حافظه نیاز دارند. روی سرور مجازی با ۵۱۲ مگابایت یا ۱ گیگابایت رم، یک Nginx یا یک ربات کوچک راحت اجرا می‌شود؛ اما مجموعه‌ی «پایگاه داده + برنامه + مانیتورینگ» ممکن است جا نشود. چند پیشنهاد:

  • یک فضای swap اضافه کنید تا جهش‌های ناگهانی مصرف حافظه باعث kill شدن کانتینرها (OOM) نشود. مراحل را در راهنمای افزودن swap به سرور مجازی اوبونتو ببینید.
  • مصرف حافظه‌ی هر کانتینر را با docker stats زیر نظر بگیرید.
  • در Compose محدودیت بگذارید، مثلاً mem_limit: 256m، تا یک سرویس همه‌ی رم را نخورد.
  • در صورت امکان از ایمیج‌های کوچک‌تر مبتنی بر alpine استفاده کنید.

سوالات متداول

فرق بسته‌ی docker.io با docker-ce چیست؟

docker.io از مخزن خود اوبونتو می‌آید و معمولاً نسخه‌ی قدیمی‌تری است. docker-ce از مخزن رسمی داکر نصب می‌شود، زودتر به‌روز می‌شود و افزونه‌ی docker compose را هم همراه دارد. هر دو را با هم نصب نکنید.

برای داکر چه سروری لازم است؟

خود Docker Engine منابع کمی مصرف می‌کند و نیاز واقعی به برنامه‌هایی بستگی دارد که اجرا می‌کنید. برای یک وب‌سرویس یا ربات، یک سرور مجازی کوچک کافی است. برای ابزارهای چندکانتینری مثل n8n یا پروژه‌های دارای پایگاه داده، ۲ گیگابایت رم یا بیشتر تجربه‌ی راحت‌تری می‌دهد.

آیا می‌توانم n8n را با داکر اجرا کنم؟

بله، داکر یکی از روش‌های پیشنهادی نصب n8n است. آموزش قدم‌به‌قدم را در مقاله‌ی نصب n8n روی سرور مجازی بخوانید.

سرور مجازی ترکیه، آماده برای داکر

سرور مجازی ترکیه ما از ماهانه ۰٫۸۹ دلار شروع می‌شود و با اوبونتو ۲۴.۰۴ چند دقیقه پس از تأیید پرداخت به‌صورت خودکار تحویل داده می‌شود؛ با دسترسی کامل root می‌توانید همه‌ی دستورهای این راهنما را فوراً اجرا کنید. اگر قرار است چند کانتینر را دائماً روشن نگه دارید، سرور VDS ما از ماهانه ۱٫۶۹ دلار با vCPU اختصاصی و رم تضمین‌شده عملکرد قابل‌پیش‌بینی‌تری دارد. همه‌ی پلن‌ها ترافیک نامحدود دارند، سرورها در استانبول هستند و پرداخت با تتر (USDT شبکه‌ی TRC20) انجام می‌شود.