«روی سیستم من کار میکرد!» جملهای است که Docker برای حذف آن ساخته شد. Docker برنامه را همراه با همه وابستگیهایش در یک بسته قابلحمل به نام کانتینر قرار میدهد تا روی لپتاپ، سرور آزمایشی و سرور عملیاتی دقیقاً یکسان اجرا شود. امروز بسیاری از ابزارهای محبوب، از n8n تا Uptime Kuma، با یک دستور Docker نصب میشوند. در این آموزش Docker از مفاهیم پایه شروع میکنیم و تا راهاندازی یک برنامه با Docker Compose روی VPS پیش میرویم.
فهرست مطالب
Docker چیست؟
Docker پلتفرمی برای اجرای برنامهها در کانتینر است. کانتینر برنامه و کتابخانههایش را از بقیه سیستم جدا میکند، اما برخلاف ماشین مجازی، سیستمعامل کامل جداگانه ندارد و از کرنل میزبان استفاده میکند؛ بنابراین در چند ثانیه اجرا میشود و منابع کمی مصرف میکند.
| کانتینر | ماشین مجازی | |
|---|---|---|
| سیستمعامل | کرنل مشترک با میزبان | سیستمعامل کامل جداگانه |
| زمان اجرا | ثانیه | دقیقه |
| حجم | دهها تا صدها مگابایت | گیگابایت |
| ایزولهسازی | خوب | قویتر |
این دو رقیب نیستند؛ معمولاً Docker داخل یک سرور مجازی اجرا میشود.
مفاهیم اصلی
- Image (ایمیج): قالب فقطخواندنی برنامه؛ مثل
nginx:1.27. ایمیجها از رجیستریهایی مثل Docker Hub دریافت میشوند. - Container: نمونه در حال اجرای یک ایمیج. از یک ایمیج میتوان چند کانتینر ساخت.
- Volume: فضای ذخیرهسازی دائمی که با حذف کانتینر پاک نمیشود.
- Network: شبکه مجازی که کانتینرها از طریق آن با نام یکدیگر را پیدا میکنند.
- Dockerfile: دستورالعمل ساخت ایمیج.
- Docker Compose: تعریف چند کانتینر مرتبط در یک فایل YAML.
نصب Docker روی Ubuntu
نسخه رسمی را از مخزن Docker نصب کنید (بسته docker.io مخزن Ubuntu معمولاً قدیمیتر است):
sudo apt update
sudo apt 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
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker --version && docker compose version
برای اجرای Docker بدون sudo، کاربر را به گروه docker اضافه کنید (sudo usermod -aG docker $USER). توجه کنید که عضویت در این گروه عملاً معادل دسترسی root است.
اولین کانتینر
docker run -d --name web -p 8080:80 nginx:1.27
-d: اجرا در پسزمینه.--name web: نام کانتینر.-p 8080:80: پورت ۸۰۸۰ میزبان به پورت ۸۰ کانتینر.
حالا http://SERVER_IP:8080 صفحه پیشفرض Nginx را نشان میدهد.
دستورهای پرکاربرد
docker ps # کانتینرهای در حال اجرا
docker ps -a # همه کانتینرها
docker logs -f web # لاگ زنده
docker exec -it web sh # ورود به شل کانتینر
docker stop web # توقف
docker start web # اجرای دوباره
docker rm web # حذف کانتینر
docker images # فهرست ایمیجها
docker pull nginx:1.27 # دریافت ایمیج
docker stats # مصرف منابع کانتینرها
docker system df # فضای مصرفی Docker
docker image prune # حذف ایمیجهای بلااستفاده
نگهداری داده با Volume
هر چیزی که داخل کانتینر ذخیره شود، با حذف کانتینر از بین میرود. دادههای دائمی (دیتابیس، فایلهای آپلودی) را در Volume یا پوشهای از میزبان نگه دارید:
docker volume create pgdata
docker run -d --name db -e POSTGRES_PASSWORD=change-me \
-v pgdata:/var/lib/postgresql/data postgres:16
بکاپ Volumeها را فراموش نکنید؛ برای دیتابیسها از ابزار خروجی خود دیتابیس استفاده کنید. روشها در بکاپ و انتقال دیتابیس.
Docker Compose
برنامههای واقعی معمولاً چند بخش دارند. با Compose همه را در یک فایل compose.yaml تعریف میکنید:
services:
app:
image: ghcr.io/example/app:1.4
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app
depends_on:
- db
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
رمزها را در فایل .env کنار آن (با دسترسی ۶۰۰) قرار دهید، سپس:
docker compose up -d # اجرا
docker compose ps # وضعیت
docker compose logs -f app # لاگ
docker compose pull && docker compose up -d # بهروزرسانی
docker compose down # توقف (Volumeها میمانند)
نمونه کامل یک پروژه واقعی را در نصب n8n با Docker ببینید.
ساخت ایمیج با Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t myapp:1.0 .
docker run -d -p 127.0.0.1:3000:3000 myapp:1.0
ترتیب دستورها مهم است: فایلهایی که کمتر تغییر میکنند (فهرست وابستگیها) اول کپی شوند تا لایهها کش شوند و ساخت سریعتر شود.
نکات استفاده روی سرور
- Docker فایروال UFW را دور میزند: پورتی که با
-p 3000:3000منتشر شود، حتی با UFW بسته، از اینترنت در دسترس است. پورتهای داخلی را روی127.0.0.1منتشر کنید و فقط از طریق Reverse Proxy در دسترس بگذارید. - نسخه ایمیج را مشخص کنید (
postgres:16نهlatest) تا بهروزرسانی ناخواسته رخ ندهد. restart: unless-stoppedتا کانتینرها پس از ریبوت بالا بیایند.- حجم لاگها را محدود کنید تا دیسک پر نشود.
- ایمیجها را فقط از منابع رسمی و معتبر بگیرید و مرتب بهروز کنید.
سختسازی کامل کانتینرها در امنیت Docker.
سوالات متداول
برای Docker چه سروری لازم است؟
برای چند سرویس سبک، VPS با ۲ هسته و ۲ تا ۴ گیگابایت RAM کافی است. دیتابیسها و برنامههای سنگینتر منابع بیشتری میخواهند. راهنمای انتخاب در انتخاب سرور مجازی.
آیا Docker روی هاست اشتراکی اجرا میشود؟
خیر؛ Docker به دسترسی root و کرنل نیاز دارد و روی VPS یا سرور اختصاصی اجرا میشود.
Docker Desktop با Docker روی سرور چه فرقی دارد؟
Docker Desktop نسخه مخصوص ویندوز و مک برای توسعه است و داخل یک ماشین مجازی سبک اجرا میشود. روی سرور لینوکس، Docker Engine مستقیم نصب میشود.
Docker یا Kubernetes؟
برای یک یا چند سرور و دهها کانتینر، Docker Compose ساده و کافی است. Kubernetes برای مدیریت کانتینرها روی خوشهای از سرورها و نیاز به مقیاسپذیری خودکار مناسب است. توضیح بیشتر در مدیریت کلاستر.
VPS آماده برای Docker
سرورهای مجازی تراست هاست با دسترسی root، دیسک NVMe و منابع اختصاصی برای اجرای کانتینرها مناسباند.