搭建自己的 docker-hub 仓库

前言

之前写了一篇通过 GitHub Actions 的容器作为中转拉取 docker-hub 博客,不过使用的还是阿里云的镜像仓库

GitHub 上有推荐自建仓库的开源项目,比如 registry-mirror

网上虽然有不少活雷锋把自己的仓库开源出来,不过不少是限速的,拉取小镜像还好,一旦需要拉取像是 elasticsearch 这样大的镜像,又可能会因为拉取速度太慢导致多次重试,最后失败

这次,我也来试试自建仓库。自建的 docker 仓库,都是基于官方的一个镜像 registry

image-20240712234628328

下面简单说说自建仓库的过程

资源准备

  1. 域名和证书

这个倒不是必须的,但 Docker 默认不允许非 HTTPS 方式推送镜像的

  1. 镜像 httpd

这里选择的是 httpd:alpine,这个镜像主要用来生成 http 认证文件

  1. 镜像 registry

这里选择的是 registry:latest,搭建自己 docker 仓库就靠它了

编写配置

http 认证文件
1
2
3
4
5
# 把命令中的 username 和 password 换成自己的用户名称和密码即可,后续 docker login 时需要通过这个凭证来登陆自己搭建好的 docker 仓库
> docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn username password > auth/nginx.htpasswd
config.yml

这个配置文件是 registry 的配置文件,默认位置在 /etc/docker/registry/config.yml

另外,值得注意的是,保存在仓库中的镜像默认存放在 /var/lib/registry 目录下

此外,http.tls 还配置了公私钥,比如我的域名是 docker.wuhunyu.top

以下是示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: 0.1
log:
accesslog:
disabled: true
level: warn
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :443
host: https://docker.wuhunyu.top
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.wuhunyu.top.pem
key: /etc/docker/registry/ssl/docker.wuhunyu.top.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
docker-compose 配置脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3'

services:
registry:
container_name: docker-registry
image: registry:latest
restart: always
ports:
- "443:443"
volumes:
- /home/wuhunyu/registry/config.yml:/etc/docker/registry/config.yml:ro
- /home/wuhunyu/registry/repository:/var/lib/registry
- /home/wuhunyu/registry/auth/nginx.htpasswd:/etc/docker/registry/auth/nginx.htpasswd:ro
- /home/wuhunyu/cert/docker.wuhunyu.top.pem:/etc/docker/registry/ssl/docker.wuhunyu.top.pem:ro
- /home/wuhunyu/cert/docker.wuhunyu.top.key:/etc/docker/registry/ssl/docker.wuhunyu.top.key:ro

volumes:
docker-registry:

分别指定了 registry 的配置文件,暴露仓库镜像数据卷,指定 http 认证文件以及公私钥文件

配置完毕之后,我的目录结构如下

1
2
3
4
5
6
registry
├── auth
│   └── nginx.htpasswd
├── config.yml
├── docker-registry.yml
└── repository

启动

通过 docker-compose -f docker-registry.yml up -d 完成自建仓库的部署

1
2
3
4
[+] Building 0.0s (0/0)                                                                                         docker:default
[+] Running 2/2
✔ Network registry_default Created 0.1s
✔ Container docker-registry Started 0.0s

通过 docker ps | grep docker-registry 可以观察到容器是否正常运行

1
3e3d14457946   registry:latest  "/entrypoint.sh /etc…"	2 minutes ago	Up 2 minutes	5000/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp	docker-registry

登录仓库

1
> docker login docker.wuhunyu.top

对需要上传的镜像打标签

1
2
# 这里以 openjdk:21-jdk-slim 为例
> docker tag openjdk:21-jdk-slim docker.wuhunyu.top/openjdk:21-jdk-slim

推送镜像到自建仓库

1
2
# 这里以 openjdk:21-jdk-slim 为例
> docker push docker.wuhunyu.top/openjdk:21-jdk-slim

退出登录

1
> docker logout docker.wuhunyu.top

最后

自建的仓库服务我放在自己的云服务器上,最所周知,带宽资源才是最昂贵的,阿里云对流入的流量我在上传镜像的时候感觉还行,上传近 1G 的镜像,能在一分钟内跑完,到了拉取镜像就开始不好了,1G 的镜像拉取了 5 分钟都还没结束,这个和我的带宽有关,我的带宽只有 3 Mbps

最后总结为自建的 docker 仓库还不好用,主要是我不想为网络资源额外付费

引用资源

registry-mirror

私有仓库

私有仓库高级配置

作者

wuhunyu

发布于

2024-07-13

更新于

2024-09-05

许可协议