برسی خلاصه و سریع Docker
/ 8 min read
Updated:Table of Contents
برسی جامع و سریع Docker: خلاصه هر چیزی که نیاز هست بدانید
Docker یکی از مهمترین ابزارهای توسعه نرمافزار مدرن است که شیوه توسعه، تست و استقرار اپلیکیشنها را کاملاً متحول کرده است. در این مقاله جامع، تمام مفاهیم اساسی Docker را از صفر برسی خواهیم کرد.
1. مفاهیم پایه
چرا Docker؟ تفاوت با VM چیست؟
یکی از بزرگترین مشکلات توسعهدهندگان این جمله است: “روی سیستم من کار میکنه!” Docker این مشکل را حل میکند.
Virtual Machine vs Docker
Virtual Machine (ماشین مجازی):
- یک سیستم عامل کامل اجرا میکند
- منابع زیادی (CPU، RAM، دیسک) مصرف میکند
- زمان راهاندازی طولانی
- ایزوله کامل اما سنگین
Docker Container:
- فقط اپلیکیشن و وابستگیهایش را شامل میشود
- از kernel میزبان استفاده میکند
- سبکوزن و سریع
- راهاندازی در چند ثانیه
# مقایسه منابع مصرفی# VM: ~2GB RAM برای یک Ubuntu ساده# Container: ~20MB RAM برای همان اپلیکیشنImage و Container دقیقاً چه هستند؟
Docker Image (تصویر)
Image مانند یک “نقشه” یا “قالب” است که شامل:
- کد اپلیکیشن
- کتابخانهها و وابستگیها
- متغیرهای محیطی
- فایلهای پیکربندی
# مشاهده لیست Image های موجودdocker images
# دانلود یک Imagedocker pull ubuntu:20.04Docker Container (کانتینر)
Container یک نمونه در حال اجرا از Image است. هر Container:
- از Image ساخته میشود
- دارای فضای فایل جداگانه است
- قابلیت start، stop، restart دارد
# اجرای یک Container از Imagedocker run ubuntu:20.04
# مشاهده Container های در حال اجراdocker ps
# مشاهده تمام Container ها (حتی متوقف شدهها)docker ps -aRegistry (مثل Docker Hub)
Registry مکانی است برای ذخیره و اشتراک Image ها. Docker Hub محبوبترین Registry عمومی است.
# جستجوی Image در Docker Hubdocker search nginx
# آپلود Image به Registry (پس از login)docker logindocker push username/my-app:latest2. کار با دستورات پایه
دستورات اساسی Docker
docker run - اجرای Container
# اجرای سادهdocker run hello-world
# اجرای تعاملیdocker run -it ubuntu:20.04 /bin/bash
# اجرای در پسزمینهdocker run -d nginx
# اجرای با نام مشخصdocker run --name my-nginx -d nginx
# اجرای با port mappingdocker run -p 8080:80 -d nginxdocker ps - مشاهده Container ها
# Container های در حال اجراdocker ps
# تمام Container هاdocker ps -a
# فقط ID هاdocker ps -q
# با فرمت سفارشیdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"docker stop - متوقف کردن Container
# توقف با نامdocker stop my-nginx
# توقف با IDdocker stop abc123
# توقف چند Container همزمانdocker stop $(docker ps -q)docker rm - حذف Container
# حذف Container متوقف شدهdocker rm my-nginx
# حذف اجباری (حتی در حال اجرا)docker rm -f my-nginx
# حذف تمام Container های متوقف شدهdocker container pruneساخت Image از Dockerfile
یک Dockerfile ساده برای اپلیکیشن Node.js:
# DockerfileFROM node:16-alpine
WORKDIR /app
COPY package*.json ./RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]# ساخت Imagedocker build -t my-node-app .
# اجرای Container از Image ساخته شدهdocker run -p 3000:3000 my-node-appdocker exec - دسترسی به Container در حال اجرا
# ورود به shell در Containerdocker exec -it my-nginx /bin/bash
# اجرای دستور مشخصdocker exec my-nginx ls -la /var/log
# مشاهده فرآیندهای در حال اجراdocker exec my-nginx ps aux3. Dockerfile - ساخت Image سفارشی
ساختار اصلی Dockerfile
# نسخه پایهFROM ubuntu:20.04
# اطلاعات سازندهLABEL maintainer="your-email@example.com"
# نصب پکیجهاRUN apt-get update && apt-get install -y \ python3 \ python3-pip \ && rm -rf /var/lib/apt/lists/*
# تنظیم دایرکتوری کارWORKDIR /app
# کپی فایلهاCOPY requirements.txt .COPY . .
# نصب وابستگیهای PythonRUN pip3 install -r requirements.txt
# تعریف portEXPOSE 5000
# تعریف متغیر محیطیENV FLASK_APP=app.py
# دستور پیشفرض اجراCMD ["python3", "app.py"]دستورات کلیدی Dockerfile
FROM - تصویر پایه
# استفاده از تصویر رسمیFROM python:3.9
# استفاده از تصویر سبکFROM python:3.9-alpine
# استفاده از نسخه مشخصFROM node:16.15.0RUN - اجرای دستورات در زمان build
# نصب پکیجهاRUN apt-get update && apt-get install -y curl
# اجرای چند دستورRUN mkdir -p /app/data \ && chown -R www-data:www-data /appCOPY و ADD - کپی فایلها
# کپی سادهCOPY app.py /app/
# کپی دایرکتوریCOPY ./src /app/src
# ADD (قابلیت استخراج فایل فشرده)ADD https://example.com/file.tar.gz /app/CMD و ENTRYPOINT - دستور اجرا
# CMD (قابل تغییر در زمان اجرا)CMD ["python", "app.py"]
# ENTRYPOINT (غیرقابل تغییر)ENTRYPOINT ["python"]CMD ["app.py"]نمونه پیادهسازی برای Flask
from flask import Flask
app = Flask(__name__)
@app.route('/')def hello(): return 'سلام از Docker!'
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)Flask==2.0.1# DockerfileFROM python:3.9-alpine
WORKDIR /app
COPY requirements.txt .RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]# ساخت و اجراdocker build -t flask-app .docker run -p 5000:5000 flask-app4. Docker Compose - مدیریت چند سرویس
Docker Compose ابزاری است برای تعریف و اجرای اپلیکیشنهای چند کانتینری.
فایل docker-compose.yml پایه
version: '3.8'
services: app: build: . ports: - "5000:5000" depends_on: - db environment: - DATABASE_URL=postgresql://user:password@db:5432/myapp
db: image: postgres:13 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:مثال کامل: وب اپلیکیشن + دیتابیس
version: '3.8'
services: nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - app
app: build: context: . dockerfile: Dockerfile environment: - NODE_ENV=production - DB_HOST=postgres - DB_NAME=myapp - DB_USER=postgres - DB_PASS=secretpassword depends_on: - postgres - redis
postgres: image: postgres:13-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: postgres POSTGRES_PASSWORD: secretpassword volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql
redis: image: redis:6-alpine command: redis-server --appendonly yes volumes: - redis_data:/data
volumes: postgres_data: redis_data:
networks: default: driver: bridgeدستورات Docker Compose
# اجرای تمام سرویسهاdocker-compose up
# اجرای در پسزمینهdocker-compose up -d
# ساخت مجدد Image هاdocker-compose build
# توقف سرویسهاdocker-compose down
# مشاهده وضعیتdocker-compose ps
# مشاهده لاگهاdocker-compose logs
# اجرای دستور در سرویس مشخصdocker-compose exec app bash5. Volumes & Networks
Volumes - مدیریت دادهها
Volume ها راهی برای ذخیره دادهها خارج از Container هستند.
انواع Volume
# Named Volumedocker volume create my-datadocker run -v my-data:/data ubuntu
# Host Mount (Bind Mount)docker run -v /host/path:/container/path ubuntu
# Anonymous Volumedocker run -v /data ubuntuمثال عملی با MySQL
version: '3.8'
services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: myapp volumes: - mysql_data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "3306:3306"
volumes: mysql_data:# مدیریت Volume هاdocker volume lsdocker volume inspect mysql_datadocker volume rm mysql_dataNetworks - شبکهسازی کانتینرها
انواع Network
# Bridge Network (پیشفرض)docker network create my-bridge
# Host Networkdocker run --network=host nginx
# None Network (بدون شبکه)docker run --network=none alpineتعریف Network سفارشی
version: '3.8'
services: frontend: image: nginx networks: - frontend-network
backend: image: node:16 networks: - frontend-network - backend-network
database: image: postgres:13 networks: - backend-network
networks: frontend-network: driver: bridge backend-network: driver: bridge internal: true# مدیریت Network هاdocker network lsdocker network inspect bridgedocker network connect my-network my-containerپروژه عملی: ساخت اپلیکیشن کامل
ساختار پروژه
my-app/├── backend/│ ├── Dockerfile│ ├── package.json│ └── server.js├── frontend/│ ├── Dockerfile│ ├── package.json│ └── src/├── nginx/│ └── nginx.conf└── docker-compose.ymlBackend (Node.js + Express)
const express = require('express');const { Pool } = require('pg');
const app = express();const port = 3000;
const pool = new Pool({ host: 'postgres', port: 5432, database: 'myapp', user: 'postgres', password: 'password',});
app.use(express.json());
app.get('/api/users', async (req, res) => { try { const result = await pool.query('SELECT * FROM users'); res.json(result.rows); } catch (err) { res.status(500).json({ error: err.message }); }});
app.listen(port, '0.0.0.0', () => { console.log(`Server running on port ${port}`);});# backend/DockerfileFROM node:16-alpine
WORKDIR /app
COPY package*.json ./RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Frontend (React)
# frontend/DockerfileFROM node:16-alpine as builder
WORKDIR /appCOPY package*.json ./RUN npm ci
COPY . .RUN npm run build
FROM nginx:alpineCOPY --from=builder /app/build /usr/share/nginx/htmlCOPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80CMD ["nginx", "-g", "daemon off;"]Docker Compose نهایی
version: '3.8'
services: frontend: build: ./frontend ports: - "80:80" depends_on: - backend
backend: build: ./backend environment: - NODE_ENV=production depends_on: - postgres volumes: - ./backend:/app - /app/node_modules
postgres: image: postgres:13-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: postgres POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql
redis: image: redis:6-alpine volumes: - redis_data:/data
volumes: postgres_data: redis_data:نکات مهم
1. بهینهسازی Image ها
# استفاده از Multi-stage BuildFROM node:16-alpine as builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production
FROM node:16-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY . .CMD ["npm", "start"]2. امنیت
# اجرا با کاربر غیر rootRUN addgroup -g 1001 -S nodejsRUN adduser -S nextjs -u 1001USER nextjs
# استفاده از .dockerignore# .dockerignorenode_modulesnpm-debug.log.git.DS_Store3. مدیریت Secrets
# استفاده از Docker Secretsversion: '3.8'
services: app: image: myapp secrets: - db_password environment: - DB_PASSWORD_FILE=/run/secrets/db_password
secrets: db_password: file: ./secrets/db_password.txtنتیجهگیری
Docker ابزاری قدرتمند است که توسعه و استقرار اپلیکیشنها را بسیار سادهتر میکند. با یادگیری مفاهیم پایه، دستورات اساسی، Dockerfile، Docker Compose و مدیریت Volume ها و Network ها، شما قادر خواهید بود اپلیکیشنهای پیچیدهای بسازید که به راحتی در هر محیطی قابل اجرا باشند.
نظر شما چیه؟