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!