رفتن به محتوا
LoopX

نصب داکر

توی این درس یاد می‌گیری داکر را روی سیستم‌عامل خودت درست نصب کنی: روی لینوکس با مخزن رسمی (apt)، روی macOS با Docker Desktop، و روی ویندوز با Docker Desktop و WSL2. بعد با docker run hello-world نصب را بررسی می‌کنی، یاد می‌گیری چطور بدون sudo از داکر استفاده کنی (sudo usermod -aG docker $USER) و چرا گروه docker به‌معنای دسترسی root است.

کدام نسخه؟ Docker Engine یا Docker Desktop

Section titled “کدام نسخه؟ Docker Engine یا Docker Desktop”

دو چیز با اسم «داکر» نصب می‌شود و باید فرقشان را بدانی:

Docker Engine Docker Desktop
چیست؟ خود daemon و CLI، بدون رابط گرافیکی برنامه‌ی کامل: engine داخل یک VM سبک + رابط گرافیکی + ابزارها
روی چه سیستمی؟ لینوکس (سرورها) macOS، ویندوز، و لینوکس دسکتاپ
مناسب سرور و production لپ‌تاپ توسعه‌دهنده
نصب با مخزن apt/yum نصب‌کننده‌ی گرافیکی

قاعده‌ی ساده: روی لپ‌تاپ مک یا ویندوز Docker Desktop؛ روی سرور لینوکس Docker Engine.

مسیر نصب بر اساس سیستم‌عامل: سرور لینوکس مستقیم Engine می‌گیرد؛ مک و ویندوز Docker Desktop که خودش یک VM لینوکسی می‌سازد.

مثال ۱: نصب روی Ubuntu (مخزن رسمی، گام اول: کلید و مخزن)

Section titled “مثال ۱: نصب روی Ubuntu (مخزن رسمی، گام اول: کلید و مخزن)”

طبق مستندات رسمی داکر برای Ubuntu 24.04 (و 22.04 و 26.04)، اول مخزن apt داکر را اضافه می‌کنی. این بخش را روی یک Ubuntu واقعی اجرا کرده‌ام:

Terminal window
sudo apt-get update -qq 2>&1 | tail -1
sudo apt-get install -y -qq ca-certificates curl 2>&1 | tail -1
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
ls -l /etc/apt/keyrings/docker.asc
خروجی
-rw-r--r-- 1 root root 3817 Oct 3 09:42 /etc/apt/keyrings/docker.asc

دستور curl -fsSL ... -o ... کلید امضای مخزن داکر را (که apt با آن بسته‌ها را راستی‌آزمایی می‌کند) در /etc/apt/keyrings ذخیره می‌کند. بدون این کلید، apt بسته‌های داکر را قبول نمی‌کند.

مثال ۲: اضافه کردن مخزن و دیدن نسخه‌ها

Section titled “مثال ۲: اضافه کردن مخزن و دیدن نسخه‌ها”
Terminal window
sudo tee /etc/apt/sources.list.d/docker.sources <<EOT
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOT
sudo apt-get update 2>&1 | grep -i docker | head -3
apt-cache policy docker-ce | head -4
خروجی
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: arm64
Signed-By: /etc/apt/keyrings/docker.asc
Get:2 https://download.docker.com/linux/ubuntu noble InRelease [48.5 kB]
Get:4 https://download.docker.com/linux/ubuntu noble/stable arm64 Packages [78.7 kB]
docker-ce:
Installed: (none)
Candidate: 5:29.8.2-1~ubuntu.24.04~noble
Version table:

فایل docker.sources به apt می‌گوید بسته‌های داکر را از کجا بگیرد: آدرس مخزن، اسم نسخه‌ی Ubuntu (noble برای 24.04)، معماری CPU و کلید. خط Candidate نسخه‌ای است که با apt install نصب می‌شود.

مثال ۳: نصب بسته‌ها و تست

Section titled “مثال ۳: نصب بسته‌ها و تست”

طبق مستندات، بسته‌های کامل این‌ها هستند:

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

