docker官方私有镜像仓库解决方案

镜像仓库 Docker Registry 实践-http协议

镜像仓库(Registry)是存储和分发容器镜像的服务器应用。容器镜像是容器的可移植打包格式,包含了应用程序及其依赖的所有内容。镜像仓库主要用于存储这些镜像,并允许用户通过网络将镜像拉取到本地进行部署。

镜像仓库的主要功能

  1. 镜像存储: 提供集中式存储,管理多种版本的容器镜像。
  2. 镜像分发: 通过网络分发镜像,支持多种镜像传输协议。
  3. 权限控制: 通过用户认证和授权管理对镜像的访问权限。
  4. 镜像管理: 提供镜像的标签、版本控制等管理功能。

Docker Registry 是一个开源的镜像仓库实现,允许用户在本地或云端搭建自己的镜像仓库,提供了高效的镜像存储和分发功能。

下面记录在本地机器(已经安装docker)搭建和使用 Docker Registry。

unsetunset1. 部署 Docker Registryunsetunset

使用 Docker 容器运行一个 Registry 服务:

docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2

root@harbor:~/harbor# docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2
2c60ce3bd400bf8307869e17b2b6308e8ab4a5c1a905378ac4386bfc76585227
root@harbor:~# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED       STATUS     PORTS             NAMES
2c60ce3bd400   registry:2   "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
  • /mnt/registry:宿主机路径,可以自定义。
  • /var/lib/registryRegistry容器存放镜像的路径,路径是固定的。

这会启动一个在本地监听 5000 端口的镜像仓库服务。

说明:

  1. Docker 使用 /var/lib/docker 作为默认路径来存储所有 Docker 相关文件(包括镜像)。建议您添加附加存储卷,分别给 /var/lib/docker 和 /mnt/registry 挂载至少 100G。

unsetunset2. 拉取、推送镜像到 Registryunsetunset

拉取、推送镜像过程与一般使用其他镜像仓库时的操作类似,如果客户端和registry位于同一台机器,host为localhost;如果客户端位于远端,使用registry所在机器的ip地址作为host。

2.1 调用接口查看当前仓库镜像列表

Docker Registry没有像harbor那样的web界面可以直观的查看镜像仓库列表,需要通过调用接口查看:

curl -X GET http://IP:port/v2/_catalog

以本地调用查看为例,由于是新搭建的registry实例,仓库中是空的:

root@harbor:~# curl -X GET http://localhost:5000/v2/_catalog
{"repositories":[]}

2.2 推送镜像

将镜像推送到本地搭建的 Registry 中:

  1. 为镜像打标签,使其指向本地 Registry:
docker tag <image-name> localhost:5000/<your-image-name>:tag
  1. 将镜像推送到本地 Registry:
docker push localhost:5000/<your-image-name>:tag

以本地的kubernetes dashboard镜像推送为例,如下:

root@harbor:~# docker tag kubernetesui/dashboard:v2.7.0 localhost:5000/kubernetesui/dashboard:v2.7.0
root@harbor:~# docker push localhost:5000/kubernetesui/dashboard:v2.7.0
The push refers to repository [localhost:5000/kubernetesui/dashboard]
c88361932af5: Pushed
bd8a70623766: Pushed
v2.7.0: digest: sha256:ef134f101e8a4e96806d0dd839c87c7f76b87b496377422d20a65418178ec289 size: 736

# 再次调用接口查看镜像列表
root@harbor:~# curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["kubernetesui/dashboard"]}
# 查看镜像的tag列表
root@harbor:~# curl -X GET http://localhost:5000/v2/kubernetesui/dashboard/tags/list
{"name":"kubernetesui/dashboard","tags":["v2.7.0"]}

2.3  拉取镜像

从本地 Registry 中拉取镜像:

docker pull localhost:5000/<your-image-name>:tag

