نصب داکر روی سرور مجازی در بیشتر دنیا دو دقیقه کار است. در ایران یک مرحلهٔ اضافه دارد: Docker Hub به خاطر مقررات صادراتی آمریکا، IPهای ایران را مسدود کرده است. نتیجه این است که docker pull روی سرور ایران معمولاً با خطای 403 یا «denied» برمیگردد. خوشبختانه راهحل سادهای دارد.
نصب داکر روی اوبونتو
روش ۱: مخزن رسمی داکر
جدیدترین نسخه را میدهد. اگر سرور به download.docker.com دسترسی دارد:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
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
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginروش ۲: مخزن خود اوبونتو
اگر دسترسی به مخزن داکر مشکل داشت، اوبونتو بستهٔ داکر را در مخزن خودش دارد که از آینههای داخلی اوبونتو هم نصب میشود. نسخهاش کمی قدیمیتر است ولی برای بیشتر کارها کافی است:
sudo apt-get update
sudo apt-get install -y docker.io docker-compose-v2در هر دو حالت، تست کنید:
sudo systemctl enable --now docker
docker --version
docker compose versionخطای 403 و آینهٔ داخلی
چند سرویس ایرانی آینهٔ (mirror) Docker Hub راه انداختهاند: درخواست شما را میگیرند، image را از Docker Hub میآورند و تحویل میدهند. تنظیمش در فایل /etc/docker/daemon.json است:
{
"registry-mirrors": [
"https://docker.arvancloud.ir",
"https://focker.ir"
]
}sudo systemctl restart docker
docker info | grep -A3 "Registry Mirrors"
docker pull nginx:1.27چند آینه بگذارید تا اگر یکی در دسترس نبود، بعدی امتحان شود. فهرست بهروز آینههای داخلی را پروژهٔ متنباز Mirava در گیتهاب نگه میدارد؛ آینهها گاهی از دسترس خارج میشوند یا آدرس عوض میکنند، پس قبل از استفاده چک کنید.
ریسک: به آینه اعتماد میکنید
آینه یک واسطه است. در تئوری، آینهای که هک شده یا قابل اعتماد نیست میتواند به جای image اصلی، نسخهٔ دستکاریشده تحویل بدهد. برای سرویسهای مهم، image را با digest قفل کنید. digest اثر انگشت محتوای image است و اگر یک بایت عوض شود، دیگر جور نمیشود:
# روی سیستمی که به Docker Hub دسترسی مستقیم دارد، digest را بگیرید:
docker buildx imagetools inspect nginx:1.27 | grep Digest
# بعد روی سرور با همان digest بکشید:
docker pull nginx:1.27@sha256:<DIGEST>در فایل compose هم میشود image: nginx:1.27@sha256:... نوشت. به این ترتیب حتی از آینه هم دقیقاً همان image اصلی را میگیرید یا خطا میخورید.
بدون اینترنت آزاد: انتقال image با فایل
# روی سیستمی که image را دارد
docker save myapp:1.4 | gzip > myapp-1.4.tar.gz
scp myapp-1.4.tar.gz user@server:/tmp/
# روی سرور
gunzip -c /tmp/myapp-1.4.tar.gz | docker loadرجیستری خصوصی خودتان
برای imageهایی که خودتان میسازید، Docker Hub لازم نیست. رجیستری GitLab (حتی گیتلب خودمیزبان روی سرور ایران)، یا رجیستری ساده با image رسمی registry:2 روی همان سرور، مشکل دسترسی را کلاً حذف میکند. روش ساخت و دیپلوی خودکار را در مقالهٔ گیتهاب و گیتلب ببینید.
اجرا بدون sudo؟
اضافه کردن کاربر به گروه docker (sudo usermod -aG docker $USER) راحت است، ولی عضو گروه docker عملاً root سرور است، چون میتواند کانتینری با دسترسی به کل دیسک اجرا کند. فقط کاربرهایی را اضافه کنید که به root هم اعتماد دارید. جزئیات بیشتر در امنیت داکر.
منابع
- Docker Docs — Install Docker Engine on Ubuntu docs.docker.com/engine/install/ubuntu
- Docker Docs — Registry mirror docs.docker.com/docker-hub/image-library/mirror
- Docker Community Forums — IP limitations (sanctioned countries) forums.docker.com/t/is-there-any-chance-to-remvoe-ip-limitations-please/42625
- Mirava — Iranian package mirrors github.com/MiravaOrg/Mirava