روی سرور واقعی همین را می‌زنی و بعد sudo docker run hello-world تا نصب را تست کنی. (من داخل کانتینر تست فقط docker-ce-cli را نصب کردم چون daemon داخل کانتینر ساده اجرا نمی‌شود:)

Terminal window
sudo apt-get install -y -qq docker-ce-cli 2>&1 | tail -1
docker --version
خروجی
Processing triggers for man-db (2.12.0-4build2) ...
Docker version 29.8.2, build 7fc2dff

بسته‌های اصلی: docker-ce (daemon)، docker-ce-cli (دستور docker)، containerd.io، و افزونه‌های docker-buildx-plugin و docker-compose-plugin (برای build و Compose).

مثال ۴: بدون sudo؛ گروه docker

Section titled “مثال ۴: بدون sudo؛ گروه docker”

سوکت daemon فقط برای root و اعضای گروه docker باز است. با یک daemon ایزوله (داخل یک کانتینر آزمایشی) خطای کاربر معمولی را ببین:

Terminal window
ls -l /var/run/docker.sock
adduser -D -s /bin/sh bob 2>/dev/null
su bob -c "docker ps" 2>&1 | head -3
خروجی
srw-rw---- 1 root docker 0 Oct 3 09:36 /var/run/docker.sock
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

سوکت متعلق به root:docker با دسترسی rw-rw---- است؛ کاربری که عضو آن گروه نباشد خطای permission denied while trying to connect to the docker API می‌گیرد. راه‌حل رسمی (طبق مستندات داکر):

Terminal window
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world

(معمولاً بسته‌ی docker-ce خودش گروه docker را می‌سازد؛ groupadd فقط اگر نبود لازم است.) همین روند را روی یک Ubuntu تست‌شده می‌بینی:

Terminal window
sudo groupadd docker
sudo usermod -aG docker ali
id ali
echo "--- نشست فعلی:"
id
echo "--- نشست تازه (بعد از ورود دوباره):"
sudo -u ali -i id
خروجی
uid=1001(ali) gid=1001(ali) groups=1001(ali),1002(docker)
--- نشست فعلی:
uid=1001(ali) gid=1001(ali) groups=1001(ali)
--- نشست تازه (بعد از ورود دوباره):
uid=1001(ali) gid=1001(ali) groups=1001(ali),1002(docker)

id ali گروه جدید را نشان می‌دهد، ولی نشست فعلی (id بدون اسم) هنوز آن را ندارد؛ فقط یک نشست تازه (logout و login، یا newgrp docker) آن را می‌بیند. این رایج‌ترین دلیل «گفتم اضافه کردم ولی هنوز خطا می‌دهد» است.

⚡ بررسی سریع

بعد از sudo usermod -aG docker $USER، هنوز در همان ترمینال permission denied می‌گیری. چه باید بکنی؟

مثال ۵: بررسی نصب روی macOS (اجرای واقعی)

Section titled “مثال ۵: بررسی نصب روی macOS (اجرای واقعی)”

روی مک، Docker Desktop برنامه‌ی Docker.app است (دانلود Docker.dmg از سایت رسمی و کشیدن به Applications). طبق مستندات، ابزارهای CLI زیر $HOME/.docker/bin نصب می‌شوند. بعد از اجرای اولیه (و پذیرش توافق‌نامه)، این‌ها را می‌زنی:

Terminal window
command -v docker | sed 's#/Users/[^/]*#~#'
docker --version
docker compose version
docker run --rm hello-world | head -2
خروجی
~/.docker/bin/docker
Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
Hello from Docker!

اگر خروجی command not found بود، یا برنامه را باز نکرده‌ای یا PATH درست نیست. Docker Desktop برای کار کردن باید در حال اجرا باشد (آیکون نهنگ در منوبار).

مثال ۶: ویندوز با WSL2 (نمونه)

Section titled “مثال ۶: ویندوز با WSL2 (نمونه)”

