Docker چیست؟

Docker یک Container Runtime است. یعنی به شما اجازه می‌دهد برنامه‌ها را همراه با تمام وابستگی‌هایشان (کتابخانه‌ها، تنظیمات، باینری‌ها) داخل چیزی به نام Container اجرا کنید.

چند نکته مهم:

  1. Container ماشین مجازی نیست. 
  2. Container کرنل سیستم‌عامل میزبان را استفاده می‌کند.
  3. سبک‌تر، سریع‌تر و قابل‌حمل‌تر از VM است.

مرحله 1: به‌روزرسانی سیستم

sudo apt update && sudo apt upgrade -y

مرحله 2: نصب وابستگی‌ها

sudo apt install ca-certificates curl

مرحله 3: اضافه‌کردن GPG Key رسمی Docker

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

مرحله 4: اضافه‌کردن Docker Repository

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

مرحله 5: نصب Docker Engine

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

مرحله 6: بررسی نصب

docker --version

اگر نسخه Docker نمایش داده شد، نصب موفق بوده.

اجرای Docker بدون sudo

به‌صورت پیش‌فرض Docker نیاز به sudo دارد. برای راحتی کار:

sudo usermod -aG docker $USER
newgrp docker

 بعد از این مرحله یا باید logout/login کنی یا از newgrp استفاده کنی.

اجرای اولین کانتینر

تست با hello-world

 sudo docker run hello-world

اگر پیغام خوش‌آمدگویی Docker را دیدی، همه‌چیز درست کار می‌کند.

Image و Container دقیقاً چه هستند؟

Image

Image یک قالب فقط‌خواندنی است. مثل Blueprint. مثال:

nginx
mysql
redis

Container

Container یک نمونه در حال اجرا از Image است.
تشبیه ساده:

Image = Class
Container = Object

اجرای یک کانتینر واقعی (مثال Nginx)

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

توضیح پارامترها:

--name <نام کانتینر> -p 8080:80 <پورت متصل به سیستم> -d <اجرا در پس زمینه>

حال اگر مرورگر را باز نمایید:

http://localhost:8080

صفحه پیش‌فرض Nginx را می‌بینی.

دستورات پرکاربرد Docker

نمایش کانتینرهای در حال اجرا:

docker ps

نمایش همه کانتینرها:

docker ps -a

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

docker stop my-nginx

حذف کانتینر:

docker rm my-nginx

Docker Compose چیست و چرا به آن نیاز داریم؟

 فرض کنید:

یک وب‌اپ دارید

یک دیتابیس دارید

یک Redis دارید

اجرای تک‌تک این‌ سرویس ها با docker run هم خسته‌کننده است هم غیرقابل نگهداری.

Docker Compose آمده تا بگوید:

«همه سرویس‌ها را در یک فایل تعریف کن و با یک دستور بالا بیاور»

Docker Compose چگونه کار می‌کند؟

Docker Compose از یک فایل YAML به نام docker-compose.yml استفاده می‌کند.

مثال ساده:

version: "3.9"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  redis:
    image: redis:7

و اجرا:

docker compose up -d

مزایای Docker Compose

  • تعریف زیرساخت به‌صورت کد (Infrastructure as Code)
  • اجرای همه سرویس‌ها با یک دستور
  • مدیریت راحت شبکه و وابستگی‌ها
  • مناسب محیط توسعه و تست

نصب Docker از مخازن رسمی Ubuntu

Docker علاوه‌بر مخزن رسمی خودش، در مخازن پیش‌فرض Ubuntu هم با نام پکیج docker.io در دسترس است و می‌توان آن را به‌صورت زیر نصب کرد:

sudo apt update && sudo apt install docker.io docker-compose-v2

این روش کار می‌کند و Docker بدون مشکل اجرا می‌شود، اما تفاوت‌های مهمی با نصب از مخزن رسمی Docker دارد که دانستن آن‌ها ضروری است.

تفاوت Docker مخازن Ubuntu با مخزن رسمی Docker

پکیج docker.io معمولاً نسخه‌ای قدیمی‌تر از Docker را ارائه می‌دهد

مخزن رسمی Docker همیشه آخرین نسخه پایدار را منتشر می‌کند

Ubuntu تمرکز زیادی روی پایداری دارد، نه به‌روز بودن. به همین دلیل ممکن است نسخه Docker موجود در مخازن Ubuntu چند ماه عقب‌تر باشد.

چه زمانی نصب از مخازن Ubuntu منطقی است؟

مناسب است اگر:

  • سرور شما قدیمی یا کاملاً محدود است
  • سیاست سازمان فقط اجازه استفاده از مخازن رسمی سیستم‌عامل را می‌دهد
  • Docker نقش حیاتی در زیرساخت شما ندارد

مناسب نیست اگر:

  • در نقش DevOps یا توسعه‌دهنده هستید
  • از Docker Compose استفاده می‌کنید
  • محیط توسعه یا آموزش می‌سازید
  • می‌خواهید رفتار Docker شما با مستندات رسمی یکی باشد

جمع‌بندی این بخش

  • Docker از مخازن Ubuntu قابل نصب است
  • اما برای بیشتر سناریوهای توسعه و DevOps پیشنهاد نمی‌شود
  • برای کار جدی و یادگیری صحیح، استفاده از مخزن رسمی Docker انتخاب بهتری است