自建Docker镜像加速器
Registry配合nginx反向代理方案
整体的思路:在nginx上实现basic认证,通过nginx反向代理到私有仓库中。
为什么不直接使用私有仓库的认证
一个原因是可以避免携带端口,另外一个原因是nginx反向代理到私有仓库后,认证会失败。docker login可以直接适用于nginx的basic auth。
registry代理模式介绍
Docker Registry 的代理模式(Proxy Mode)是一种特殊的运行模式,它允许本地 Registry 作为 Docker Hub 的代理服务器。这种模式的主要特点和优势包括:
- 镜像缓存:当客户端请求镜像时,Registry 会首先检查本地是否已缓存该镜像。如果存在,则直接返回;如果不存在,则从 Docker Hub 拉取并缓存。
- 加速访问:通过本地缓存,可以显著减少从 Docker Hub 拉取镜像的时间,特别是在网络条件不佳的情况下。
- 带宽节省:多个客户端请求相同镜像时,只需要从 Docker Hub 拉取一次,后续请求都从本地缓存获取。
- 离线支持:一旦镜像被缓存,即使 Docker Hub 暂时无法访问,本地客户端仍然可以拉取已缓存的镜像。
- 配置简单:只需要通过环境变量
REGISTRY_PROXY_REMOTEURL
指定上游 Registry 地址即可启用代理模式。
Docker Compose部署
创建 docker-compose.yml
文件:
yaml
services:
registry:
image: registry:2
container_name: registry
restart: always
ports:
- "5000:5000"
environment:
- REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
volumes:
- ./registry-data:/var/lib/registry # 持久化存储镜像数据
- ./auth:/auth
启动服务:
bash
docker-compose up -d
登录:
docker login http://localhost:5000
验证服务:
bash
curl http://localhost:5000/v2/_catalog
nginx反向代理
nginx添加一个反向代理,转发到私有registry:
nginx
location ^~ / {
proxy_pass http://localhost:5000;
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
然后在nginx上加上Basic Auth认证即可。
纯Nginx反向代理缓存方案
使用Nginx作为Docker Registry的反向代理,实现镜像缓存加速。
安装配置
安装Nginx
bash
sudo apt install nginx
配置Nginx代理
创建 /etc/nginx/conf.d/docker-registry.conf
:
nginx
proxy_cache_path /var/cache/nginx/docker levels=1:2 keys_zone=docker:10m inactive=60m use_temp_path=off;
server {
listen 443 ssl;
server_name your.domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://registry-1.docker.io;
proxy_set_header Host registry-1.docker.io;
proxy_cache docker;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
}
}
重启Nginx
bash
sudo systemctl restart nginx
客户端配置
修改/etc/docker/daemon.json
,添加配置:
json
{
"registry-mirrors": ["https://domain"]
}
执行docker login
登录后即可使用私有的镜像仓库进行加速。