طبق مستندات داکر، برای ویندوز باید Windows 10 نسخه‌ی 22H2 (Build 19045) یا Windows 11 نسخه‌ی 23H2 (Build 22631) یا بالاتر باشی، WSL نسخه‌ی 2.1.5 به بالا نصب باشد و مجازی‌سازی در BIOS روشن باشد. مراحل (همه‌ی خروجی‌ها «نمونه» است، چون اجرای ویندوزی):

  1. اگر WSL2 را نصب نکرده‌ای، درس «WSL2 برای کاربرهای ویندوز» را انجام بده.
  2. نصب‌کننده‌ی Docker Desktop را از سایت رسمی بگیر و اجرا کن. در صفحه‌ی Configuration گزینه‌ی Use WSL 2 instead of Hyper-V را نگه دار.
  3. اگر برای «همه‌ی کاربران» نصب کردی، حسابت را به گروه docker-users اضافه کن (در PowerShell ادمین): net localgroup docker-users <user> /add
  4. Docker Desktop را باز کن و توافق‌نامه را بپذیر.
  5. در Docker Desktop: Settings ← Resources ← WSL Integration و Ubuntu خودت را روشن کن.
  6. در ترمینال Ubuntu:
Terminal window
docker run --rm hello-world
خروجی (نمونه)
Hello from Docker!
This message shows that your installation appears to be working correctly.

پشت پرده: چرا گروه docker خطرناک است؟

Section titled “پشت پرده: چرا گروه docker خطرناک است؟”

عضو گروه docker بودن عملاً یعنی root بودن. مستندات رسمی داکر همین هشدار را داده: «The docker group grants root-level privileges to the user». دلیلش این است که تو می‌توانی هر پوشه‌ی سیستم را داخل یک کانتینر mount کنی و با دسترسی root آن را بخوانی یا عوض کنی. با daemon ایزوله‌ی آزمایشی ببین:

Terminal window
docker run --rm -v /etc:/host-etc:ro alpine head -2 /host-etc/shadow
خروجی
root:*::0:::::
bin:!::0:::::

فایل /etc/shadow فقط برای root خواندنی است (در درس دسترسی‌ها دیدی)، ولی کانتینر با دسترسی root آن را خواند. پس:

  • فقط به کاربرهای مورد اعتماد دسترسی داکر بده.
  • روی سرور مشترک، به‌جای گروه docker برای همه، از sudo docker یا حالت rootless (که داکر را بدون root اجرا می‌کند) استفاده کن.
  • روی لپ‌تاپ شخصی ریسکش کم است، ولی هنوز بدان که دسترسی داکر = دسترسی root.
گام دستور
پیش‌نیازها sudo apt install ca-certificates curl
پوشه‌ی کلیدها sudo install -m 0755 -d /etc/apt/keyrings
کلید داکر sudo curl -fsSL .../gpg -o /etc/apt/keyrings/docker.asc
مخزن فایل /etc/apt/sources.list.d/docker.sources
نصب sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
تست sudo docker run hello-world
شروع خودکار sudo systemctl enable docker.service containerd.service

Engine یا Desktop: چه چیزی نصب می‌شود؟

Section titled “Engine یا Desktop: چه چیزی نصب می‌شود؟”
جزء Engine Desktop
docker CLI بله بله
daemon روی خود سیستم داخل VM
Compose و Buildx با افزونه همراه نصب
رابط گرافیکی ندارد دارد
Terminal window
su bob -c "docker ps" 2>&1 | head -2
خروجی
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

راه‌حل: کاربر را به گروه docker اضافه کن (مثال ۴) و نشست تازه بگیر؛ یا موقتاً sudo docker ....

Terminal window
sudo useradd -m -s /bin/bash -G adm dave
id dave
sudo usermod -G docker dave
id dave
sudo usermod -aG adm dave
id dave
خروجی
uid=1002(dave) gid=1003(dave) groups=1003(dave),4(adm)
uid=1002(dave) gid=1003(dave) groups=1003(dave),1002(docker)
uid=1002(dave) gid=1003(dave) groups=1003(dave),4(adm),1002(docker)

بدون -a، usermod -G کاربر را فقط در گروه مشخص‌شده نگه می‌دارد و از گروه‌های قبلی (adm در این مثال؛ در عمل sudo!) بیرون می‌اندازد. همیشه -aG بنویس. (تمیزکاری: sudo userdel -r dave.)