root@harbor:~# docker pull localhost:5000/kubernetesui/dashboard:v2.7.0
v2.7.0: Pulling from kubernetesui/dashboard
Digest: sha256:ef134f101e8a4e96806d0dd839c87c7f76b87b496377422d20a65418178ec289
Status: Image is up to date for localhost:5000/kubernetesui/dashboard:v2.7.0
localhost:5000/kubernetesui/dashboard:v2.7.0

2.4 从远端推送拉取

如果是http协议部署,客户端侧远端推送需要信任配置,以docker为例,编辑/etc/docker/daemon.json:

# 例如registry搭建在ip为192.168.0.156的机器上,在另外的机器上配置进行拉取推送
[root@k8s ~]# cat /etc/docker/daemon.json
{
   "insecure-registries": ["http://192.168.0.156:5000"]
}
# 重启docker生效
systemctl daemon-reload; systemctl restart docker

[root@k8s ~]#  docker pull 192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
v2.7.0: Pulling from kubernetesui/dashboard
ee3247c7e545: Pull complete
8e052fd7e2d0: Pull complete
Digest: sha256:ef134f101e8a4e96806d0dd839c87c7f76b87b496377422d20a65418178ec289
Status: Downloaded newer image for 192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
[root@k8s ~]#  docker push 192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
The push refers to repository [192.168.0.156:5000/kubernetesui/dashboard]
c88361932af5: Layer already exists
bd8a70623766: Layer already exists
v2.7.0: digest: sha256:ef134f101e8a4e96806d0dd839c87c7f76b87b496377422d20a65418178ec289 size: 736

unsetunset3. 配置认证unsetunset

上述情况中Docker Registry是允许自由访问的,如果需要开放给其他人使用或者增强安全性,可以配置认证。

3.1 创建密码文件

# 方法1:使用Apache的htpasswd创建加密文件
yum -y install httpd-tools
# 创建管理员admin,密码为123456,存入密码文件
mkdir auth
htpasswd -Bbn admin 123456 > auth/htpasswd

# 方法2:使用httpd容器镜像生成
docker run --entrypoint htpasswd httpd:2 -Bbn admin 123456 > auth/htpasswd

# 查看密码文件
root@harbor:~# cat auth/htpasswd
admin:$2y$05$YXUsPY1os2h7BpkqNLdSQOixnzZ5YX/DgFYH3Qyu8I.JnMvUx7mTq

3.2 启动带认证的 Docker Registry

  • REGISTRY_AUTH=htpasswd # 以 htpasswd 的方式认证
  • REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm # 注册认证
  • REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd # 认证的用户密码
# 停止并删除之前的容器
docker container stop registry
docker rm registry

# 启动带有认证的Registry
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  -v "$(pwd)"/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2、
  
# 本地登录测试
root@harbor:~# docker login localhost:5000
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 远端测试。此时从远端推送提示需要认证
[root@k8s ~]#  docker push 192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
The push refers to repository [192.168.0.156:5000/kubernetesui/dashboard]
c88361932af5: Preparing
bd8a70623766: Preparing
no basic auth credentials

# 登录
[root@k8s ~]# docker login 192.168.0.156:5000 -u admin -p 123456
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 推送成功
[root@k8s ~]#  docker push 192.168.0.156:5000/kubernetesui/dashboard:v2.7.0
The push refers to repository [192.168.0.156:5000/kubernetesui/dashboard]
c88361932af5: Layer already exists
bd8a70623766: Layer already exists
v2.7.0: digest: sha256:ef134f101e8a4e96806d0dd839c87c7f76b87b496377422d20a65418178ec289 size: 736

# 接口认证测试
[root@k8s ~]# curl -X GET http://192.168.0.156:5000/v2/_catalog -u admin
Enter host password for user 'admin':
{"repositories":["kubernetesui/dashboard"]}

unsetunset4. 参考资料unsetunset

  1. https://distribution.github.io/distribution/about/deploying/
  2. https://distribution.github.io/distribution/about/deploying/#native-basic-auth

 

 

阅读剩余
THE END