Docker روی VPS — راهنمای کامل نصب و اجرا

آموزش گام‌به‌گام نصب Docker Engine و Docker Compose روی VPS اوبونتو. از نصب اولیه تا اجرای پروژه‌های multi-container با docker compose، مدیریت volume، شبکه و امنیت کانتینرها.

نویسنده

تیم فنی زیر ساخت افرادین

دسته‌بندی

آموزش

زمان مطالعه

02 Mins read

تاریخ انتشار

30 Jul, 2026

Docker روی VPS — راهنمای کامل نصب و اجرا

داشتن یک VPS خوب عالی است، اما مدیریت دستی سرویس‌ها—از PHP و Nginx گرفته تا MySQL و Redis—می‌تواند کابوس باشد. Docker این مشکل را حل می‌کند: هر سرویس در کانتینر ایزوله خودش اجرا می‌شود، با یک دستور docker compose up -d کل پروژه بالا می‌آید، و بدترین سناریو این است که با docker compose down همه چیز را ریست کنید.

در این راهنما، از صفر مطلق شروع می‌کنیم—نصب Docker روی VPS تازه، اجرای اولین کانتینر، نوشتن فایل docker-compose.yml برای یک پروژه واقعی، و در نهایت تنظیمات امنیتی و monitoring.

پیش‌نیازها

  • VPS با Ubuntu 22.04 یا 24.04 (حداقل ۲ گیگ RAM، توصیه ۴ گیگ)
  • دسترسی SSH با کاربر sudo
  • حداقل ۲۰ گیگابایت فضای خالی (Imageهای Docker سریع حجم می‌گیرند!)

گام اول — اتصال و آماده‌سازی سرور

ssh your-user@vps-ip
sudo apt update && sudo apt upgrade -y

پکیج‌های پایه را نصب کنید:

sudo apt install -y ca-certificates curl gnupg lsb-release

گام دوم — نصب Docker Engine (روش رسمی)

Docker را از مخزن رسمی Docker—نه مخزن Ubuntu—نصب می‌کنیم. نسخه Ubuntu قدیمی است و باگ دارد.

# اضافه کردن GPG key رسمی Docker
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# اضافه کردن مخزن Docker
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

حالا Docker را نصب کنید:

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

نکته مهم: docker-compose-plugin همان Docker Compose V2 است که به صورت docker compose (با space، نه dash) اجرا می‌شود. نسخه قدیمی docker-compose منسوخ شده.

گام سوم — اجرای Docker بدون sudo

به صورت پیش‌فرض فقط root می‌تواند Docker اجرا کند. برای راحتی، کاربر خود را به گروه docker اضافه کنید:

sudo usermod -aG docker $USER
newgrp docker

حالا بدون sudo تست کنید:

docker run hello-world

اگر پیام Hello from Docker! را دیدید، همه چیز آماده است.

گام چهارم — اولین پروژه Docker: Nginx

بیایید با یک مثال ساده مطمئن شویم همه چیز کار می‌کند:

docker run -d --name my-nginx -p 8080:80 nginx:alpine

حالا در مرورگر به http://your-vps-ip:8080 بروید—باید صفحه پیش‌فرض Nginx را ببینید.

متوقف کردن کانتینر:

docker stop my-nginx
docker rm my-nginx

گام پنجم — Docker Compose: اجرای پروژه واقعی

حالا یک پروژه واقعی با Docker Compose اجرا می‌کنیم. فرض کنید یک اپلیکیشن Node.js با MongoDB دارید.

ساخت پوشه پروژه:

mkdir ~/myapp && cd ~/myapp

فایل docker-compose.yml را بسازید:

version: '3.8'

services:
  app:
    image: node:20-alpine
    container_name: myapp-node
    working_dir: /app
    volumes:
      - ./app:/app
    ports:
      - "3000:3000"
    command: sh -c "npm install && node server.js"
    depends_on:
      mongo:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - app-network

  mongo:
    image: mongo:7
    container_name: myapp-mongo
    volumes:
      - mongo_data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-secret}
    restart: unless-stopped
    networks:
      - app-network
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh --quiet
      interval: 10s
      timeout: 5s
      retries: 5

  mongo-express:
    image: mongo-express:latest
    container_name: myapp-mongo-ui
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_PASSWORD:-secret}
      ME_CONFIG_MONGODB_URL: mongodb://admin:${MONGO_PASSWORD:-secret}@mongo:27017/
    depends_on:
      mongo:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mongo_data:

