docker官方私有镜像仓库解决方案
镜像仓库 Docker Registry 实践-http协议
镜像仓库(Registry)是存储和分发容器镜像的服务器应用。容器镜像是容器的可移植打包格式,包含了应用程序及其依赖的所有内容。镜像仓库主要用于存储这些镜像,并允许用户通过网络将镜像拉取到本地进行部署。
镜像仓库的主要功能:
-
镜像存储: 提供集中式存储,管理多种版本的容器镜像。 -
镜像分发: 通过网络分发镜像,支持多种镜像传输协议。 -
权限控制: 通过用户认证和授权管理对镜像的访问权限。 -
镜像管理: 提供镜像的标签、版本控制等管理功能。
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/registry
:Registry
容器存放镜像的路径,路径是固定的。
这会启动一个在本地监听 5000 端口的镜像仓库服务。
说明:
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 中:
-
为镜像打标签,使其指向本地 Registry:
docker tag <image-name> localhost:5000/<your-image-name>:tag
-
将镜像推送到本地 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
-
https://distribution.github.io/distribution/about/deploying/ -
https://distribution.github.io/distribution/about/deploying/#native-basic-auth
阅读剩余
版权声明:
作者:admin
链接:http://999.zuizhuai.cn/?p=8761
文章版权归作者所有,未经允许请勿转载。
THE END