admin管理员组文章数量:1649205
文章目录
- 什么是Docker仓库?
- 私有仓库registry的优势
- Docker Hub
- Registry工作原理
- 配置镜像加速器
- 搭建私有仓库
- 步骤
- 给私有库添加WebUI界面
- 总结
什么是Docker仓库?
- Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
- Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
私有仓库registry的优势
- 有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
- 使用私有仓库有许多优点:
- 1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
- 2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
- 目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。
Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。
Docker Hub
- docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
lftp 172.25.11.250:/pub/images> get registry2.tar #Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以部署完成仓库,
[root@server1 docker]# mv registry2.tar ~
[root@server1 docker]# cd
[root@server1 ~]# docker load -i registry2.tar #导入registry镜像
[root@server1 ~]# docker images
- 运行registry容器。
[root@server1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2
[root@server1 ~]# netstat -antlupe | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 0 558311 20793/docker-proxy
[root@server1 ~]# docker tag rhel7:v1 localhost:5000/nginx #docker hub为了区分不同用户的同名镜像,要求镜像的格式是:[username]/xxx.tag
[root@server1 ~]# docker images
[root@server1 ~]# docker push localhost:5000/nginx #将本地镜像上传至私有仓库
[root@server1 ~]# cd /opt/registry/
[root@server1 registry]# ls
docker
[root@server1 registry]# curl localhost:5000/v2/_catalog
{"repositories":["nginx"]}
- 尝试拉取刚刚上传的镜像
首先删除本地的镜像,再拉取。
[root@server1 registry]# docker rmi localhost:5000/nginx:latest
[root@server1 registry]# docker images
[root@server1 registry]# docker pull localhost:5000/nginx
[root@server1 registry]# docker images
- 安装tree,查看/opt/registry/目录下的镜像数据
[root@server1 registry]# yum install tree -y
[root@server1 registry]# pwd
/opt/registry
[root@server1 registry]# tree docker/
我们可以从中看到nginx的镜像数据,同时可以明显看出镜像是分层的
同时我们还发现镜像ID其实与上图中nginx镜像中最上层的ID相同
Registry工作原理
一次docker pull 或 push背后发生的事情
- index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
- Docker Registry有三个角色,分别是index、registry和registry client。
index负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI,元数据存储,认证服务,符号化
registry是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
Registry Client: Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
具体的工作流程如下: - 用户发送请求到index来下载镜像。
- index 响应返回三个相关部分信息:该镜像位于的registry+该镜像包括所有层的校验+以授权目的Token
- 用户通过响应中返回的Token和registry沟通,registry全权负责镜像,它存储基本的镜像和继承的层。
- registry现在要与index证实该token是被授权的。
- index会发送“true” 或者 “false”给registry,由此允许用户下载所需要的镜像。
具体工作流程如下
- 用户发送带证书请求到index要求分配库名。
- 在成功认证,命名空间可用以及库名被分配之后。index响应返回临时的token。
- 镜像连带token,一起被推送到registry中。
- registry与index证实token,然后在index验证之后开始读取推送流。
- 该index然后更新由Docker生成的镜像校验。
具体工作流程如下:
- index接收来自Docker一个删除库的信号。
- 如果index验证库成功,它将删除该库,并返回一个临时token。
- registry现在接收到带有该token的删除信号。
- registry与index核实该token,然后删除库以及所有相关信息。
- Docker现在通知有关删除的index,然后index移除库的所有记录。
配置镜像加速器
- 从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以阿里云为例:(需要提前注册阿里云帐号)
- 方法:登陆阿里云,选择弹性计算—>容器镜像服务—>镜像加速器—>获取加速器地址。
- 配置docker daemon文件,重载docker服务:
[root@server1 docker]# cd /etc/docker/
[root@server1 docker]# ls
daemon.json key.json
[root@server1 docker]# vim daemon.json
{
"registry-mirrors": ["https://fep2vpcs.mirror.aliyuncs"]
}
systemctl daemon-reload #重载守护进程
systemctl restart docker
搭建私有仓库
- docker hub虽然方便,但是还是有限制,需要internet连接,速度慢;所有人都可以访问;由于安全原因企业不允许将镜像放到外网;好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库。
例如:我们可以在server2主机访问server1的库,这样不安全。
[root@server2 ~]# curl http://172.25.11.1:5000/v2/_catalog
{"repositories":["nginx"]}
[root@server2 ~]# curl http://172.25.11.1:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest"]}
步骤
- 下载registry镜像
docker pull registry
- 运行registry容器
docker run -d -p 5000:5000 registry:2
- 上传镜像到本地仓库,本地镜像在命名时需要加上仓库的ip和端口。
docker tag nginx:latest localhost:5000/nginx:latest
docker push localhost:5000/nginx:latest
- 为Docker仓库添加证书加密功能,生成证书
[root@server1 ~]# mkdir certs
[root@server1 ~]# cd certs/
[root@server1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.key -x509 -days 365 -out certs/westos.crt
- 域名westos要求在主机上有解析,添加本地解析。
[root@server1 certs]# vim /etc/hosts
172.25.11.1 server1 westos
- 拷贝证书到docker主机
[root@server1 ~]# cd certs/
[root@server1 certs]# ls
westos.crt westos.key
[root@server1 docker]# mkdir -p certs.d/westos/
[root@server1 docker]# cd certs.d/westos/
[root@server1 westos]# pwd
/etc/docker/certs.d/westos
[root@server1 westos]# cp ~/certs/westos.crt ca.crt
[root@server1 westos]# ls
ca.crt
- server2主机:安装docker,做好解析。
[root@server2 ~]# vim /etc/hosts
172.25.11.1 server1 westos
- 将证书和key发给server2。
[root@server1 westos]# scp -r /etc/docker/certs.d/ server2:/etc/docker/
- 为Docker仓库添加用户认证功能,生成用户密码文件。
[root@server1 ~]# mkdir auth
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn admin westos > auth/htpasswd
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn zhang westos >> auth/htpasswd
[root@server1 ~]# cat auth/htpasswd
- 重建registry容器(首先netstat命令查看下,保证443端口没有被占用。)
[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.key \
> -p 443:443 \
> -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@server1 ~]# docker ps
[root@server1 ~]# netstat -ntlp #查看443端口有没有开启
[root@server1 ~]# docker history registry:2
- docker主机认证,首先上传一个镜像,
[root@server1 ~]# docker tag localhost:5000/nginx:latest westos/nginx
[root@server1 ~]# docker push westos/nginx
[root@server1 ~]# docker login westos
[root@server1 ~]# cd .docker/
[root@server1 .docker]# cat config.json #在文件config.json 中可以看到记录的认证(认证一次,永久保存)
- server2登陆并尝试拉取镜像。
[root@server2 ~]# docker pull westos/nginx
[root@server2 ~]# docker login westos
[root@server2 ~]# docker pull westos/nginx
[root@server2 ~]# docker images
给私有库添加WebUI界面
- Web Registry
lftp 172.25.11.250:/pub/images> get docker-registry-web.tar
[root@server1 ~]# docker load -i docker-registry-web.tar
[root@server1 ~]# cat .docker/config.json
[root@server1 ~]# docker run -d -p 8080:8080 --name registry-web --link registry:westos -e REGISTRY_URL=https://westos/v2 -e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_BASIC_AUTH="YWRtaW46d2VzdG9z" -e REGISTRY_NAME=westos docker-registry-web
[root@server1 ~]# docker ps
[root@server1 ~]# docker images
[root@server1 ~]# docker load -i game2048.tar
[root@server1 ~]# docker tag game2048:latest westos/game2048
[root@server1 ~]# docker push westos/game2048
- 浏览器访问:
http://172.25.11.1:8080/
总结
- docker 仓库子命令
docker search 查询镜像
docker pull 拉取镜像
docker push 上传镜像
docker login 登录仓库
docker logout 登出仓库
版权声明:本文标题:Docker仓库 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729508100a1203758.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论