# آموزش جامع استفاده از Docker Compose
راهنمای گام به گام و حرفهای #
—
“`
نگارنوین ارائه دهنده سرور مجازی نامحدود
“`
—
## مقدمه
Docker Compose یکی از قدرتمندترین ابزارهای مدیریت کانتینرهای Docker است که به توسعهدهندگان و مدیران سیستم اجازه میدهد چندین سرویس را به صورت همزمان تعریف، پیکربندی و اجرا کنند. با استفاده از یک فایل YAML ساده، میتوانید کل محیط برنامهی خود را از یک وبسرور گرفته تا پایگاه داده و کش تعریف کرده و با یک دستور راهاندازی کنید.
در این آموزش جامع، همه چیز را از نصب تا استقرار پروژههای واقعی یاد میگیرید.
—
## پیشنیازها
قبل از شروع، موارد زیر را آماده کنید:
– **سیستم عامل:** Ubuntu ۲۲.۰۴ یا بالاتر (یا هر توزیع لینوکسی)
– **Docker Engine:** نسخه ۲۰.۱۰ یا بالاتر
– **دسترسی Root یا Sudo**
– **آشنایی پایه با خط فرمان لینوکس**

> 💡 **توجه:** برای اجرای Docker و Docker Compose به یک سرور با منابع کافی نیاز دارید.
—
## گام اول: نصب Docker
### ۱.۱ بهروزرسانی سیستم
“`bash
sudo apt update && sudo apt upgrade -y
“`
### ۱.۲ نصب پیشنیازهای Docker
“`bash
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
“`
### ۱.۳ اضافه کردن کلید GPG رسمی Docker
“`bash
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
“`bash
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 Engine
“`bash
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
“`
### ۱.۶ بررسی نصب موفق Docker
“`bash
docker –version
“`
خروجی مورد انتظار:
“`
Docker version 24.0.x, build xxxxxxx
“`
### ۱.۷ اضافه کردن کاربر به گروه Docker (اختیاری اما توصیه میشود)
“`bash
sudo usermod -aG docker $USER
newgrp docker
“`
—
## گام دوم: نصب Docker Compose
Docker Compose از نسخه Docker Desktop به صورت پیشفرض همراه با Docker ارائه میشود، اما در سرورهای لینوکسی باید جداگانه نصب شود.
### ۲.۱ دانلود آخرین نسخه Docker Compose
“`bash
sudo curl -L \
“https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)” \
-o /usr/local/bin/docker-compose
“`
### ۲.۲ تنظیم مجوز اجرا
“`bash
sudo chmod +x /usr/local/bin/docker-compose
“`
### ۲.۳ تأیید نصب موفق
“`bash
docker-compose –version
“`
خروجی:
“`
Docker Compose version v2.x.x
“`
> 🔔 **نکته:** در نسخههای جدید Docker، میتوانید از دستور `docker compose` (بدون خط تیره) هم استفاده کنید.
—
## گام سوم: ساختار فایل docker-compose.yml
فایل `docker-compose.yml` قلب Docker Compose است. این فایل با فرمت YAML نوشته میشود و تمام سرویسها، شبکهها و والیومها را تعریف میکند.
### ساختار پایهای
“`yaml
version: ‘3.8’
services:
نام-سرویس:
image: نام-ایمیج
ports:
– “پورت-هاست:پورت-کانتینر”
volumes:
– مسیر-هاست:مسیر-کانتینر
environment:
– VARIABLE=value
networks:
– نام-شبکه
networks:
نام-شبکه:
driver: bridge
volumes:
نام-والیوم:
“`
### توضیح بخشهای اصلی
| بخش | توضیح |
|—–|——-|
| `version` | نسخه فرمت Compose |
| `services` | تعریف کانتینرها و تنظیمات آنها |
| `networks` | شبکههای مجازی بین سرویسها |
| `volumes` | فضای ذخیرهسازی پایدار |
—
## گام چهارم: پروژه عملی اول – وبسرور Nginx ساده
بیایید با یک مثال ساده شروع کنیم.
### ۴.۱ ایجاد پوشه پروژه
“`bash
mkdir ~/my-nginx-project
cd ~/my-nginx-project
“`
### ۴.۲ ایجاد فایل HTML
“`bash
mkdir html
cat > html/index.html << ‘EOF’
🚀 Docker Compose در حال اجراست! #
این صفحه توسط Nginx در داخل Docker سرویس میدهد
EOF
“`
### ۴.۳ ایجاد فایل docker-compose.yml
“`bash
cat > docker-compose.yml << ‘EOF’ version: ‘۳.۸’ services: webserver: image: nginx:latest container_name: my-nginx ports: – “۸۰۸۰:۸۰” volumes: – ./html:/usr/share/nginx/html:ro restart: unless-stopped EOF “` ### ۴.۴ اجرای پروژه “`bash docker-compose up -d “` خروجی: “` [+] Running ۲/۲ ✔ Network my-nginx-project_default Created ✔ Container my-nginx Started “` ### ۴.۵ تست وبسرور “`bash curl http://localhost:۸۰۸۰ “` یا در مرورگر آدرس `http://IP-سرور:۸۰۸۰` را باز کنید. — ## گام پنجم: پروژه عملی دوم – وردپرس + MySQL این مثال واقعیترین کاربرد Docker Compose را نشان میدهد. ### ۵.۱ ایجاد پوشه پروژه “`bash mkdir ~/wordpress-docker cd ~/wordpress-docker “` ### ۵.۲ ایجاد فایل .env (متغیرهای محیطی) “`bash cat > .env << ‘EOF’ # MySQL Configuration MYSQL_ROOT_PASSWORD=RootPass@۲۰۲۴ MYSQL_DATABASE=wordpress_db MYSQL_USER=wp_user MYSQL_PASSWORD=WpPass@۲۰۲۴ # WordPress Configuration WORDPRESS_DB_HOST=db:۳۳۰۶ WORDPRESS_DB_NAME=wordpress_db WORDPRESS_DB_USER=wp_user WORDPRESS_DB_PASSWORD=WpPass@۲۰۲۴ WORDPRESS_TABLE_PREFIX=wp_ EOF “` ### ۵.۳ ایجاد فایل docker-compose.yml “`bash cat > docker-compose.yml << ‘EOF’ version: ‘۳.۸’ services: db: image: mysql:۸.۰ container_name: wordpress-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: – db_data:/var/lib/mysql networks: – wordpress-network healthcheck: test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”] timeout: 20s retries: ۱۰ wordpress: image: wordpress:latest container_name: wordpress-app restart: unless-stopped depends_on: db: condition: service_healthy ports: – “۸۰۸۰:۸۰” environment: WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST} WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME} WORDPRESS_DB_USER: ${WORDPRESS_DB_USER} WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD} WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX} volumes: – wordpress_data:/var/www/html networks: – wordpress-network phpmyadmin: image: phpmyadmin:latest container_name: wordpress-phpmyadmin restart: unless-stopped depends_on: – db ports: – “۸۰۸۱:۸۰” environment: PMA_HOST: db PMA_PORT: ۳۳۰۶ MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} networks: – wordpress-network volumes: db_data: driver: local wordpress_data: driver: local networks: wordpress-network: driver: bridge EOF “` ### ۵.۴ راهاندازی پروژه “`bash docker-compose up -d “` ### ۵.۵ مشاهده وضعیت سرویسها “`bash docker-compose ps “` خروجی: “` NAME IMAGE STATUS PORTS wordpress-mysql mysql:۸.۰ Up (healthy) ۳۳۰۶/tcp wordpress-app wordpress:latest Up ۰.۰.۰.۰:۸۰۸۰->۸۰/tcp
wordpress-phpmyadmin phpmyadmin:latest Up 0.0.0.0:8081->80/tcp
“`
—
“`
✅ نگارنوین ارائه دهنده سرور مجازی نامحدود
برای اجرای پروژههای Docker Compose به سرور پرقدرت نیاز دارید!
👉 https://negarnovin.com/unlimited-traffic-virtual-server/
“`
—
## گام ششم: پروژه عملی سوم – اپلیکیشن Node.js + Redis + Nginx
### ۶.۱ ساختار پروژه
“`bash
mkdir ~/node-redis-app
cd ~/node-redis-app
mkdir app nginx
“`
### ۶.۲ ایجاد اپلیکیشن Node.js
“`bash
cat > app/package.json << ‘EOF’ { “name”: “docker-compose-demo”, “version”: “1.0.0”, “description”: “Demo App with Redis”, “main”: “server.js”, “scripts”: { “start”: “node server.js” }, “dependencies”: { “express”: “^4.18.0”, “redis”: “^4.6.0” } } EOF “` “`bash cat > app/server.js << ‘EOF’ const express = require(‘express’); const redis = require(‘redis’); const app = express(); const PORT = 3000; const client = redis.createClient({ url: ‘redis://redis:6379’ }); client.connect().catch(console.error); app.get(‘/’, async (req, res) => {
try {
const visits = await client.incr(‘visits’);
res.json({
message: ‘سلام از Docker Compose!’,
visits: visits,
timestamp: new Date().toISOString()
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get(‘/health’, (req, res) => {
res.json({ status: ‘OK’, service: ‘node-app’ });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
EOF
“`
### ۶.۳ ایجاد Dockerfile برای اپلیکیشن
“`bash
cat > app/Dockerfile << ‘EOF’ FROM node:۱۸-alpine WORKDIR /usr/src/app COPY package*.json ./ RUN npm install –production COPY . . EXPOSE ۳۰۰۰ CMD [“npm”, “start”] EOF “` ### ۶.۴ پیکربندی Nginx به عنوان Reverse Proxy “`bash cat > nginx/nginx.conf << ‘EOF’ upstream node_app { server app:۳۰۰۰; } server { listen ۸۰; server_name localhost; location / { proxy_pass http://node_app; proxy_http_version ۱.۱; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } location /health { proxy_pass http://node_app/health; } } EOF “` ### ۶.۵ ایجاد docker-compose.yml “`bash cat > docker-compose.yml << ‘EOF’
version: ‘3.8’
services:
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: node-app
restart: unless-stopped
environment:
– NODE_ENV=production
networks:
– app-network
depends_on:
– redis
redis:
image: redis:7-alpine
container_name: app-redis
restart: unless-stopped
volumes:
– redis_data:/data
networks:
– app-network
command: redis-server –appendonly yes
nginx:
image: nginx:alpine
container_name: app-nginx
restart: unless-stopped
ports:
– “80:80”
volumes:
– ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
– app-network
depends_on:
– app
volumes:
redis_data:
driver: local
networks:
app-network:
driver: bridge
EOF
“`
### ۶.۶ Build و اجرا
“`bash
docker-compose up -d –build
“`
—
## گام هفتم: دستورات مهم Docker Compose
### ۷.۱ جدول کامل دستورات
| دستور | کاربرد |
|——-|———|
| `docker-compose up -d` | راهاندازی تمام سرویسها در پسزمینه |
| `docker-compose up –build` | Build مجدد و راهاندازی |
| `docker-compose down` | متوقف کردن و حذف کانتینرها |
| `docker-compose down -v` | متوقف کردن + حذف والیومها |
| `docker-compose ps` | نمایش وضعیت سرویسها |
| `docker-compose logs` | مشاهده لاگهای همه سرویسها |
| `docker-compose logs -f app` | لاگ زنده سرویس مشخص |
| `docker-compose restart` | ریاستارت همه سرویسها |
| `docker-compose restart app` | ریاستارت سرویس مشخص |
| `docker-compose stop` | توقف بدون حذف |
| `docker-compose start` | شروع مجدد سرویسهای متوقف |
| `docker-compose pull` | دانلود آخرین ایمیجها |
| `docker-compose build` | Build کردن سرویسها |
| `docker-compose exec app sh` | ورود به shell کانتینر |
| `docker-compose scale app=۳` | مقیاسگذاری سرویس |
### ۷.۲ مدیریت لاگها
“`bash
# مشاهده لاگ همه سرویسها
docker-compose logs
# لاگ زنده (Follow)
docker-compose logs -f
# لاگ با تعداد خط مشخص
docker-compose logs –tail=100
# لاگ یک سرویس خاص
docker-compose logs -f wordpress
# لاگ با timestamp
docker-compose logs -t
“`
### ۷.۳ اجرای دستور داخل کانتینر
“`bash
# ورود به bash کانتینر
docker-compose exec app bash
# اجرای دستور بدون ورود
docker-compose exec db mysql -u root -p
# اجرای دستور در سرویس Nginx
docker-compose exec nginx nginx -t
“`
—
## گام هشتم: مدیریت والیومها و شبکهها
### ۸.۱ انواع والیوم
“`yaml
volumes:
# Named Volume (توصیه شده)
my-data:
driver: local
services:
app:
volumes:
# Named Volume
– my-data:/app/data
# Bind Mount (اتصال مستقیم به هاست)
– ./config:/app/config:ro
# Anonymous Volume
– /app/logs
# tmpfs (حافظه موقت)
– type: tmpfs
target: /tmp
“`
### ۸.۲ انواع شبکه
“`yaml
networks:
# شبکه Bridge (پیشفرض)
frontend:
driver: bridge
# شبکه Host
host-network:
driver: host
# شبکه Overlay (برای Swarm)
overlay-network:
driver: overlay
# شبکه خارجی از پیش ساخته شده
existing-network:
external: true
name: my-existing-network
“`
### ۸.۳ جداسازی شبکهها برای امنیت بیشتر
“`yaml
version: ‘3.8’
services:
nginx:
image: nginx
networks:
– frontend # فقط به شبکه frontend دسترسی دارد
app:
image: my-app
networks:
– frontend # ارتباط با nginx
– backend # ارتباط با db
db:
image: mysql
networks:
– backend # فقط به شبکه backend دسترسی دارد
networks:
frontend:
backend:
“`
—
## گام نهم: متغیرهای محیطی و پیکربندی پیشرفته
### ۹.۱ روشهای مختلف تعریف متغیر محیطی
“`yaml
services:
app:
environment:
# روش اول: key=value مستقیم
– DATABASE_URL=mysql://user:pass@db/mydb
# روش دوم: key:value
NODE_ENV: production
# روش سوم: از فایل .env
– API_KEY=${API_KEY}
# روش چهارم: env_file
env_file:
– .env
– ./config/production.env
“`
### ۹.۲ استفاده از چند فایل Compose
“`bash
# محیط توسعه
docker-compose -f docker-compose.yml \
-f docker-compose.dev.yml \
up -d
# محیط تولید
docker-compose -f docker-compose.yml \
-f docker-compose.prod.yml \
up -d
“`
**docker-compose.dev.yml:**
“`yaml
version: ‘3.8’
services:
app:
build:
target: development
volumes:
– .:/app
– /app/node_modules
environment:
– NODE_ENV=development
ports:
– “9229:9229” # debug port
“`
**docker-compose.prod.yml:**
“`yaml
version: ‘3.8’
services:
app:
build:
target: production
restart: always
environment:
– NODE_ENV=production
deploy:
resources:
limits:
cpus: ‘0.5’
memory: 512M
“`
—
## گام دهم: Healthcheck و وابستگیهای سرویس
### ۱۰.۱ تعریف Healthcheck
“`yaml
services:
db:
image: mysql:8.0
healthcheck:
# دستور بررسی سلامت
test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”, “-u”, “root”, “-p${MYSQL_ROOT_PASSWORD}”]
interval: 30s # فاصله بین بررسیها
timeout: 10s # حداکثر زمان انتظار
retries: ۵ # تعداد تلاش مجدد
start_period: 60s # زمان شروع اولیه
redis:
image: redis:alpine
healthcheck:
test: [“CMD”, “redis-cli”, “ping”]
interval: 10s
timeout: 5s
retries: 3
nginx:
image: nginx
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost/health”]
interval: 30s
timeout: 10s
retries: 3
“`
### ۱۰.۲ مدیریت وابستگیها
“`yaml
services:
app:
depends_on:
db:
condition: service_healthy # منتظر سالم شدن DB
redis:
condition: service_healthy # منتظر سالم شدن Redis
migrations:
condition: service_completed_successfully # منتظر تکمیل
migrations:
image: my-app
command: npm run migrate
depends_on:
db:
condition: service_healthy
“`
—
“`
🌐 نگارنوین ارائه دهنده سرور مجازی نامحدود
سرور مجازی قدرتمند برای اجرای پروژههای Docker با پهنای باند نامحدود
👉 https://negarnovin.com/unlimited-traffic-virtual-server/
“`
—
## گام یازدهم: بهینهسازی و نکات امنیتی
### ۱۱.۱ محدود کردن منابع
“`yaml
services:
app:
image: my-app
deploy:
resources:
limits:
cpus: ‘۱.۰’ # حداکثر ۱ هسته CPU
memory: 512M # حداکثر ۵۱۲ مگابایت RAM
reservations:
cpus: ‘۰.۲۵’ # حداقل تضمین شده
memory: 128M
“`
### ۱۱.۲ سیاست ریاستارت
“`yaml
services:
app:
restart: unless-stopped # توصیه شده برای production
# گزینههای دیگر:
# restart: no – هرگز ریاستارت نشود
# restart: always – همیشه ریاستارت شود
# restart: on-failure – فقط در صورت خطا
# restart: on-failure:۳ – حداکثر ۳ بار تلاش
“`
### ۱۱.۳ اجرا با کاربر غیر Root
“`yaml
services:
app:
image: my-app
user: “1000:1000” # UID:GID
nginx:
image: nginx:alpine
security_opt:
– no-new-privileges:true
read_only: true
tmpfs:
– /tmp
– /var/run
– /var/cache/nginx
“`
### ۱۱.۴ بهینهسازی Dockerfile
“`dockerfile
# استفاده از Multi-Stage Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci –only=production
COPY . .
RUN npm run build
# مرحله نهایی – کوچکترین ایمیج
FROM node:18-alpine AS production
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY –from=builder –chown=appuser:appgroup /app/dist ./dist
COPY –from=builder –chown=appuser:appgroup /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
CMD [“node”, “dist/server.js”]
“`
—
## گام دوازدهم: Scaling و Load Balancing
### ۱۲.۱ مقیاسگذاری سرویسها
“`bash
# اجرای ۳ نمونه از سرویس app
docker-compose up -d –scale app=3
# بررسی
docker-compose ps
“`
### ۱۲.۲ پیکربندی Load Balancer با Nginx
“`yaml
version: ‘3.8’
services:
nginx:
image: nginx:alpine
ports:
– “80:80”
volumes:
– ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
– app
app:
build: .
expose:
– “3000”
environment:
– NODE_ENV=production
volumes:
app_logs:
“`
“`nginx
# nginx.conf
upstream app_servers {
least_conn; # الگوریتم Load Balancing
server app_1:3000;
server app_2:3000;
server app_3:3000;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
}
}
“`
—
## گام سیزدهم: مانیتورینگ با Docker Compose
“`yaml
version: ‘3.8’
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
– ./prometheus.yml:/etc/prometheus/prometheus.yml
– prometheus_data:/prometheus
ports:
– “9090:9090”
networks:
– monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
volumes:
– grafana_data:/var/lib/grafana
ports:
– “3000:3000”
environment:
– GF_SECURITY_ADMIN_PASSWORD=admin@secure
depends_on:
– prometheus
networks:
– monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
volumes:
– /:/rootfs:ro
– /var/run:/var/run:ro
– /sys:/sys:ro
– /var/lib/docker/:/var/lib/docker:ro
ports:
– “8080:8080”
networks:
– monitoring
volumes:
prometheus_data:
grafana_data:
networks:
monitoring:
driver: bridge
“`
—
## گام چهاردهم: رفع اشکال و عیبیابی
### ۱۴.۱ دستورات دیباگ
“`bash
# مشاهده لاگ کامل یک سرویس
docker-compose logs –tail=200 -f app
# بررسی کانفیگ نهایی
docker-compose config
# اعتبارسنجی فایل docker-compose.yml
docker-compose config –quiet
echo $? # ۰ = صحیح
# مشاهده اطلاعات کانتینر
docker inspect container-name
# مشاهده مصرف منابع
docker stats
# بررسی شبکهها
docker network ls
docker network inspect project_app-network
# بررسی والیومها
docker volume ls
docker volume inspect project_db_data
“`
### ۱۴.۲ مشکلات رایج و راهحل
**مشکل ۱: Port already in use**
“`bash
# یافتن فرآیند استفاده کننده از پورت
sudo lsof -i :8080
# یا
sudo netstat -tulpn | grep :8080
# کشتن فرآیند
sudo kill -9 PID
“`
**مشکل ۲: Permission denied در والیوم**
“`bash
# تنظیم مجوز صحیح
sudo chown -R 1000:1000 ./data
# یا در docker-compose.yml
volumes:
– type: bind
source: ./data
target: /app/data
“`
**مشکل ۳: سرویسها نمیتوانند یکدیگر را پیدا کنند**
“`bash
# بررسی شبکه
docker-compose exec app ping db
# بررسی DNS داخلی
docker-compose exec app nslookup db
“`
**مشکل ۴: کمبود فضای دیسک**
“`bash
# پاکسازی کامل Docker
docker system prune -a –volumes
# فقط کانتینرهای متوقف
docker container prune
# فقط ایمیجهای استفاده نشده
docker image prune -a
“`
—
## گام پانزدهم: بهترین شیوهها (Best Practices)
### ✅ موارد توصیه شده
“`yaml
version: ‘3.8’
services:
app:
# ۱. همیشه نسخه دقیق ایمیج را مشخص کنید
image: node:18.17.0-alpine
# ۲. نام container را مشخص کنید
container_name: my-app
# ۳. متغیرهای محیطی را از فایل .env بخوانید
env_file: .env
# ۴. محدودیت منابع تعریف کنید
deploy:
resources:
limits:
memory: 256M
# ۵. Healthcheck تعریف کنید
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost:3000/health”]
interval: 30s
timeout: 10s
retries: 3
# ۶. سیاست ریاستارت مناسب
restart: unless-stopped
# ۷. لاگینگ را پیکربندی کنید
logging:
driver: “json-file”
options:
max-size: “10m”
max-file: “3”
“`
### ❌ موارد اجتناب شده
“`yaml
# ❌ اشتباه – استفاده از latest بدون نسخه
image: node:latest
# ❌ اشتباه – رمزعبور مستقیم در فایل
environment:
– DB_PASSWORD=mypassword
# ❌ اشتباه – mount کامل /
volumes:
– /:/host
# ❌ اشتباه – اجرا با root
user: root
“`
—
## جمعبندی نهایی
### چکلیست استقرار در Production
– [ ] فایل `.env` در `.gitignore` قرار دارد
– [ ] نسخه دقیق تمام ایمیجها مشخص شده
– [ ] Healthcheck برای همه سرویسها تعریف شده
– [ ] محدودیت منابع تنظیم شده
– [ ] شبکههای جداگانه برای frontend/backend
– [ ] والیومهای named برای دادههای persistent
– [ ] سیاست ریاستارت مناسب
– [ ] لاگینگ پیکربندی شده
– [ ] کاربر غیر root برای کانتینرها
– [ ] Backup از والیومها برنامهریزی شده
—
## منابع بیشتر
– [مستندات رسمی Docker Compose](https://docs.docker.com/compose/)
– [Docker Hub](https://hub.docker.com/)
– [Docker Security Best Practices](https://docs.docker.com/develop/security-best-practices/)
—
“`
🚀 نگارنوین ارائه دهنده سرور مجازی نامحدود
پروژههای Docker Compose خود را روی سرورهای قدرتمند نگارنوین با پهنای باند نامحدود اجرا کنید!
👉 https://negarnovin.com/unlimited-traffic-virtual-server/
“`
—
*این مقاله توسط تیم نگارنوین تهیه و ترجمه شده است. برای دریافت سرور مجازی با پهنای باند نامحدود و اجرای پروژههای Docker، به [نگارنوین](https://negarnovin.com/unlimited-traffic-virtual-server/) مراجعه کنید.*
—
حالا اینو برای ویرایشگر کلاسیک وردپرس اینجا میذارم:
—
# 📋 نسخه HTML برای ویرایشگر کلاسیک وردپرس
“`html
مقدمه #
Docker Compose یکی از قدرتمندترین ابزارهای مدیریت کانتینرهای Docker است که به توسعهدهندگان و مدیران سیستم اجازه میدهد چندین سرویس را به صورت همزمان تعریف، پیکربندی و اجرا کنند. با استفاده از یک فایل YAML ساده، میتوانید کل محیط برنامهی خود را از یک وبسرور گرفته تا پایگاه داده و کش تعریف کرده و با یک دستور راهاندازی کنید.
برای اجرای پروژههای Docker Compose به سرور پرقدرت با پهنای باند نامحدود نیاز دارید!
پیشنیازها #
- سیستم عامل: Ubuntu ۲۲.۰۴ یا بالاتر
- Docker Engine: نسخه ۲۰.۱۰ یا بالاتر
- دسترسی Root یا Sudo
- آشنایی پایه با خط فرمان لینوکس
گام اول: نصب Docker #
۱.۱ بهروزرسانی سیستم #
sudo apt update && sudo apt upgrade -y
۱.۲ نصب پیشنیازهای Docker #
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
۱.۳ اضافه کردن کلید GPG رسمی 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 Engine #
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
۱.۶ بررسی نصب موفق Docker #
docker --version
۱.۷ اضافه کردن کاربر به گروه Docker #
sudo usermod -aG docker $USER
newgrp docker
گام دوم: نصب Docker Compose #
۲.۱ دانلود آخرین نسخه #
sudo curl -L \
"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
۲.۲ تنظیم مجوز اجرا #
sudo chmod +x /usr/local/bin/docker-compose
۲.۳ تأیید نصب موفق #
docker-compose --version
گام سوم: ساختار فایل docker-compose.yml #
version: '3.8'
services:
نام-سرویس:
image: نام-ایمیج
ports:
- "پورت-هاست:پورت-کانتینر"
volumes:
- مسیر-هاست:مسیر-کانتینر
environment:
- VARIABLE=value
networks:
- نام-شبکه
networks:
نام-شبکه:
driver: bridge
volumes:
نام-والیوم:
| بخش | توضیح |
|---|---|
version |
نسخه فرمت Compose |
services |
تعریف کانتینرها و تنظیمات آنها |
networks |
شبکههای مجازی بین سرویسها |
volumes |
فضای ذخیرهسازی پایدار |
گام چهارم: پروژه عملی – وبسرور Nginx ساده #
ایجاد پوشه پروژه #
mkdir ~/my-nginx-project
cd ~/my-nginx-project
ایجاد فایل docker-compose.yml #
version: '3.8'
services:
webserver:
image: nginx:latest
container_name: my-nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped
اجرای پروژه #
docker-compose up -d
گام پنجم: پروژه عملی – وردپرس + MySQL #
فایل .env #
MYSQL_ROOT_PASSWORD=RootPass@2024
MYSQL_DATABASE=wordpress_db
MYSQL_USER=wp_user
MYSQL_PASSWORD=WpPass@2024
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_NAME=wordpress_db
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=WpPass@2024
فایل docker-compose.yml #
version: '3.8'
services:
db:
image: mysql:8.0
container_name: wordpress-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- wordpress-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
wordpress:
image: wordpress:latest
container_name: wordpress-app
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
volumes:
- wordpress_data:/var/www/html
networks:
- wordpress-network
phpmyadmin:
image: phpmyadmin:latest
container_name: wordpress-phpmyadmin
ports:
- "8081:80"
environment:
PMA_HOST: db
networks:
- wordpress-network
volumes:
db_data:
wordpress_data:
networks:
wordpress-network:
driver: bridge
سرور مجازی قدرتمند با پهنای باند نامحدود برای میزبانی پروژههای Docker Compose
گام ششم: دستورات مهم Docker Compose #
| دستور | کاربرد |
|---|---|
docker-compose up -d |
راهاندازی در پسزمینه |
docker-compose down |
متوقف و حذف کانتینرها |
docker-compose ps |
نمایش وضعیت سرویسها |
docker-compose logs -f |
مشاهده لاگ زنده |
docker-compose restart |
ریاستارت همه سرویسها |
docker-compose exec app sh |
ورود به shell کانتینر |
docker-compose pull |
دانلود آخرین ایمیجها |
docker-compose build |
Build کردن سرویسها |
docker-compose scale app=3 |
مقیاسگذاری سرویس |
گام هفتم: مدیریت والیومها #
volumes:
my-data:
driver: local
services:
app:
volumes:
# Named Volume
- my-data:/app/data
# Bind Mount
- ./config:/app/config:ro
# Anonymous Volume
- /app/logs
گام هشتم: Healthcheck و وابستگیها #
services:
db:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
app:
depends_on:
db:
condition: service_healthy
گام نهم: بهینهسازی و امنیت #
services:
app:
image: node:18.17.0-alpine
container_name: my-app
env_file: .env
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
گام دهم: رفع اشکال و عیبیابی #
# مشاهده لاگ کامل
docker-compose logs --tail=200 -f app
# بررسی کانفیگ
docker-compose config
# مشاهده مصرف منابع
docker stats
# پاکسازی کامل
docker system prune -a --volumes
چکلیست استقرار در Production #
- ☑ فایل
.envدر.gitignoreقرار دارد - ☑ نسخه دقیق تمام ایمیجها مشخص شده
- ☑ Healthcheck برای همه سرویسها تعریف شده
- ☑ محدودیت منابع تنظیم شده
- ☑ شبکههای جداگانه frontend/backend
- ☑ والیومهای named برای دادههای persistent
- ☑ سیاست ریاستارت مناسب
- ☑ لاگینگ پیکربندی شده
- ☑ کاربر غیر root برای کانتینرها
- ☑ Backup از والیومها برنامهریزی شده
🚀 نگارنوین ارائه دهنده سرور مجازی نامحدود #
پروژههای Docker Compose خود را روی سرورهای قدرتمند نگارنوین با پهنای باند نامحدود اجرا کنید!
👈 مشاهده سرور مجازی نامحدود
این مقاله توسط تیم نگارنوین تهیه شده است. برای دریافت سرور مجازی با پهنای باند نامحدود و اجرای پروژههای Docker، به نگارنوین مراجعه کنید.