اجرای پروژه:

docker compose up -d

مشاهده وضعیت:

docker compose ps
docker compose logs -f

متوقف کردن:

docker compose down

گام ششم — مدیریت Volume‌ها و بک‌آپ

داده‌های داخل کانتینر ephemeral هستند—با حذف کانتینر، داده‌ها از بین می‌روند. برای ذخیره دائمی از Volume استفاده کنید.

مشاهده Volumeها:

docker volume ls

بک‌آپ گرفتن از Volume (مثلاً دیتابیس MongoDB):

docker run --rm -v myapp_mongo_data:/data -v $(pwd):/backup alpine \
  tar czf /backup/mongo-backup-$(date +%Y%m%d).tar.gz -C /data .

بازگردانی بک‌آپ:

docker run --rm -v myapp_mongo_data:/data -v $(pwd):/backup alpine \
  tar xzf /backup/mongo-backup-20260801.tar.gz -C /data

گام هفتم — امنیت کانتینرها

۱. همیشه از imageهای رسمی و trusted استفاده کنید

# خوب ✅
docker pull node:20-alpine
docker pull nginx:alpine

# بد ❌
docker pull some-random-user/unknown-image

۲. کانتینرها را با کاربر non-root اجرا کنید

services:
  app:
    image: node:20-alpine
    user: "1000:1000"  # UID:GID کاربر غیر-root

۳. Resource Limits تنظیم کنید

بدون limit، یک کانتینر می‌تواند تمام RAM و CPU سرور را مصرف کند:

services:
  app:
    image: node:20-alpine
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

۴. اسکن امنیتی imageها

docker scout quickview nginx:alpine
docker scout cves nginx:alpine

۵. فایروال Docker را دور نزنید

Docker به صورت پیش‌فرض قوانین iptables را دستکاری می‌کند و ممکن است پورت‌ها را بدون اجازه UFW باز کند. برای جلوگیری:

sudo nano /etc/docker/daemon.json
{
  "iptables": false,
  "ip-forward": false
}

و سپس:

sudo systemctl restart docker

گام هشتم — Monitoring و عیب‌یابی

Docker Stats (لحظه‌ای)

docker stats

Portainer — مدیریت گرافیکی Docker

docker volume create portainer_data
docker run -d \
  -p 9443:9443 -p 8000:8000 \
  --name portainer --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

حالا در مرورگر به https://your-vps-ip:9443 بروید—یک داشبورد کامل برای مدیریت Docker دارید.

لاگ‌های متمرکز با Dozzle

docker run -d --name dozzle \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -p 8080:8080 \
  amir20/dozzle:latest

پاکسازی دوره‌ای

Docker imageهای قدیمی و استفاده نشده می‌توانند گیگابایت‌ها فضا اشغال کنند:

# پاکسازی imageهای بدون تگ
docker image prune -a -f

# پاکسازی volumeهای استفاده نشده
docker volume prune -f

# پاکسازی همه چیز (با احتیاط!)
docker system prune -a --volumes -f

یک cron job هفتگی برای پاکسازی خودکار تنظیم کنید:

crontab -e
0 3 * * 0 docker system prune -a -f --filter "until=168h"

مقایسه: Docker روی VPS vs Kubernetes

معیارDocker Compose روی VPSKubernetes
پیچیدگی راه‌اندازی⭐ کم⭐⭐⭐⭐⭐ بالا
مناسب برای۱-۱۰ کانتینر، استارتاپ‌ها۲۰+ کانتینر، Enterprise
Auto-scaling❌ دستی✅ خودکار
Load balancingنیاز به Nginx دستی✅ داخلی (Ingress)
هزینهفقط هزینه VPSهزینه cluster + management
یادگیری۱-۲ روز۱-۳ ماه

