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

文章目录 「隐藏」
  1. unsetunset1. 部署 Docker Registryunsetunset
  2. unsetunset2. 拉取、推送镜像到 Registryunsetunset
    1. 2.1 调用接口查看当前仓库镜像列表
    2. 2.2 推送镜像
    3. 2.3  拉取镜像
    4. 2.4 从远端推送拉取
  3. unsetunset3. 配置认证 unsetunset
    1. 3.1 创建密码文件
    2. 3.2 启动带认证的 Docker Registry
  4. unsetunset4. 参考资料 unsetunset

镜像仓库 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

 

 

《docker官方私有镜像仓库解决方案》留言数:0

发表留言