اگر قبلاً docker.io یا podman-docker نصب بوده، مستندات رسمی می‌گوید اول بسته‌های متعارض را حذف کنی: sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1).

روی مک و ویندوز اگر برنامه‌ی Docker Desktop در حال اجرا نباشد، docker به daemon وصل نمی‌شود (خطای Cannot connect to the Docker daemon). راه‌حل: برنامه را باز کن و منتظر بمان آیکونش سبز شود.

✎ تمرینآسان

نسخه‌ی docker CLI و نسخه‌ی Compose روی سیستمت را چاپ کن.

دیدن جواب
Terminal window
docker --version
docker compose version
خروجی
Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
✎ تمرینمتوسط

روی Ubuntu آزمایشی، کاربر mina را بساز، به گروه docker اضافه کن (بدون اینکه گروه‌های دیگرش از بین برود) و ثابت کن در یک نشست تازه عضو گروه است. (گروه docker از قبل ساخته شده.)

دیدن جواب
Terminal window
sudo groupadd -f docker
sudo useradd -m -s /bin/bash mina
sudo usermod -aG docker mina
sudo -u mina -i id
sudo userdel -r mina
خروجی
uid=1003(mina) gid=1004(mina) groups=1004(mina),1002(docker)
userdel: mina mail spool (/var/mail/mina) not found
✎ تمرینسخت

با daemon ایزوله ثابت کن «دسترسی داکر = root»: یک پوشه‌ی root-only بساز، آن را با یک کانتینر mount کن و داخل آن فایل بساز. بعد ببین مالک فایل چه کسی است.

دیدن جواب
Terminal window
mkdir -p /root/secret-dir && echo "top secret" > /root/secret-dir/data.txt && chmod 700 /root/secret-dir
docker run --rm -v /root/secret-dir:/mnt alpine sh -c 'cat /mnt/data.txt; touch /mnt/new-file'
ls -l /root/secret-dir
خروجی
top secret
total 4
-rw-r--r-- 1 root root 11 Oct 3 09:42 data.txt
-rw-r--r-- 1 root root 0 Oct 3 09:42 new-file

کانتینر با دسترسی root هم فایل محرمانه را خواند و هم فایل تازه ساخت؛ و مالک فایل جدید root است. یعنی هر کس به daemon دسترسی داشته باشد می‌تواند کارهای root را انجام دهد.

؟ آزمونک
  1. روی لپ‌تاپ مک چه چیزی نصب می‌کنی؟

  2. دستور usermod -aG docker $USER چه کاری می‌کند؟

  3. چرا عضو گروه docker بودن خطرناک است؟

  4. بعد از اضافه کردن کاربر به گروه docker، چه موقع اثر می‌کند؟

  5. در Docker Desktop ویندوز، گزینه‌ی WSL Integration کجاست؟

  • لپ‌تاپ: Docker Desktop؛ سرور لینوکس: Docker Engine با مخزن رسمی apt.
  • نصب Ubuntu: کلید GPG، فایل docker.sources، apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin، بعد docker run hello-world.
  • ویندوز: Desktop با «Use WSL 2 instead of Hyper-V» و روشن کردن WSL Integration برای Ubuntu.
  • sudo usermod -aG docker $USER (حتماً -a) و نشست تازه، برای اجرا بدون sudo.
  • گروه docker = دسترسی root؛ فقط به افراد مورد اعتماد بده.
  • در ایران ممکن است آدرس‌های داکر کند یا مسدود باشند؛ درس بعد را ببین.
برگه‌ی تقلب این درس
دستورکاری که می‌کند
docker --versionنسخه‌ی docker CLI
docker compose versionنسخه‌ی Compose
docker run hello-worldتست نصب
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginنصب بسته‌های Engine روی Ubuntu
sudo groupadd dockerساخت گروه docker (اگر نبود)
sudo usermod -aG docker $USERاضافه کردن کاربر به گروه docker
newgrp dockerفعال کردن گروه در نشست فعلی
idگروه‌های نشست فعلی
sudo systemctl enable docker.service containerd.serviceشروع خودکار با بوت
ls -l /var/run/docker.sockمالک و گروه سوکت daemon