برای ۹۰٪ پروژه‌ها، Docker Compose روی یک VPS خوب بیش از حد کافی است. وقتی به ۱۰+ میکروسرویس رسیدید و نیاز به auto-scaling و zero-downtime deployment دارید، آن وقت Kubernetes را در نظر بگیرید.


نکته تیم افرادین: سرورهای ابری افرادین با Docker Engine و Docker Compose از پیش نصب شده و بهینه‌شده عرضه می‌شوند. کافیست فایل docker-compose.yml خود را push کنید و پروژه در چند دقیقه بالا می‌آید. Portainer و Dozzle هم با یک کلیک قابل نصب هستند.

پست های مرتبط

Deploy Laravel روی Ubuntu — راهنمای گام‌به‌گام استقرار

پروژه Laravel شما روی لوکال کار می‌کند، تمام تست‌ها پاس می‌شوند، و حالا نوبت به هیجان‌انگیزترین بخش رسیده: Deploy روی سرور واقعی. اما اگر اولین بار است که یک پروژه Laravel را روی Ubuntu دیپلوی می‌کنید، ممکن است با انبوهی از تنظیمات—از Nginx و PHP-FPM گرفته تا Supervisor و SSL—روبه‌رو شوید. در این راهنما، تمام مراحل را قدم‌به‌قدم و به زبان ساده توضیح می‌دهیم. فرض می‌کنیم شما یک VPS با Ubuntu 22.04 LTS دارید و دسترسی root یا کاربر sudo به آن دارید. پیش‌نیازها قبل از شروع، مطمئن شوید که موارد زیر را دارید:یک VPS لینوکسی با Ubuntu 22.04 LTS (حداقل ۲ گیگ RAM، توصیه ۴ گیگ) دسترسی SSH به سرور با کلید یا رمز عبور دامنه متصل به سرور (A Record تنظیم شده باشد) پروژه Laravel آماده روی GitHub / GitLabگام اول — اتصال به سرور و بروزرسانی اولین قدم، اتصال به VPS از طریق SSH است: ssh root@your-server-ipپس از ورود، همیشه اول سیستم را بروزرسانی کنید: sudo apt update && sudo apt upgrade -y sudo apt install -y software-properties-common curl wget unzip gitیک کاربر غیر-root برای امنیت بیشتر بسازید: adduser deployer usermod -aG sudo deployerحالا با کاربر جدید ادامه می‌دهیم: su - deployerگام دوم — نصب PHP 8.3 و افزونه‌های لازم Laravel 11 به PHP 8.2 یا بالاتر نیاز دارد. ما PHP 8.3 را از مخزن Ondřej Surý نصب می‌کنیم: sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install -y php8.3 php8.3-fpm php8.3-cli \ php8.3-mbstring php8.3-xml php8.3-curl \ php8.3-mysql php8.3-sqlite3 php8.3-redis \ php8.3-gd php8.3-zip php8.3-bcmath php8.3-intlنکته: افزونه php8.3-redis را فقط اگر از Redis استفاده می‌کنید نصب کنید. برای پروژه‌های ساده، php8.3-sqlite3 هم کافی است. سرویس PHP-FPM را اجرا و فعال کنید: sudo systemctl enable php8.3-fpm sudo systemctl start php8.3-fpmتأیید کنید که PHP-FPM در حال اجراست: sudo systemctl status php8.3-fpmگام سوم — نصب Composer Composer مدیر بسته‌های PHP است و برای Laravel ضروری: cd ~ curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer composer --versionباید خروجی مشابه Composer version 2.7.x ببینید. گام چهارم — نصب Nginx Nginx به عنوان وب‌سرور اصلی و Reverse Proxy عمل می‌کند: sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginxحالا باید در مرورگر IP سرور خود را ببینید—صفحه پیش‌فرض Nginx. تنظیم فایل Nginx برای Laravel یک فایل کانفیگ جدید بسازید: sudo nano /etc/nginx/sites-available/your-domain.comمحتوای زیر را قرار دهید (دامنه و مسیر را جایگزین کنید): server { listen 80; server_name your-domain.com www.your-domain.com; root /var/www/your-project/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }فعال‌سازی کانفیگ: sudo ln -s /etc/nginx/sites-available/your-domain.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginxگام پنجم — نصب MySQL (یا MariaDB) sudo apt install -y mysql-server sudo mysql_secure_installationدر mysql_secure_installation رمز root را تنظیم کنید و به تمام سوالات Yes بگویید. ساخت دیتابیس و کاربر: sudo mysql -u root -p CREATE DATABASE laravel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'strong-password-here'; GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost'; FLUSH PRIVILEGES; EXIT;گام ششم — نصب Node.js (برای کامپایل Assets) پروژه‌های Laravel معمولاً از Vite برای مدیریت assets استفاده می‌کنند: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs node --version # باید v20.x.x باشد npm --versionگام هفتم — کلون و دیپلوی پروژه cd /var/www sudo git clone https://github.com/your-username/your-repo.git your-project sudo chown -R deployer:www-data your-project cd your-projectنصب dependencies: composer install --no-dev --optimize-autoloader npm install npm run buildتنظیم فایل .env: cp .env.example .env nano .envمقادیر زیر را متناسب با پروژه خود تنظیم کنید: APP_NAME="پروژه شما" APP_ENV=production APP_DEBUG=false APP_URL=https://your-domain.comDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_db DB_USERNAME=laravel_user DB_PASSWORD=strong-password-hereتولید Application Key و اجرای migration: php artisan key:generate php artisan storage:link php artisan migrate --force php artisan optimizeگام هشتم — تنظیم Supervisor برای Queue Worker اگر پروژه شما از Queue استفاده می‌کند، باید یک worker دائمی اجرا کنید: sudo apt install -y supervisorفایل کانفیگ Supervisor بسازید: sudo nano /etc/supervisor/conf.d/laravel-worker.conf[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/your-project/artisan queue:work --sleep=3 --tries=3 --max-time=3600 autostart=true autorestart=true stopasgroup=true killasgroup=true user=deployer numprocs=2 redirect_stderr=true stdout_logfile=/var/www/your-project/storage/logs/worker.log stopwaitsecs=3600فعال‌سازی worker: sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*وضعیت worker را چک کنید: sudo supervisorctl statusگام نهم — تنظیم SSL با Certbot sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com -d www.your-domain.comCertbot به صورت خودکار SSL را در Nginx تنظیم می‌کند و تمدید خودکار را فعال می‌کند. تست تمدید خودکار: sudo certbot renew --dry-runگام دهم — تنظیم Cron برای Scheduler Laravel Scheduler وظایف زمان‌بندی شده را مدیریت می‌کند: crontab -eاین خط را اضافه کنید: * * * * * php /var/www/your-project/artisan schedule:run >> /dev/null 2>&1چک‌لیست نهایی قبل از تحویل پروژه، این موارد را دوباره بررسی کنید: APP_DEBUG=false در فایل .env SSL فعال و معتبر است فایروال فقط پورت‌های 22، 80 و 443 را باز دارد: sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw enable Supervisor worker فعال و running است composer install با فلگ --no-dev اجرا شده cron job برای Scheduler تنظیم شده بک‌آپ خودکار دیتابیس تنظیم شدهتبریک! 🎉 پروژه Laravel شما روی Ubuntu 22.04 در حال اجراست. برای پروژه‌های بزرگ‌تر که نیاز به مقیاس‌پذیری دارند، می‌توانید از Docker + Docker Compose یا Kubernetes استفاده کنید که در مقاله بعدی به آن می‌پردازیم.نکته تیم افرادین: اگر زمان کافی برای طی این مراحل را ندارید، سرورهای ابری افرادین با Laravel Stack از پیش نصب شده (PHP 8.3، MySQL، Redis، Nginx، Supervisor و Certbot) در کمتر از ۵ دقیقه آماده تحویل هستند. کافیست پروژه خود را push کنید.

تیم فنی زیر ساخت افرادین

تیم فنی و مهندسی

28 Jul, 2026