توی این درس یاد میگیری داکر را روی سیستمعامل خودت درست نصب کنی: روی لینوکس با مخزن رسمی (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.
مثالهای عملی
Section titled “مثالهای عملی”مثال ۱: نصب روی Ubuntu (مخزن رسمی، گام اول: کلید و مخزن)
Section titled “مثال ۱: نصب روی Ubuntu (مخزن رسمی، گام اول: کلید و مخزن)”طبق مستندات رسمی داکر برای Ubuntu 24.04 (و 22.04 و 26.04)، اول مخزن apt داکر را اضافه میکنی. این بخش را روی یک Ubuntu واقعی اجرا کردهام:
sudo apt-get update -qq 2>&1 | tail -1sudo apt-get install -y -qq ca-certificates curl 2>&1 | tail -1sudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascls -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 “مثال ۲: اضافه کردن مخزن و دیدن نسخهها”sudo tee /etc/apt/sources.list.d/docker.sources <<EOTTypes: debURIs: https://download.docker.com/linux/ubuntuSuites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOTsudo apt-get update 2>&1 | grep -i docker | head -3apt-cache policy docker-ce | head -4Types: debURIs: https://download.docker.com/linux/ubuntuSuites: nobleComponents: stableArchitectures: arm64Signed-By: /etc/apt/keyrings/docker.ascGet: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 “مثال ۳: نصب بستهها و تست”طبق مستندات، بستههای کامل اینها هستند:
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 داخل کانتینر ساده اجرا نمیشود:)
sudo apt-get install -y -qq docker-ce-cli 2>&1 | tail -1docker --versionProcessing 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 ایزوله (داخل یک کانتینر آزمایشی) خطای کاربر معمولی را ببین:
ls -l /var/run/docker.sockadduser -D -s /bin/sh bob 2>/dev/nullsu bob -c "docker ps" 2>&1 | head -3srw-rw---- 1 root docker 0 Oct 3 09:36 /var/run/docker.sockpermission 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 میگیرد. راهحل رسمی (طبق مستندات داکر):
sudo groupadd dockersudo usermod -aG docker $USERnewgrp dockerdocker run hello-world(معمولاً بستهی docker-ce خودش گروه docker را میسازد؛ groupadd فقط اگر نبود لازم است.) همین روند را روی یک Ubuntu تستشده میبینی:
sudo groupadd dockersudo usermod -aG docker aliid aliecho "--- نشست فعلی:"idecho "--- نشست تازه (بعد از ورود دوباره):"sudo -u ali -i iduid=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 نصب میشوند. بعد از اجرای اولیه (و پذیرش توافقنامه)، اینها را میزنی:
command -v docker | sed 's#/Users/[^/]*#~#'docker --versiondocker compose versiondocker run --rm hello-world | head -2~/.docker/bin/dockerDocker version 29.8.1, build 4a63305Docker 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 روشن باشد. مراحل (همهی خروجیها «نمونه» است، چون اجرای ویندوزی):
- اگر WSL2 را نصب نکردهای، درس «WSL2 برای کاربرهای ویندوز» را انجام بده.
- نصبکنندهی Docker Desktop را از سایت رسمی بگیر و اجرا کن. در صفحهی Configuration گزینهی Use WSL 2 instead of Hyper-V را نگه دار.
- اگر برای «همهی کاربران» نصب کردی، حسابت را به گروه
docker-usersاضافه کن (در PowerShell ادمین):net localgroup docker-users <user> /add - Docker Desktop را باز کن و توافقنامه را بپذیر.
- در Docker Desktop: Settings ← Resources ← WSL Integration و Ubuntu خودت را روشن کن.
- در ترمینال Ubuntu:
docker run --rm hello-worldHello 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 ایزولهی آزمایشی ببین:
docker run --rm -v /etc:/host-etc:ro alpine head -2 /host-etc/shadowroot:*::0:::::bin:!::0:::::فایل /etc/shadow فقط برای root خواندنی است (در درس دسترسیها دیدی)، ولی کانتینر با دسترسی root آن را خواند. پس:
- فقط به کاربرهای مورد اعتماد دسترسی داکر بده.
- روی سرور مشترک، بهجای گروه
dockerبرای همه، ازsudo dockerیا حالت rootless (که داکر را بدون root اجرا میکند) استفاده کن. - روی لپتاپ شخصی ریسکش کم است، ولی هنوز بدان که دسترسی داکر = دسترسی root.
جدولهای مرجع
Section titled “جدولهای مرجع”مراحل نصب Engine روی Ubuntu
Section titled “مراحل نصب Engine روی Ubuntu”| گام | دستور |
|---|---|
| پیشنیازها | 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 | با افزونه | همراه نصب |
| رابط گرافیکی | ندارد | دارد |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) خطای دسترسی به سوکت
Section titled “۱) خطای دسترسی به سوکت”su bob -c "docker ps" 2>&1 | head -2permission denied while trying to connect to the docker API at unix:///var/run/docker.sockراهحل: کاربر را به گروه docker اضافه کن (مثال ۴) و نشست تازه بگیر؛ یا موقتاً sudo docker ....
۲) فراموش کردن -a در usermod
Section titled “۲) فراموش کردن -a در usermod”sudo useradd -m -s /bin/bash -G adm daveid davesudo usermod -G docker daveid davesudo usermod -aG adm daveid daveuid=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.)
۳) نصب بستههای متعارض
Section titled “۳) نصب بستههای متعارض”اگر قبلاً 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 را باز نکردن
Section titled “۴) Docker Desktop را باز نکردن”روی مک و ویندوز اگر برنامهی Docker Desktop در حال اجرا نباشد، docker به daemon وصل نمیشود (خطای Cannot connect to the Docker daemon). راهحل: برنامه را باز کن و منتظر بمان آیکونش سبز شود.
نسخهی docker CLI و نسخهی Compose روی سیستمت را چاپ کن.
دیدن جواب
docker --versiondocker compose versionDocker version 29.8.1, build 4a63305Docker Compose version v5.5.1روی Ubuntu آزمایشی، کاربر mina را بساز، به گروه docker اضافه کن (بدون اینکه گروههای دیگرش از بین برود) و ثابت کن در یک نشست تازه عضو گروه است. (گروه docker از قبل ساخته شده.)
دیدن جواب
sudo groupadd -f dockersudo useradd -m -s /bin/bash minasudo usermod -aG docker minasudo -u mina -i idsudo userdel -r minauid=1003(mina) gid=1004(mina) groups=1004(mina),1002(docker)userdel: mina mail spool (/var/mail/mina) not foundبا daemon ایزوله ثابت کن «دسترسی داکر = root»: یک پوشهی root-only بساز، آن را با یک کانتینر mount کن و داخل آن فایل بساز. بعد ببین مالک فایل چه کسی است.
دیدن جواب
mkdir -p /root/secret-dir && echo "top secret" > /root/secret-dir/data.txt && chmod 700 /root/secret-dirdocker run --rm -v /root/secret-dir:/mnt alpine sh -c 'cat /mnt/data.txt; touch /mnt/new-file'ls -l /root/secret-dirtop secrettotal 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 را انجام دهد.
آزمونک
Section titled “آزمونک”روی لپتاپ مک چه چیزی نصب میکنی؟
مک هستهی لینوکس ندارد؛ Docker Desktop یک VM لینوکسی همراه میآورد.
دستور usermod -aG docker $USER چه کاری میکند؟
-a یعنی append (اضافه کردن) و -G یعنی گروههای تکمیلی.
چرا عضو گروه docker بودن خطرناک است؟
مستندات داکر میگوید گروه docker امتیازهای root میدهد.
بعد از اضافه کردن کاربر به گروه docker، چه موقع اثر میکند؟
گروههای یک پروسه موقع شروع نشست تعیین میشوند.
در Docker Desktop ویندوز، گزینهی WSL Integration کجاست؟
همانجا Ubuntu خودت را برای استفاده از داکر روشن میکنی.
جمعبندی
Section titled “جمعبندی”- لپتاپ: 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 |