老师的 Docker Hub 🐳

镜像自动从hub上缓存到自己的仓库,改过的镜像上传到缓存仓库。

目录结构

docker-mirror.tar.gz

docker-mirror/
├── docker-compose.yml
├── README.md
├── config/
│   ├── registry-mirror.yml   # mirror 服务配置(pull-through cache)
│   └── registry-push.yml     # private 服务配置(可推送)
└── data/                     # 数据持久化(自动生成,勿删)
    ├── mirror/               # mirror 缓存数据
    └── private/              # 私有仓库数据

端口一览

端口服务说明
5000mirrorPull-through 缓存(拉镜像走这里)
5001private私有仓库(推镜像走这里)
8181ui-mirror浏览器查看 mirror 缓存的镜像
8182ui-private浏览器查看私有仓库的镜像

启动 / 停止

# 启动所有服务
docker compose up -d

# 查看运行状态
docker compose ps

# 停止所有服务
docker compose down

# 查看某个服务日志
docker compose logs -f mirror

拉镜像(pull-through cache)

方式一:直接指定仓库地址

# 官方镜像(library 前缀)
docker pull localhost:5000/library/nginx:latest
docker pull localhost:5000/library/ubuntu:22.04
docker pull localhost:5000/library/redis:latest

# 第三方镜像
docker pull localhost:5000/snowdreamtech/frpc:latest

第一次会去 Docker Hub 拉取并缓存,之后直接从本地返回。

方式二:配置 daemon.json(推荐)

编辑 /etc/docker/daemon.json(Mac 在 Docker Desktop → Settings → Docker Engine):

{
  "registry-mirrors": ["http://localhost:5000"],
  "insecure-registries": ["localhost:5001"]
}

重启 Docker 后,直接用正常命令即可自动走 mirror:

docker pull nginx:latest

推镜像(私有仓库)

# 打 tag 指向本地私有仓库
docker tag myapp:v1 localhost:5001/myapp:v1

# 推送
docker push localhost:5001/myapp:v1

# 拉取
docker pull localhost:5001/myapp:v1

查看缓存了哪些镜像

# 命令行查询
curl http://localhost:5000/v2/_catalog

# 查某个镜像的 tag 列表
curl http://localhost:5000/v2/library/nginx/tags/list

# 确认镜像架构(amd64 / arm64)
docker inspect nginx:latest | grep Architecture

或者直接打开 Web UI:


缓存说明

  • mirror 缓存不会自动更新,本地有缓存就直接返回
  • 需要强制拉最新版,手动删除对应缓存目录再重新 pull
  • pull-through cache 会根据客户端机器架构自动缓存对应层(amd64 / arm64 互不干扰)
# 清除某个镜像的缓存(以 nginx 为例)
docker compose stop mirror
rm -rf ./data/mirror/docker/registry/v2/repositories/library/nginx
docker compose start mirror

开启密码认证(可选)

  1. 生成密码文件:
mkdir -p ./auth
docker run --rm --entrypoint htpasswd httpd:2 \
  -Bbn teacher secret123 > ./auth/htpasswd
  1. config/registry-push.yml 中取消注释 auth 段:
auth:
  htpasswd:
    realm: "Docker Registry"
    path: /auth/htpasswd
  1. docker-compose.yml private 服务里挂载:
volumes:
  - ./auth:/auth:ro
  1. 重启并登录:
docker compose restart private
docker login localhost:5001

暴露到局域网

localhost 换成服务器 IP,其他机器的 daemon.json:

{
  "registry-mirrors": ["http://192.168.1.100:5000"],
  "insecure-registries": ["192.168.1.100:5000", "192.168.1.100:5001"]
}
⚠️ HTTP 非加密,仅建议内网使用。生产环境建议加 Nginx + TLS。