4 registries

Hub, K8s, Quay, MCR

Each upstream has its own dedicated subdomain so you can mirror exactly what you need without leaking traffic.

daemon.json

Native registry-mirror support

Set the mirror once at the runtime layer. Existing docker pull nginx commands keep working unchanged.

Anonymous

No login for public images

Public read pulls are anonymous. Private images can still be pulled directly from upstream by skipping the mirror.

Available registries

RegistryMirror URLOriginal
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 daemon configuration

Restart required

Docker only re-reads daemon.json on restart. Apply with systemctl restart docker on Linux, or "Apply & Restart" in Docker Desktop on macOS / Windows.

Linux

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'

macOS & Windows (Docker Desktop)

  1. Open Docker Desktop โ†’ Settings โ†’ Docker Engine.
  2. Add the same JSON snippet above.
  3. Click Apply & Restart.

Pulling images

Docker Hub (after daemon config)

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

Direct pull (no daemon config)

docker pull docker-mirror.kargadan.ir/library/nginx:latest
docker pull docker-mirror.kargadan.ir/bitnami/redis:latest

Kubernetes

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

Quay

docker pull docker-quay-mirror.kargadan.ir/prometheus/prometheus:latest
docker pull docker-quay-mirror.kargadan.ir/coreos/etcd:latest

Microsoft (MCR)

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

Kubernetes runtimes

containerd

# /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

kubeadm config images pull --image-repository=docker-k8s-mirror.kargadan.ir
kubeadm init               --image-repository=docker-k8s-mirror.kargadan.ir

K3s

# /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

Dockerfile examples

Standard image (after daemon config)

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Direct mirror reference (no daemon config)

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"]

Multi-stage build

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;"]

Mirror information

Docker HubGroup 11 upstream sources + Docker Hub
KubernetesGroup Chabokan, Runflare + registry.k8s.io
QuayProxy Chabokan mirror for quay.io
MCRProxy Direct proxy for mcr.microsoft.com
ProtocolsHTTPS ยท HTTP
AuthenticationNot required (anonymous pulls)
Cluster tip

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.