自建Docker Hub镜像服务

1. 前言

最近在某些神秘力量的影响下,SJTUG/USTC等知名Docker Hub镜像站陆续停止服务。

文本使用CNCF Distribution的registry项目,只需要运行一个Docker容器,就可以自建Docker Hub镜像服务。

2. 所需条件

  • 可运行Docker容器的服务器
  • 可以访问docker.io的HTTP代理(如果服务器无法直接访问的话)

3. 生成SSL证书

registry默认使用HTTP协议对外提供服务,使用HTTPS更安全&更通用。笔者生成自签名证书的命令如下:

1
2
3
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"

4. 启动registry服务

准备好registry的存储目录,放入上一步生成的证书文件。然后编写如下docker-compose文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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"
REGISTRY_PROXY_REMOTEURL: "https://registry-1.docker.io" # 指定上游仓库地址
HTTPS_PROXY: "{HTTP代理地址}"
restart: always
container_name: registry
volumes:
- "/{你的路径}/registry:/var/lib/registry"
- "/{你的路径}/registry_config.yml:/etc/docker/registry/config.yml"

用docker-compose运行容器即可启动服务:

1
docker-compose -f registry.yml up -d

此时registry会在笔者的服务器上,也就是https://192.168.1.30:5000提供服务。

5. 客户端使用

5.1 信任SSL证书

由于registry使用的是自签名SSL证书,客户端要想成功拉取镜像需要先信任该证书。方式有两种,第一种是将证书加入客户端的的系统信任列表(推荐):

1
2
sudo cp /${你的路径}/example.com.crt /usr/share/ca-certificates
sudo dpkg-reconfigure ca-certificates

然后重启Docker/K3S等需要拉取镜像的服务;第二种是让Docker拉取镜像时跳过证书校验:

1
sudo vim /etc/docker/daemon.json
1
2
3
4
5
6

{
...
"insecure-registries": ["192.168.1.30:5000"]
...
}

然后重启docker服务。

信任完证书后,此时就可以拉取Docker Hub上的镜像看到效果了:

1
docker pull 192.168.1.30:5000/grafana/grafana:main

5.2 设置Docker镜像源

同样是编辑/etc/docker/daemon.json,将上述registry服务作为Docker镜像源:

1
2
3
4
5
6
7
{
...
"registry-mirrors": [
"https://192.168.1.30:5000"
]
...
}

然后重启Docker服务,此时就可以快速拉取镜像了

1
docker pull grafana/grafana:main

enjoy!


自建Docker Hub镜像服务
https://www.yooo.ltd/2024/06/08/self-host-docker-hub-mirror/
作者
OrangeWolf
发布于
2024年6月8日
许可协议