1. 前言
最近在某些神秘力量的影响下,SJTUG/USTC 等知名 Docker Hub 镜像站陆续停止服务。
文本使用CNCF Distribution的 registry 项目,只需要运行一个 Docker 容器,就可以自建 Docker Hub 镜像服务。
2. 所需条件
3. 编写 registry 配置文件
下面是笔者的 registry 配置文件,设置 Docker Hub 镜像的核心配置是proxy:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
proxy: # 关键镜像仓库配置
remoteurl: https://registry-1.docker.io
ttl: 168h
4. 生成 SSL 证书
registry 默认使用 HTTP 协议对外提供服务,使用 HTTPS 更安全&更通用。笔者生成自签名证书的命令如下:
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
-nodes -keyout example.com.key -out example.com.crt -subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:*.example.com,IP:100.x.x.x,IP:192.168.1.30"
5. 启动 registry 服务
准备好 registry 的存储目录,放入上一步生成的证书文件。然后编写如下 docker-compose 文件:
version: '3.1'
services:
registry:
image: registry:2
network_mode: "host"
environment:
REGISTRY_HTTP_ADDR: "0.0.0.0:5000"
REGISTRY_HTTP_TLS_KEY: "/var/lib/registry/example.com.key"
REGISTRY_HTTP_TLS_CERTIFICATE: "/var/lib/registry/example.com.crt"
HTTPS_PROXY: "{HTTP 代理地址}"
restart: always
container_name: registry
volumes:
- "/{你的路径}/registry:/var/lib/registry"
- "/{你的路径}/registry_config.yml:/etc/docker/registry/config.yml"
用 docker-compose 运行容器即可启动服务:
docker-compose -f registry.yml up -d
此时 registry 会在笔者的服务器上,也就是https://192.168.1.30:5000提供服务。
6. 客户端使用
6.1 信任 SSL 证书
由于 registry 使用的是自签名 SSL 证书,客户端要想成功拉取镜像需要先信任该证书。方式有两种,第一种是将证书加入客户端的的系统信任列表(推荐):
sudo cp /${你的路径}/example.com.crt /usr/share/ca-certificates
sudo dpkg-reconfigure ca-certificates
然后重启 Docker/K3S 等需要拉取镜像的服务;第二种是让 Docker 拉取镜像时跳过证书校验:
sudo vim /etc/docker/daemon.json
{
...
"insecure-registries": ["192.168.1.30:5000"]
...
}
然后重启 docker 服务。
信任完证书后,此时就可以拉取 Docker Hub 上的镜像看到效果了:
docker pull 192.168.1.30:5000/grafana/grafana:main
6.2 设置 Docker 镜像源
同样是编辑/etc/docker/daemon.json,将上述 registry 服务作为 Docker 镜像源:
{
...
"registry-mirrors": [
"https://192.168.1.30:5000"
]
...
}
然后重启 Docker 服务,此时就可以快速拉取镜像了
docker pull grafana/grafana:main
enjoy!