Docker私有库的开发
正常来说我们使用别人的私有库就足够了,比如使用 Harbor,它可以帮我们很好的管理 docker,以及部署为私有或公有库给企业或其他人使用,如果想开发一套那么需要了解 docker 相关的 API,其中 dockerAPI 分为如下三部分:
- Docker Engine API:Docker Engine API 是 Docker 引擎的 API 接口,用于与 Docker 引擎进行通信和管理。通过 Docker Engine API,可以管理容器、镜像、网络、卷等 Docker 相关资源。可以使用 Docker Engine API 创建、启动、停止和删除容器,构建和推送镜像,以及进行容器和镜像的管理和监控。
- Docker Hub API:Docker Hub API 是与 Docker Hub 交互的 API 接口。Docker Hub 是一个公共的 Docker 镜像仓库,用于存储和分享 Docker 镜像。Docker Hub API 允许用户通过 API 接口与 Docker Hub 进行交互,可以搜索、下载、上传和删除镜像,管理仓库、标签和组织等
- Registry API:Registry API 是与 Docker Registry 进行交互的 API 接口。Docker Registry 是一个私有的 Docker 镜像仓库,可以自己搭建和管理。Registry API 允许用户通过 API 接口与私有的 Docker Registry 进行交互,可以上传、下载和删除镜像,管理仓库和标签等
没错,如果需要建立自己的 docker 私有库就要用到 Registry API。
# 准备
要在本地搭建私有的 Docker Registry,您可以按照以下步骤进行操作:
- 确保已经安装 Docker,若还没有,您可以从 Docker 官方网站(https://www.docker.com/)下载并安装适用于您的操作系统的 Docker 版本。
- 配置 Docker Registry:接下来,您需要创建并配置 Docker Registry。可以按照以下步骤进行配置:
- 创建一个存储 Registry 数据的目录。例如,您可以创建一个名为 /var/lib/registry 的目录。
- 创建一个名为 config.yml 的配置文件,并在其中指定 Registry 的配置选项。例如,您可以指定 Registry 监听在 5000 端口上,并允许匿名访问。(具体见下面 config 配置讲解)
- 为 Docker Registry API 提前配置
先进行配置,去/etc/docker/daemon.json
添加如下一句,最好是宿主机的 IP,不要使用 127.0.0.1
,我这里是方便测试,不使用宿主机 IP,会造成在使用 Docker Engine API 报 HTTPS 错误。
{
"insecure-registries": ["127.0.0.1:5000"]
}
2
3
配置完成后需要重新启动 Docker
sudo systemctl restart docker
- 启动 Registry 容器:使用以下命令在本地启动 Registry 容器,官方文档 https://docs.docker.com/registry/deploying/?_gl=11ytdheb_gaODY2NTEyNi4xNjkyMDAxODU2_ga_XJWPQMJYHQ*MTY5Mzk5NzEyNy4yNS4xLjE2OTM5OTcyMTAuNTMuMC4w#native-basic-auth
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/software/dockerRegistry:/var/lib/registry -v /opt/software/dockerRegistry/config.yml:/etc/docker/registry/config.yml registry:2
这个命令将在本地启动一个名为 registry 的容器,并将本地的 /var/lib/registry 目录挂载到容器的 /var/lib/registry 目录,以保存 Registry 的数据。
5. 测试 Registry:现在,您的私有 Docker Registry 应该已经在本地成功搭建。您可以使用以下命令来测试 Registry 是否正常工作:
- 从 Docker Hub 拉取一个镜像:
docker pull ubuntu
- 标记该镜像为私有 Registry 的地址:
docker tag ubuntu 127.0.0.1:5000/my-ubuntu
- 将标记的镜像推送到私有 Registry:
docker push 127.0.0.1:5000/my-ubuntu
- 从私有 Registry 拉取镜像:
docker pull 127.0.0.1:5000/my-ubuntu
如果上述步骤都成功执行,那么私有 Docker Registry 就已经搭建好了,并且可以通过 http://127.0.0.1:5000/v2/my-ubuntu/tags/list 进行访问。
# config.yml
config 里面是一些配置信息,包括存储库位置,日志,安全认证等,首先要配置安全认证
# 安装 htpasswd 文件的工具
yum install -y httpd-tools
# 创建一个 htpasswd 文件,并添加用户名和密码
htpasswd -Bbn user1 password1 > /opt/software/dockerRegistry/htpasswd
2
3
4
配置 config.xml
# 指定配置文件的版本。目前可用的版本为0.1。
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
# 指定存储镜像数据的目录路径。
rootdirectory: /var/lib/registry
# 可执行删除操作,不能省
delete:
enabled: true
# 暴漏端口
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
# 心跳
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
# 基本认证(Basic Auth),还可以使用Bearer Token认证、AWS认证、LDAP认证
auth:
htpasswd:
realm: registry
path: /opt/software/dockerRegistry/htpasswd
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
如果已经启动容器,修改后需要重新启动容器
# 使用 Docker Registry
接下来先登录我们的私有库,如果是本机,使用 127.0.0.1,如果没设置账号密码,则默认是宿主机本身 SSH 连接的账号密码
docker login <registry_host>
# 可以使用快捷命令
docker login 127.0.0.1:5000 --username=xxx --password=xxxx
2
3
登出
docker logout <registry_host>
为需要推送的镜像打 tag(必须)
docker tag my-image:latest 127.0.0.1:5000/my-image:latest
推送镜像
docker push localhost:5000/my-image:latest
# 访问 Registry API
API 的访问输入你 docker 所在的 IP,加以上设置的端口就行,访问需要带版本号,目前 Docker 建议使用 v2 版本,所以请求路径需要带上,如: http://xx.xxx.xx.xx:5000/v2/_catalog
- 检查连接(一定要考虑兼容)
GET /v2/
返回 200 代表ok
返回 401 代表需要身份验证
返回 404 代表注册表未实现 /v2/,有可能就是 v1
2
3
4
- 列出存储库:
// 获取全部
GET /v2/_catalog
{
"repositories": [
<name>,
...
]
}
// 分页获取
GET /v2/_catalog?n=<integer>
2
3
4
5
6
7
8
9
10
- 列出镜像 tags
/v2/<ImagesName>/tags/list