crictl
containerd
یا cri-o
ctr
برای بارگذاری دستی تصویرcrictl
و containerd
containerd
nginx.tar
crictl
و containerd
crictl
برای بارگذاریcontainerd
ctr
و crictl
ctr
چیست؟crictl
چیست؟ctr
crictl
crictl
برای containerd
registries.yaml
registry
registry
بهعنوان کشHarbor
بهعنوان یک Docker MirrorHarbor
/var/lib/docker/registry
tun2socks
برای تغییر مسیر کل ترافیکبرای دور زدن تحریمهای Docker Hub و استفاده از مخازن داکری، چند راهکار وجود دارد:
برخی از سرورهای Mirror برای داکر وجود دارند که میتوانند تصاویر را کش کنند. میتوانید از سرویسهای مانند:
به عنوان مثال، برای استفاده از Aliyun:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.aliyuncs.com"]
}
EOF
sudo systemctl restart docker
یک راه ساده این است که از VPN یا یک سرور پروکسی برای دسترسی به Docker Hub استفاده کنید.
اگر یک سرور VPS خارج از ایران دارید، میتوانید از SOCKS5 Proxy استفاده کنید:
export all_proxy=socks5://your-proxy-ip:port
docker pull nginx
اگر نیاز به تصاویر خاصی دارید، میتوانید یک ریجستری خصوصی داکر راهاندازی کنید و تصاویر مورد نیاز را از طریق یک سرور دیگر (خارج از ایران) دانلود و در آن ذخیره کنید:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
docker tag myimage localhost:5000/myimage
docker push localhost:5000/myimage
docker pull localhost:5000/myimage
GitHub یک جایگزین برای Docker Hub دارد که میتوانید بهجای آن استفاده کنید. برای استفاده از GitHub Container Registry:
echo "YOUR_GITHUB_TOKEN" | docker login ghcr.io -u YOUR_GITHUB_USERNAME --password-stdin
docker pull ghcr.io/nginx/nginx
اگر به سرور VPS یا سیستم خارج از ایران دسترسی دارید، میتوانید تصاویر را در یک سیستم دیگر دانلود و سپس با docker save
و docker load
منتقل کنید:
docker pull nginx
docker save nginx -o nginx.tar
scp
یا فلش)docker load -i nginx.tar
✅ اگر VPN دارید: مستقیماً از آن استفاده کنید.
✅ اگر به VPS دسترسی دارید: از docker save/load
استفاده کنید.
✅ اگر مشکل جدی دارید: یک ریجستری داخلی راهاندازی کنید.
✅ برای جایگزین Docker Hub: از GitHub Container Registry یا Alibaba Cloud استفاده کنید.
crictl
یک ابزار CLI برای تعامل با Container Runtime Interface (CRI) است و معمولاً در محیطهایی مثل Kubernetes و Containerd استفاده میشود. به دلیل تحریمها، ممکن است در دانلود تصاویر از Docker Hub یا سایر رجیستریهای عمومی مشکل داشته باشید. در ادامه روشهای دور زدن این محدودیت برای crictl
را بررسی میکنیم.
crictl
به Container Runtime مثل containerd
یا cri-o
متصل میشود، بنابراین باید در تنظیمات آن، یک Mirror رجیستری اضافه کنیم.
containerd
:
sudo nano /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
را پیدا کرده و آن را به شکل زیر تغییر دهید:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.aliyuncs.com", "https://mirror.gcr.io"]
containerd
:
sudo systemctl restart containerd
اکنون crictl
هنگام کشیدن تصاویر، بهجای docker.io
از mirrorهای جایگزین استفاده میکند.
چون crictl
از containerd
یا cri-o
استفاده میکند، باید Proxy را در تنظیمات آنها اضافه کنیم.
/etc/systemd/system/containerd.service.d/http-proxy.conf
را ایجاد کنید:
sudo mkdir -p /etc/systemd/system/containerd.service.d
sudo nano /etc/systemd/system/containerd.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://your-proxy-ip:port"
Environment="HTTPS_PROXY=http://your-proxy-ip:port"
Environment="NO_PROXY=localhost,127.0.0.1"
systemd
و ریاستارت containerd
:
sudo systemctl daemon-reload
sudo systemctl restart containerd
اکنون crictl
هنگام دانلود، از پراکسی استفاده میکند.
اگر مشکل جدی در دانلود دارید، میتوانید یک ریجستری داخلی تنظیم کنید.
docker run -d -p 5000:5000 --restart=always --name registry registry:2
containerd
:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."myregistry.local"]
endpoint = ["http://192.168.1.100:5000"]
containerd
:
sudo systemctl restart containerd
crictl pull myregistry.local:5000/nginx
crictl
write:packages
echo "YOUR_GITHUB_TOKEN" | crictl login ghcr.io -u YOUR_GITHUB_USERNAME --password-stdin
crictl pull ghcr.io/nginx/nginx
crictl pull docker.io/library/nginx
crictl image save -o nginx.tar nginx
از طریق scp
، rsync
یا فلش:
scp nginx.tar user@yourserver:/path
crictl image load -i nginx.tar
✅ بهترین گزینه: تنظیم mirror برای رجیستری
✅ اگر امکانش هست: استفاده از VPN/Proxy
✅ برای تیمهای داخلی: راهاندازی رجیستری خصوصی
✅ برای مخازن جایگزین: GHCR یا Aliyun Registry
✅ در موارد اضطراری: دانلود و انتقال دستی تصاویر
به نظر میرسد که دستور crictl image load -i nginx.tar
به درستی اجرا نمیشود. برای بررسی مشکل و رفع آن، مراحل زیر را انجام دهید:
containerd
یا cri-o
crictl
معمولاً به containerd
یا cri-o
متصل میشود. ابتدا بررسی کنید که کدام یک در حال اجراست:
sudo crictl info
اگر پیام خطا دریافت کردید، بررسی کنید که containerd
اجرا شده باشد:
sudo systemctl status containerd
اگر اجرا نشده بود، آن را راهاندازی کنید:
sudo systemctl restart containerd
اطمینان حاصل کنید که nginx.tar
در مسیر صحیح قرار دارد:
ls -lh nginx.tar
همچنین بررسی کنید که فایل به درستی ذخیره شده باشد:
file nginx.tar
خروجی باید چیزی شبیه این باشد:
nginx.tar: POSIX tar archive
اگر فرمت tar archive
نبود، ممکن است فایل خراب باشد یا فرمت آن اشتباه باشد.
ctr
برای بارگذاری دستی تصویراگر crictl image load
کار نمیکند، میتوان از ctr
(ابزار داخلی containerd
) برای بارگذاری استفاده کرد:
sudo ctr -n k8s.io images import nginx.tar
سپس بررسی کنید که تصویر اضافه شده است:
sudo crictl images
به جای استفاده از crictl image save/load
، میتوانید از ctr
برای ذخیره و بارگذاری استفاده کنید.
ذخیره تصویر از یک سرور دیگر:
sudo ctr -n k8s.io images pull docker.io/library/nginx:latest
sudo ctr -n k8s.io images export nginx.tar docker.io/library/nginx:latest
انتقال به سرور داخلی و بارگذاری:
sudo ctr -n k8s.io images import nginx.tar
سپس تصویر را بررسی کنید:
sudo crictl images
crictl
و containerd
گاهی اوقات نسخههای ناسازگار crictl
و containerd
باعث این مشکل میشوند. بررسی کنید که نسخههای آنها با هم سازگار باشند:
crictl --version
containerd --version
اگر ناسازگاری وجود دارد، crictl
را آپدیت کنید:
VERSION="v1.27.1"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz
sudo tar zxvf crictl-${VERSION}-linux-amd64.tar.gz -C /usr/local/bin
🔹 اگر crictl image load
کار نمیکند، از ctr -n k8s.io images import
استفاده کنید.
🔹 بررسی کنید که containerd
اجرا شده باشد.
🔹 مسیر و صحت فایل nginx.tar
را بررسی کنید.
🔹 اگر مشکل همچنان پابرجاست، نسخههای crictl
و containerd
را بررسی و بهروزرسانی کنید.
اگر پس از اجرای دستور
sudo ctr -n k8s.io images import nginx.tar
هنوز تصویر در لیست کانتینرها نمایش داده نمیشود، دلایل مختلفی میتواند وجود داشته باشد. در ادامه روشهای بررسی و رفع مشکل آورده شده است:
containerd
ممکن است تصویر به درستی وارد شده باشد، اما نام آن متفاوت باشد. بررسی کنید که تصویر در containerd
ثبت شده است:
sudo ctr -n k8s.io images list
یا در فضای نام default
:
sudo ctr images list
اگر تصویر در خروجی نمایش داده نشد، ممکن است مشکل در فرمت nginx.tar
باشد.
nginx.tar
اطمینان حاصل کنید که فایل nginx.tar
به درستی ذخیره شده باشد:
file nginx.tar
خروجی باید شبیه این باشد:
nginx.tar: POSIX tar archive
اگر فرمت متفاوت باشد، ممکن است لازم باشد تصویر را دوباره ذخیره کنید:
sudo ctr -n k8s.io images export nginx.tar docker.io/library/nginx:latest
و مجدداً وارد کنید:
sudo ctr -n k8s.io images import nginx.tar
گاهی اوقات ctr import
تصویر را با نام ناشناختهای اضافه میکند. برای بررسی دقیقتر، دستور زیر را اجرا کنید:
sudo ctr -n k8s.io images list | grep nginx
اگر نام تصویر تغییر کرده باشد، از همان نام جدید استفاده کنید.
crictl
و containerd
crictl
فقط تصاویری را نمایش میدهد که در فضای k8s.io
بارگذاری شده باشند. مطمئن شوید که crictl
به درستی به containerd
متصل است:
sudo crictl info
اگر containerd
به درستی در حال اجرا نباشد، آن را راهاندازی کنید:
sudo systemctl restart containerd
سپس لیست تصاویر را مجدداً بررسی کنید:
sudo crictl images
crictl
برای بارگذاریاگر تصویر پس از import
نمایش داده نمیشود، ممکن است نام آن درست ثبت نشده باشد. برای ریتگ کردن:
sudo ctr -n k8s.io images tag docker.io/library/nginx:latest myregistry.local/nginx:latest
سپس با crictl
بررسی کنید:
sudo crictl images
containerd
containerd
از فضای نام (namespace) استفاده میکند و ممکن است تصویر در فضای نام دیگری ذخیره شده باشد. فهرست فضای نامها را ببینید:
sudo ctr namespaces list
سپس لیست تصاویر را در همه فضای نامها بررسی کنید:
sudo ctr -n k8s.io images list
sudo ctr -n default images list
اگر مشکل همچنان وجود دارد، تصویر را حذف کرده و مجدداً بارگذاری کنید:
sudo ctr -n k8s.io images rm docker.io/library/nginx:latest
sudo ctr -n k8s.io images import nginx.tar
sudo ctr -n k8s.io images list
✅ بررسی کنید که تصویر در containerd
موجود است (ctr -n k8s.io images list
).
✅ مطمئن شوید containerd
اجرا میشود (systemctl restart containerd
).
✅ از crictl
برای نمایش تصاویر استفاده کنید (crictl images
).
✅ تصویر را ریتگ کرده و دوباره تست کنید (ctr -n k8s.io images tag
).
✅ مطمئن شوید nginx.tar
به درستی ذخیره شده (file nginx.tar
).
✅ در صورت لزوم، تصویر را حذف و دوباره وارد کنید (ctr images rm && ctr images import
).
ctr
و crictl
ctr
و crictl
هر دو ابزارهایی برای مدیریت کانتینرها هستند، اما هر یک برای هدف خاصی طراحی شدهاند و تفاوتهای کلیدی دارند:
ctr
چیست؟✅ ابزار مدیریت داخلی containerd
✅ برای کار مستقیم با containerd
بدون واسطهی اضافی
✅ استفاده در سطح پایین برای مدیریت ایمیجها و کانتینرها
✅ مناسب برای کاربرانی که مستقیماً از containerd
استفاده میکنند
مثالها:
🔹 لیست ایمیجهای موجود در containerd
sudo ctr -n k8s.io images list
🔹 ایمپورت یک ایمیج از فایل
sudo ctr -n k8s.io images import nginx.tar
🔹 اجرای یک کانتینر از ایمیج
sudo ctr -n k8s.io run --rm docker.io/library/nginx:latest mynginx
crictl
چیست؟✅ ابزار تعامل با Container Runtime Interface (CRI)
✅ مخصوص Kubernetes
و Kubelet
✅ برای کار با containerd
یا cri-o
در محیط Kubernetes
✅ دستورات سطح بالاتر برای کار با پادها و ایمیجها در K8s
مثالها:
🔹 بررسی وضعیت containerd
یا cri-o
sudo crictl info
🔹 لیست ایمیجها
sudo crictl images
🔹 اجرای یک کانتینر
sudo crictl runp pod-config.json
🔹 نمایش لاگهای یک کانتینر
sudo crictl logs <container-id>
ویژگی | ctr |
crictl |
---|---|---|
هدف | مدیریت containerd مستقیماً |
مدیریت کانتینرها در K8s از طریق CRI |
وابستگی به Kubernetes | ❌ نیازی به K8s ندارد | ✅ مخصوص K8s و CRI |
سطح دسترسی | سطح پایین (کار مستقیم با containerd ) |
سطح بالاتر (کار با پادها و ایمیجها در K8s) |
پشتیبانی از cri-o |
❌ فقط برای containerd |
✅ هم برای containerd و هم cri-o |
قابلیت اجرا و مدیریت پادها | ❌ ندارد | ✅ دارد |
🔹 اگر مستقیم با containerd
کار میکنید → از ctr
🔹 اگر در محیط Kubernetes کار میکنید → از crictl
🔹 اگر با cri-o
کار میکنید → فقط crictl
را میتوان استفاده کرد
🔹 اگر درگیر ایمپورت، تگگذاری، حذف ایمیجها هستید → ctr
سریعتر است
🔹 اگر نیاز به مشاهده لاگها و مدیریت پادها در K8s دارید → crictl
مناسبتر است
✅ ctr
یک ابزار داخلی برای containerd
است و بدون نیاز به Kubernetes
کار میکند.
✅ crictl
از طریق Container Runtime Interface (CRI) با containerd
و cri-o
ارتباط برقرار میکند و برای Kubernetes طراحی شده است.
✅ در محیط Kubernetes، crictl
بهترین گزینه است، اما اگر فقط به containerd
نیاز دارید، ctr
سریعتر و کاربردیتر است.
برای ایمپورت کردن یک ایمیج از فایل (.tar
) در crictl
، نمیتوان از crictl
مستقیماً استفاده کرد، زیرا crictl
مستقیماً دستوری برای ایمپورت ایمیج ندارد. اما میتوان این کار را با ctr
انجام داد و سپس از crictl
برای بررسی آن استفاده کرد.
ctr
sudo ctr -n k8s.io images import nginx.tar
یا اگر در فضای نام default
قرار دارد:
sudo ctr images import nginx.tar
🔹 این دستور، ایمیج nginx.tar
را در containerd
ایمپورت میکند.
crictl
پس از ایمپورت، برای نمایش لیست ایمیجها در crictl
از این دستور استفاده کنید:
sudo crictl images
اگر ایمیج نمایش داده نشد، ممکن است نیاز به ریتگ کردن داشته باشد.
گاهی اوقات ایمیج پس از ایمپورت بدون تگ صحیح وارد containerd
میشود. میتوانید نام و تگ را بررسی کنید:
sudo ctr -n k8s.io images list
سپس، برای اعمال یک تگ مناسب:
sudo ctr -n k8s.io images tag docker.io/library/nginx:latest k8s.io/nginx:latest
حالا دوباره crictl
را بررسی کنید:
sudo crictl images
پس از اطمینان از وجود ایمیج در crictl
، میتوانید یک پاد یا کانتینر اجرا کنید:
sudo crictl runp pod-config.json
یا برای اجرا در یک کانتینر ساده:
sudo crictl run container-config.json pod-id
✅ crictl
بهطور مستقیم دستور import
ندارد.
✅ باید از ctr images import
برای ایمپورت استفاده کنید.
✅ اگر ایمیج در crictl
دیده نشد، از ctr images tag
برای اصلاح نام آن استفاده کنید.
✅ سپس میتوان با crictl images
لیست ایمیجها را بررسی کرد.
به نظر میرسد که ایمیج nginxproxy/nginx-proxy:alpine
با موفقیت در containerd
ایمپورت شده است، اما همچنان در crictl images
نمایش داده نمیشود. این معمولاً به دلیل تفاوت در نامگذاری و فضای نام (namespace
) در containerd
و CRI
اتفاق میافتد.
۱. بررسی لیست ایمیجها در crictl
ابتدا ببینید که crictl
اصلاً ایمیجی را میشناسد یا نه:
sudo crictl images
۲. بررسی دقیقتر فضای نام (namespace
) در containerd
sudo ctr -n k8s.io images list
ایمیج شما در k8s.io
وجود دارد، اما ممکن است crictl
آن را نشناسد.
۳. ریتگ کردن ایمیج برای k8s.io
بهنظر میرسد که crictl
فقط ایمیجهایی را که دارای تگ k8s.io
هستند، شناسایی میکند. برای این کار، ایمیج را ریتگ کنید:
sudo ctr -n k8s.io images tag docker.io/nginxproxy/nginx-proxy:alpine k8s.io/nginxproxy/nginx-proxy:alpine
۴. بررسی مجدد crictl
بعد از ریتگ کردن، دوباره لیست ایمیجها را در crictl
ببینید:
sudo crictl images
۵. ریاستارت containerd
(در صورت نیاز)
اگر باز هم crictl
ایمیج را نشان نداد، containerd
را ریاستارت کنید:
sudo systemctl restart containerd
✅ ctr
و crictl
از فضاهای نام متفاوت استفاده میکنند، بنابراین لازم است که ایمیجها را در k8s.io
ریتگ کنید.
✅ بعد از ریتگ کردن با ctr images tag
، crictl
باید بتواند ایمیج را شناسایی کند.
✅ اگر همچنان مشکل باقی بود، containerd
را ریاستارت کنید و دوباره امتحان کنید.
خطای زیر نشان میدهد که crictl
سعی میکند به چندین سوکت پیشفرض متصل شود، اما سوکت dockershim.sock
وجود ندارد:
validate CRI v1 image API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error
این خطا زمانی اتفاق میافتد که crictl
بهدرستی پیکربندی نشده و نمیداند که باید به containerd
متصل شود.
crictl
برای containerd
۱. بررسی اجرای containerd
مطمئن شوید که containerd
در حال اجرا است:
sudo systemctl status containerd
اگر containerd
غیرفعال بود، آن را راهاندازی کنید:
sudo systemctl start containerd
۲. تنظیم crictl
برای استفاده از containerd
به جای استفاده از تنظیمات پیشفرض، مسیر صحیح را مشخص کنید.
🔹 روش موقت (تنها برای این نشست ترمینال):
export CONTAINER_RUNTIME_ENDPOINT=unix:///run/containerd/containerd.sock
export IMAGE_SERVICE_ENDPOINT=unix:///run/containerd/containerd.sock
حالا دوباره امتحان کنید:
crictl images
🔹 روش دائمی (برای همیشه در کل سیستم):
فایل تنظیمات crictl
را ایجاد کنید:
sudo mkdir -p /etc/crictl
echo 'runtime-endpoint: unix:///run/containerd/containerd.sock' | sudo tee /etc/crictl.yaml
سپس امتحان کنید:
crictl images
✅ crictl
به طور پیشفرض به dockershim.sock
متصل میشود که دیگر وجود ندارد.
✅ باید crictl
را به containerd.sock
متصل کنید، که در مسیر /run/containerd/containerd.sock
قرار دارد.
✅ با تنظیم crictl.yaml
این تغییر دائمی خواهد شد.
بله، استفاده از VPN یا Proxy برای حل مشکل دسترسی به Docker Hub و دیگر Registryها بسیار مفید است، مخصوصاً زمانی که دانلود مستقیم تصاویر (Images) با خطا مواجه میشود. در ادامه چند روش جایگزین نیز معرفی شده است:
🔹 اگر یک سرور VPS دارید، میتوانید یک SOCKS5 Proxy راهاندازی کنید و از طریق آن، Docker pull را اجرا کنید.
export all_proxy=socks5://your-proxy-ip:port
docker pull nginx
🔹 برای این روش، باید SOCKS5 Proxy روی سرور شما فعال باشد. اگر SSH Access دارید، میتوانید این تونل را باز کنید:
ssh -D 1080 -N -f user@your-vps-ip
export all_proxy=socks5://127.0.0.1:1080
🔹 اگر از یک HTTP Proxy استفاده میکنید، مقدار HTTP_PROXY و HTTPS_PROXY را تنظیم کنید:
export HTTP_PROXY=http://your-proxy-ip:port
export HTTPS_PROXY=http://your-proxy-ip:port
docker pull nginx
🔹 این تنظیمات را میتوانید بهطور دائمی در فایل /etc/systemd/system/docker.service.d/http-proxy.conf
قرار دهید:
[Service]
Environment="HTTP_PROXY=http://your-proxy-ip:port"
Environment="HTTPS_PROXY=http://your-proxy-ip:port"
سپس سرویس داکر را ریستارت کنید:
systemctl daemon-reload
systemctl restart docker
🔹 میتوانید Mirrorهای داکر را جایگزین Docker Hub کنید. برای این کار، فایل /etc/docker/daemon.json
را ویرایش کنید:
{
"registry-mirrors": [
"https://mirror.gcr.io",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
سپس داکر را ریستارت کنید:
systemctl daemon-reload
systemctl restart docker
🔹 اگر دسترسی مستقیم ندارید، میتوانید فایل ایمیج را روی سرور دیگری دانلود کنید و به سرور مقصد منتقل کنید:
docker pull nginx
docker save -o nginx.tar nginx
scp nginx.tar user@your-server:/tmp
ssh user@your-server "docker load -i /tmp/nginx.tar"
اگر محدودیت شبکهای باعث عدم دسترسی به Docker Hub شده است: 1️⃣ از VPN یا Proxy (SOCKS5/HTTP) استفاده کنید.
2️⃣ از Mirrorهای Docker کمک بگیرید.
3️⃣ ایمیج را روی سیستم دیگری دانلود و منتقل کنید.
4️⃣ در صورت امکان، از Registry خصوصی (Private Registry) برای ذخیره ایمیجهای موردنیازتان استفاده کنید.
اگر مشکل خاصی در محیط شما وجود دارد، خروجی این دستور را ارسال کنید تا بررسی کنیم:
docker pull nginx
echo $HTTP_PROXY
echo $HTTPS_PROXY
در K3s، به دلیل وابستگی به containerd بهجای Docker Daemon، روش تنظیم Mirrorها کمی متفاوت است.
در K3s، بهجای ویرایش daemon.json
(که در Docker استفاده میشود)، باید فایل پیکربندی containerd را تغییر دهیم.
📍 در K3s، تنظیمات containerd معمولاً در مسیر زیر قرار دارد:
/etc/rancher/k3s/registries.yaml
اگر این فایل وجود ندارد، آن را ایجاد کنید.
فایل /etc/rancher/k3s/registries.yaml
را ویرایش کنید:
mirrors:
docker.io:
endpoint:
- "https://mirror.gcr.io"
- "https://docker.mirrors.ustc.edu.cn"
- "https://hub-mirror.c.163.com"
پس از ویرایش فایل، K3s را ریستارت کنید:
systemctl restart k3s
یا اگر از K3s Agent استفاده میکنید:
systemctl restart k3s-agent
برای اطمینان از این که containerd از Mirrorها استفاده میکند، دستور زیر را اجرا کنید:
ctr image pull docker.io/library/nginx:latest
اگر تصویر بدون مشکل دانلود شد، تنظیمات درست اعمال شدهاند.
✅ افزایش سرعت دانلود ایمیجها (بهویژه در ایران)
✅ دور زدن محدودیتهای شبکهای
✅ کاهش بار روی Docker Hub و استفاده از سرورهای جایگزین
🔹 در Docker، باید daemon.json
را تنظیم کنیم، اما در K3s باید فایل /etc/rancher/k3s/registries.yaml
را ویرایش کنیم.
🔹 با این کار، K3s هنگام کشیدن ایمیجها (Pull) از Mirrorهای سریعتر و بدون محدودیت استفاده خواهد کرد. 🚀
📌 اگر /etc/rancher/k3s/registries.yaml
وجود ندارد، چه باید کرد؟
در K3s، فایل registries.yaml
بهصورت پیشفرض ایجاد نمیشود، مگر اینکه شما آن را دستی بسازید. اگر فقط فایل k3s.yaml
را دارید، باید فایل registries.yaml
را بهصورت دستی ایجاد کنید.
registries.yaml
فایل registries.yaml
را در مسیر مناسب ایجاد کنید:
sudo mkdir -p /etc/rancher/k3s
sudo nano /etc/rancher/k3s/registries.yaml
سپس محتوای زیر را داخل آن قرار دهید:
mirrors:
docker.io:
endpoint:
- "https://mirror.gcr.io"
- "https://docker.mirrors.ustc.edu.cn"
- "https://hub-mirror.c.163.com"
فایل را ذخیره کنید (Ctrl + X سپس Y و Enter).
پس از ایجاد فایل، سرویس K3s را ریستارت کنید تا تغییرات اعمال شود:
sudo systemctl restart k3s
یا اگر از K3s Agent استفاده میکنید:
sudo systemctl restart k3s-agent
برای بررسی اینکه آیا K3s از mirrorها استفاده میکند، این دستور را اجرا کنید:
ctr image pull docker.io/library/nginx:latest
اگر تصویر بدون مشکل و سریعتر دانلود شد، یعنی تنظیمات درست انجام شده است. 🚀
✅ اگر registries.yaml
وجود ندارد، میتوانید آن را بهصورت دستی ایجاد کنید.
✅ تغییرات پس از ریستارت K3s اعمال میشوند.
✅ K3s از containerd استفاده میکند، پس تنظیمات آن متفاوت از Docker است.
❓ اگر بعد از انجام این مراحل باز هم مشکل داشتید، چه خطایی دریافت میکنید؟
اگر به یک میرور محلی برای Docker نیاز دارید، میتوانید یک کش پروکسی از Docker Hub راهاندازی کنید. این کار بهخصوص برای محیطهایی که دسترسی مستقیم به Docker Hub دشوار است (مانند ایران) یا برای تسریع دانلود ایمیجها، مفید است.
registry
Docker خودش یک ایمیج به نام registry
دارد که میتواند بهعنوان کش (cache) عمل کند.
registry
بهعنوان کشdocker run -d -p 5000:5000 --restart=always --name docker-mirror \
-e REGISTRY_PROXY_REMOTEURL="https://registry-1.docker.io" \
registry:2
🔹 این دستور یک Registry Mirror روی پورت ۵۰۰۰ ایجاد میکند که تمام ایمیجهای کششده را نگه میدارد.
فایل daemon.json
را ویرایش کنید:
sudo nano /etc/docker/daemon.json
و این مقدار را اضافه کنید:
{
"registry-mirrors": ["http://localhost:5000"]
}
سپس Docker را ریستارت کنید:
sudo systemctl restart docker
حالا میتوانید از این Mirror برای کش کردن ایمیجها استفاده کنید:
docker pull localhost:5000/library/nginx
🔹 در این حالت، اگر قبلاً این ایمیج کش نشده باشد، از Docker Hub دریافت و در Mirror ذخیره میشود.
🔹 اگر دوباره آن را بکشید، از کش محلی دریافت میشود و بسیار سریعتر خواهد بود.
Harbor
بهعنوان یک Docker Mirrorاگر به یک راهکار حرفهایتر نیاز دارید، میتوانید از Harbor استفاده کنید. این ابزار قابلیتهای بیشتری مانند مدیریت کاربران، احراز هویت و امضای دیجیتال ایمیجها را ارائه میدهد.
Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xvf harbor-online-installer-v2.9.0.tgz
cd harbor
فایل harbor.yml
را ویرایش کنید و آدرس سرور خود را در قسمت hostname
تنظیم کنید:
hostname: my-harbor.local
سپس نصب را اجرا کنید:
./install.sh
🔹 پس از نصب، Harbor روی پورت ۸۰ و ۴۴۳ اجرا خواهد شد و میتوان از آن بهعنوان Mirror استفاده کرد.
✅ اگر فقط میخواهید ایمیجها را کش کنید، روش Registry Mirror با registry:2
ساده و کارآمد است.
✅ اگر به مدیریت کاربران، لاگین و امضای ایمیج نیاز دارید، از Harbor استفاده کنید.
✅ با استفاده از این روشها، میتوانید بدون نیاز به VPN یا تغییر DNS، ایمیجها را سریعتر و پایدارتر دانلود کنید. 🚀
❓ کدام روش را میخواهید پیادهسازی کنید؟
برای مشاهده ایمیجهایی که در Registry Mirror محلی شما کش شدهاند، چند روش وجود دارد:
registry:2
یک API داخلی دارد که میتوان از آن برای مشاهده ایمیجهای ذخیرهشده استفاده کرد.
curl
curl -X GET http://localhost:5000/v2/_catalog
🔹 این دستور لیستی از نام ایمیجهای ذخیرهشده را نمایش میدهد.
curl -X GET http://localhost:5000/v2/nginx/tags/list
🔹 این دستور تمام ورژنهای ذخیرهشده از ایمیج nginx
را نمایش میدهد.
اگر سرور شما رابط گرافیکی دارد یا به آن از طریق مرورگر دسترسی دارید، میتوانید لیست ایمیجها را مستقیماً ببینید.
1️⃣ آدرس زیر را در مرورگر باز کنید:
http://localhost:5000/v2/_catalog
🔹 لیستی از ایمیجهای ذخیرهشده نمایش داده میشود.
2️⃣ برای دیدن تگهای یک ایمیج خاص، از این آدرس استفاده کنید:
http://localhost:5000/v2/nginx/tags/list
/var/lib/docker/registry
ایمیجهای کششده معمولاً در مسیر زیر ذخیره میشوند:
ls /var/lib/docker/registry
🔹 اگر registry
را با docker run
اجرا کردهاید، ایمیجها در داخل کانتینر ذخیره میشوند. برای بررسی آن:
docker exec -it docker-mirror sh
سپس مسیر زیر را بررسی کنید:
ls /var/lib/registry/docker/registry/v2/repositories
🔹 این دستور، لیست تمام ایمیجهای کششده را نمایش میدهد.
اگر ایمیجها را از localhost:5000
کش کردهاید، میتوانید آنها را مستقیماً در Docker ببینید:
docker images
🔹 ایمیجهای کششده باید در لیست با آدرسی مشابه localhost:5000/nginx
دیده شوند.
🔹 برای لیستگیری از طریق API:
curl -X GET http://localhost:5000/v2/_catalog
🔹 برای بررسی ذخیرهسازی داخل کانتینر:
docker exec -it docker-mirror sh
ls /var/lib/registry/docker/registry/v2/repositories
🔹 برای مشاهده ایمیجهای محلی:
docker images
1- شکن، 403 آنلاین و سرویس مشابه برای مشتریان داخلی بعضیهاستینگها: با تنظیم DNS بروی سرورهای این مجموعهها، کل درخواستهای ترجمه دامنه به آی پی رو بهشون بسپارید و هر سایتی که ادعا کردن یا مایل باشن رو خودشون میگیرن و براتون پروکسی میکنن. ضمن اینکه اکثرا کند هستند، شاید حس خوبی از اینکه کل درخواستهای DNS شما توسط یک مجموعه مدیریت بشه نداشته باشید.
اگر با اکراه مجبور به استفاده هستید، یک روش ساده برای محدود کردن درخواستهایی که به این مجموعهها ارسال میشه اینه که آدرس سروری که برای پروکسی کردن درخواست شما استفاده میکنن رو پیدا کنید و فقط برای دامینهایی که مایل هستید ترافیک رو به اونها ارسال کنید. (آی پی بعد @ آدرس دی ان اس سرور یکی از این سرویس دهندههاست.)
در بالا میبینید که آی پی 50.7.87.83 بجای آی پی اصلی دامنه k8s.io که برای کابران ایرانی تحریم هست برگشت داده میشه. آی پی اصلی این دامنه رو در نتیجه کامند زیر مشاهده میکنید:
میتونید از فایل hosts در لینوکس یا ویندوز استفاده کنید که صرفا بروی سیستم خودتون آی پی سرور پروکسی این تحریم شکنها رو فقط برای دامنهی مورد نظر استفاده کنید و DNS کلی سیستم رو تغییر ندید:
2- راه اندازی تحریم شکن خودتان: شاید بجز تحریمهای خارجی، مایل باشید تحریمهای داخلی رو هم بی اثر کنید تا بتونید از سرویسهایی مثل youtube.com و خیلی سایتهای دیگه برای افزایش دانش و رفع نیازهای خودتون استفاده کنید. در این حالت یک سرویس محدود، گرون، یا ناامن و ارزون باید بخریم، یا سرویس خودمون رو راه بندازیم. آموزشهای خوبی به فارسی برای راه اندازی این ابزارهای ضدسانسور که توسط توسعه دهنگان چینی برای درد مشابه توسعه داده شده وجود داره. بسته به میزان دسترسی به سرور داخلی با اینترنت کمتر محدود شده یا سرور خارجی با آی پیای که در ISPهای کمتری بلاک شده باشه، ستاپهای مختلفی میشه کرد که فکرمیکنم تا الان هممون یکبار تجربه کردیم یا هنوز داریم استفاده میکنیم. مشکل این روش میزان هزینه، مسدود شدن آی پی توسط داخل یا خارج و گاهی پیچیدگی راه اندازی امنشون هست.
3- میرورهای داخلی
docker.ir
سرویس دولتی iranrepo.ir
4- میرور Alibaba Cloud به نام Aliyun: از این میرور میشه هم برای نصب پکیجهای apt/yum و هم برای پول کردن ایمیجهای registry.k8s.io استفاده کرد. نصب پکیجهای apt/yum ساده ست اما به دلیل اینکه ایمیجهای k8s.io رو روی پوشهی google_containers ارائه میکنه، نیاز به کار بیشتری برای استفاده داره.
4-1- نصب پکیجهای apt/yum: نصب کوبرنیتیز با استفاده از این میرور نکته خاصی نداره و فقط باید کامندهایی که گفته شده رو دنبال کنید.
https://developer.aliyun.com/mirror/kubernetes/
4-2- پول کردن ایمیجهای k8s.io: دو راه وجود داره:
4-2-1- تنظیم رجیستری موقع انجام kubeadm init: میتونید از فلگ --image-repository استفاده کنید:
برای تست کردن اینکه برای شما کار میکنه یا نه میتونید بجای init کردن، فقط پول کنید ایمیجهارو:
4-2-2- تنظیم رجیستری میرور برای containerd: در این حالت باید در فایل /etc/containerd/config.toml آدرس میرور رو معرفی کرد. فقط نکتهای که وجود داره اینه که باید مقدار v2 رو به اول آدرس اضافه کرد که آدرس صحیح برای رجیستری تولید بشه:
همچنین اگر از ابزار Nexus استفاده میکنید برای کش کردن ایمیجها در زیرساخت خودتون و کاهش سربار اینترنت در کلاسترهای چند نودی، و مایل به استفاده از Repository Connectorsها بخاطر پیچیدگیشون نیستید، میتونید از Url رجیستریای که از نوع Proxy با مقصد https://registry.aliyuncs.com ایجاد کردید استفاده کنید. بجای خط آخر کدهای بالا، خط زیر رو قرار بدید:
لطفا ری استارت کردن containerd بعد از اعمال تغییرات رو فراموش نکنید:
و اما تست:
به نظر میرسد که شما در حال اجرای دستور acl
به صورت مستقیم در ترمینال هستید، اما acl
یک دستور خاص برای پیکربندی Squid است و باید آن را در فایل پیکربندی Squid قرار دهید، نه به صورت مستقیم در ترمینال.
باز کردن فایل پیکربندی Squid:
فایل پیکربندی Squid معمولاً در مسیر /etc/squid/squid.conf
قرار دارد. برای ویرایش آن از دستور زیر استفاده کنید:
sudo nano /etc/squid/squid.conf
اضافه کردن یا اصلاح ACL در فایل پیکربندی:
در این فایل، شما میتوانید ACLها را به شکل زیر اضافه کنید:
acl localnet src 192.168.10.0/24
http_access allow localnet
این کد به Squid میگوید که دسترسی به منابع برای IPهای موجود در رنج 192.168.10.0/24
مجاز باشد.
ذخیره و بستن فایل: پس از اعمال تغییرات، فایل را ذخیره کرده و خارج شوید. در nano از کلیدهای زیر استفاده کنید:
ریستارت Squid:
پس از تغییرات، Squid را برای اعمال پیکربندیهای جدید ریستارت کنید:
sudo systemctl restart squid
بررسی وضعیت Squid:
برای اطمینان از اینکه Squid به درستی در حال اجرا است و هیچ مشکلی ندارد، میتوانید وضعیت آن را بررسی کنید:
sudo systemctl status squid
دستور acl
باید در فایل پیکربندی Squid استفاده شود و نه در ترمینال. پس از اعمال تغییرات در فایل پیکربندی، Squid را ریستارت کنید تا تغییرات اعمال شوند.
curl -I --proxy http://49.13.174.14:3128 https://www.google.com
HTTP_PROXY="http://49.13.174.14:3128" crictl pull nginx:latest
/etc/environment
export HTTP_PROXY="http://192.168.10.1:3128"
export HTTPS_PROXY="http://192.168.10.1:3128"
مشکل اصلی اینجاست که گواهی SSL برای مخزن Docker قابل اعتماد نیست و همچنین به نظر میرسد که ارتباط با مخزن امنیتی اوبونتو هم دچار مشکل شده است. برای حل این مشکل، مراحل زیر را انجام دهید:
ابتدا اطمینان حاصل کنید که بستههای مرتبط با گواهیهای SSL روی سیستم شما بهروز هستند:
sudo apt update
sudo apt install --reinstall ca-certificates
sudo update-ca-certificates
اگر تاریخ و ساعت سیستم درست تنظیم نشده باشد، میتواند باعث نامعتبر شدن گواهیهای SSL شود:
timedatectl
اگر تاریخ و ساعت اشتباه است، تنظیمش کنید:
sudo timedatectl set-ntp on
اگر همچنان مشکل باقی ماند، کلید GPG Docker را حذف و مجدداً اضافه کنید:
sudo rm -rf /etc/apt/keyrings/docker.asc
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
ممکن است مخزن Docker هنوز برای Ubuntu 24.04 (Noble) بهروزرسانی نشده باشد. بررسی کنید که آیا مخزن برای این نسخه منتشر شده است یا نه:
curl -fsSL https://download.docker.com/linux/ubuntu/dists/
اگر نسخهی "noble" در لیست نبود، میتوانید بهجای آن از "jammy" استفاده کنید:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
jammy stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
پس از انجام تغییرات، این دستورات را اجرا کنید:
sudo apt clean
sudo apt update
برای بررسی اتصال به مخزنهای اوبونتو و Docker میتوانید این دستورات را امتحان کنید:
wget -q --spider https://download.docker.com
wget -q --spider http://security.ubuntu.com
اگر این دستورات خطا دادند، ممکن است مشکل از DNS یا فایروال باشد.
گاهی اوقات مشکل اتصال به مخزنها به دلیل DNS نادرست است. میتوانید از DNS گوگل استفاده کنید:
sudo nano /etc/resolv.conf
و خط زیر را اضافه کنید:
nameserver 8.8.8.8
بعد از انجام این مراحل، دوباره امتحان کنید:
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
اگر باز هم مشکل داشتید، بگویید تا راهحلهای دیگر بررسی کنیم.
.
V2Ray
میتواند به عنوان یک پروکسی تحریمشکن برای دسترسی به سرویسهای مسدود شده مانند Docker Hub
، GitHub
, Google Cloud
و ... استفاده شود.
🔹 دو روش برای استفاده از V2Ray
به عنوان تحریمشکن وجود دارد:
SOCKS
یا HTTP Proxy
)tun2socks
برای تغییر مسیر ترافیک کل سیستمابتدا V2Ray
را نصب و اجرا کنید (اگر قبلاً نصب نشده است):
bash <(curl -Ls https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
سپس فایل کانفیگ را ویرایش کنید:
sudo nano /usr/local/etc/v2ray/config.json
و این تنظیمات را اضافه کنید (پورت 1080
برای SOCKS5 و 8080
برای HTTP Proxy):
{
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
}
},
{
"port": 8080,
"listen": "127.0.0.1",
"protocol": "http",
"settings": {}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "YOUR-V2RAY-SERVER",
"port": 443,
"users": [
{
"id": "YOUR-UUID",
"alterId": 64,
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/v2ray"
}
}
}
]
}
🔹 مقادیر مهم را تغییر دهید:
✅ YOUR-V2RAY-SERVER
= آیپی یا دامنه سرور V2Ray
✅ YOUR-UUID
= مقدار UUID
که در سرور تنظیم شده است
✅ سرویس V2Ray را ریاستارت کنید:
sudo systemctl restart v2ray
✅ بررسی وضعیت:
sudo systemctl status v2ray
tun2socks
برای تغییر مسیر کل ترافیکtun2socks
sudo apt update && sudo apt install -y tun2socks
tun2socks
sudo tun2socks -device tun0 -proxy socks5://127.0.0.1:1080
iptables
برای هدایت ترافیکsudo ip route add default via 192.168.1.1 dev tun0
🔹 با این روش، تمام ترافیک از V2Ray
عبور خواهد کرد.
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
docker pull nginx
✅ حالا Docker
بدون مشکل ایمیجها را دانلود میکند.
git config --global http.proxy http://127.0.0.1:8080
git config --global https.proxy http://127.0.0.1:8080
echo 'Acquire::http::Proxy "http://127.0.0.1:8080/";' | sudo tee /etc/apt/apt.conf.d/01proxy
sudo apt update
✅ بررسی ارتباط پروکسی:
curl -x socks5h://127.0.0.1:1080 https://ifconfig.me
🔹 اگر آیپی شما تغییر کرده، یعنی V2Ray
به درستی کار میکند.
✅ بررسی اتصال Docker
docker pull alpine
✅ با V2Ray
میتوانید تحریمهای اینترنتی را دور بزنید و دسترسی به سرویسهایی مثل Docker
, GitHub
, Google Cloud
, و NPM
را بدون محدودیت تجربه کنید.
📌 اگر مشکل داشتید، این دستورات را ارسال کنید:
sudo systemctl status v2ray
journalctl -u v2ray --no-pager | tail -n 20
curl -x socks5h://127.0.0.1:1080 https://ifconfig.me
I am also facing this issue
Please verifify the steps i have performed.
- Import docker image using tar.gz file (private tar file)
docker import .tar.gz :- docker save :-o testimage.tar
crictl images
docker.io/library/ 025bf97099229 535MB- ctr -n=k8s.io images import testimage.tar :
when i try to create a deployment using created image got below error
Type Reason Age From Message
Warning Failed 58m (x2 over 64m) kubelet Failed to pull image "{name}:{tag}": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/{name}:{tag}": failed to resolve reference "docker.io/library/{name}:{tag}": failed to do request: Head https://registry-1.docker.io/v2/library/{name}/manifests/**_{tag}**: dial tcp 54.224.119.26:443: i/o timeout Warning Failed 34m (x11 over 107m) kubelet (combined from similar events): Failed to pull image "{name}:{tag}": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library"{name}:{tag}": failed to resolve reference "docker.io/library/{name}:{tag}": failed to do request: Head https://registry-1.docker.io/v2/library/{name}/manifests/**_{tag}_**: dial tcp 52.55.168.20:443: i/o timeout``