Hub, K8s, Quay, MCR
Each upstream has its own dedicated subdomain so you can mirror exactly what you need without leaking traffic.
One daemon configuration for Docker Hub, Kubernetes, Quay, and Microsoft container images.
Each upstream has its own dedicated subdomain so you can mirror exactly what you need without leaking traffic.
Set the mirror once at the runtime layer. Existing docker pull nginx commands keep working unchanged.
Public read pulls are anonymous. Private images can still be pulled directly from upstream by skipping the mirror.
| Registry | Mirror URL | Original |
|---|---|---|
| Docker Hub | docker-mirror.kargadan.ir |
docker.io |
| Kubernetes | docker-k8s-mirror.kargadan.ir |
registry.k8s.io |
| Quay | docker-quay-mirror.kargadan.ir |
quay.io |
| Microsoft (MCR) | docker-mcr-mirror.kargadan.ir |
mcr.microsoft.com |
Docker only re-reads daemon.json on restart. Apply with systemctl restart docker on Linux, or "Apply & Restart" in Docker Desktop on macOS / Windows.
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://docker-mirror.kargadan.ir"
]
}
EOF
sudo systemctl restart docker
# Verify
docker info | grep -A2 'Registry Mirrors'
These commands look unchanged but route through the mirror automatically:
docker pull nginx
docker pull python:3.12
docker pull node:22-alpine
docker pull postgres:17
docker pull docker-mirror.kargadan.ir/library/nginx:latest
docker pull docker-mirror.kargadan.ir/bitnami/redis:latest
docker pull docker-k8s-mirror.kargadan.ir/kube-apiserver:v1.30.0
docker pull docker-k8s-mirror.kargadan.ir/etcd:3.5.13-0
docker pull docker-k8s-mirror.kargadan.ir/coredns/coredns:v1.11.3
docker pull docker-quay-mirror.kargadan.ir/prometheus/prometheus:latest
docker pull docker-quay-mirror.kargadan.ir/coreos/etcd:latest
docker pull docker-mcr-mirror.kargadan.ir/dotnet/sdk:9.0
docker pull docker-mcr-mirror.kargadan.ir/dotnet/aspnet:9.0
docker pull docker-mcr-mirror.kargadan.ir/mssql/server:2022-latest
docker pull docker-mcr-mirror.kargadan.ir/azure-cli:latest
# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker-mirror.kargadan.ir"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://docker-k8s-mirror.kargadan.ir"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
endpoint = ["https://docker-quay-mirror.kargadan.ir"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."mcr.microsoft.com"]
endpoint = ["https://docker-mcr-mirror.kargadan.ir"]
# Restart
sudo systemctl restart containerd
kubeadm config images pull --image-repository=docker-k8s-mirror.kargadan.ir
kubeadm init --image-repository=docker-k8s-mirror.kargadan.ir
# /etc/rancher/k3s/registries.yaml
mirrors:
docker.io:
endpoint: ["https://docker-mirror.kargadan.ir"]
registry.k8s.io:
endpoint: ["https://docker-k8s-mirror.kargadan.ir"]
quay.io:
endpoint: ["https://docker-quay-mirror.kargadan.ir"]
mcr.microsoft.com:
endpoint: ["https://docker-mcr-mirror.kargadan.ir"]
sudo systemctl restart k3s
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
FROM docker-mirror.kargadan.ir/library/python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
FROM docker-mirror.kargadan.ir/library/node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM docker-mirror.kargadan.ir/library/nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
| Docker Hub | Group 11 upstream sources + Docker Hub |
| Kubernetes | Group Chabokan, Runflare + registry.k8s.io |
| Quay | Proxy Chabokan mirror for quay.io |
| MCR | Proxy Direct proxy for mcr.microsoft.com |
| Protocols | HTTPS ยท HTTP |
| Authentication | Not required (anonymous pulls) |
For production Kubernetes, configure the mirror at the containerd / CRI-O layer on each node. All pods then benefit automatically โ you do not need to rewrite image references in deployments.