前言
之前写了一篇通过 GitHub Actions 的容器作为中转拉取 docker-hub 博客,不过使用的还是阿里云的镜像仓库
GitHub 上有推荐自建仓库的开源项目,比如 registry-mirror
网上虽然有不少活雷锋把自己的仓库开源出来,不过不少是限速的,拉取小镜像还好,一旦需要拉取像是 elasticsearch 这样大的镜像,又可能会因为拉取速度太慢导致多次重试,最后失败
这次,我也来试试自建仓库。自建的 docker 仓库,都是基于官方的一个镜像 registry
下面简单说说自建仓库的过程
资源准备
- 域名和证书
这个倒不是必须的,但 Docker 默认不允许非 HTTPS
方式推送镜像的
- 镜像
httpd
这里选择的是 httpd:alpine
,这个镜像主要用来生成 http 认证文件
- 镜像
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
私有仓库
私有仓库高级配置