Docker部署私有仓库(registry&Harbor)
简介Docker Hub 官方仓库在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。仓库(Re...
简介
Docker Hub 官方仓库
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。
仓库(Repository)
一个容易混淆的概念是注册服务器(registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址docker.sina.com.cn/centos:centos7来说,docekr.sian.com.cn是注册服务器地址,centos是仓库名,centos7是仓库的tag(标签)。
部署registry
(1) 拉取registry私有库镜像
Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。
docker pull registry:2
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
参数解析
-d:后台运行
-p:将容器的5000端口映射到宿主机的5000端口
–restart:docker服务重启后总是重启此容器
–name:容器的名称
-v = --volume:数据卷,进行一个挂载宿主机:容器内
。将容器的/var/lib/registry映射到宿主机的 /opt/registry目录
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
执行命令 curl 172.16.1.30:5000/v2/_catalog
,收到的响应如下,是个json对象,其中repositories对应的值是空的json数组,表示目前仓库里还没有镜像:
curl 172.16.1.30:5000/v2/_catalog
{"repositories":[]}
(2) 支持http协议推送
正常情况下,应用服务器推送镜像到仓库用的是https,此处我们通过命令行来测试推送用的是普通的http,所以需要在客户端配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问:
两种方法
修改/usr/lib/systemd/system/docker.service文件
或在/etc/docker/daemon.json 文件中添加以下内容
~]# cat /etc/docker/daemon.json
{ "insecure-registries":["192.168.50.11"] }
PS:如果不设置可信任源,又没有配置HTTPS证书,那么会遇到这个错误:error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.
重新加载进程并重启docker服务:
systemctl daemon-reload
systemctl restart docker
(3)将本地镜像push到私有仓库中
如果不对私有仓库命名的话,默认走的是公共仓库(docker hub),所以需要命名镜像。
私有仓库镜像的命名规则:宿主机ip地址:端口号/xxxx(需要更改的名称)
以nignx镜像为例,下载nginx镜像:
docker pull nginx
docker tag nginx:latest 172.16.1.30:5000/nginx:latest
注意:当你对源镜像(nginx:latest)进行命名后,命名后的镜像名称也视为一个标签,因为id号是相同的。如果当源镜像(nginx:latest)删除,命名后的镜像依然会存在,因为删除的是一个标签。
docker push 172.16.1.30:5000/nginx:latest
查看私有仓库中的镜像
curl 172.16.1.30:5000/v2/_catalog
{"repositories":["nginx"]}
查看仓库中镜像的标签
curl 172.16.1.30:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest"]}
如果需要删除私有仓库中的镜像,有一个简单的方法在运行registry时挂载在本地的目录[/opt/registry]中,找到指定的镜像存放的目录来进行删除。
cd /opt/registry
ls
blobs repositories
cd repositories/
ls
nginx
rm -rf nginx/
删除后再次查看私有仓库中的镜像是否还存在:
curl http://172.16.1.30:5000/v2/_catalog
{"repositories":[]}
(4) 从私有仓库中拉取镜像
docker pull 172.16.1.30:5000/nginx #使用pull命令进行拉取
如果要在其它机器拉取镜像的话,记得修改/usr/lib/systemd/system/docker.service
文件。
部署Harbor
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。
(1)安装compose
yum install docker-compose
部署harbor依赖这个东西
(2)下载harbor安装包并进行解压
下载地址:https://github.com/goharbor/harbor/releases
wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz
tar zxf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
cd /usr/local/harbor/
(3) 编写harbor配置文件
配置参数位于安装目录的 harbor.yml 文件中。
必须参数
- hostname: 目标主机的主机名。它应该是目标计算机的 IP 地址或完全限定的域名(FQDN),例如:172.16.1.30 或 reg.yourdomain.com。不要使用 localhost 或 127.0.0.1 作为主机名。
- data_volume: Harbor 数据的存储位置
- harbor_admin_password: 管理员的初始密码。此密码仅在 Harbor 首次启动时生效。请注意,默认用户 名/密码为 admin / Harbor12345
- database: 与本地数据库相关的配置。
- password: 默认数据库密码为 root123,应该改为一个安全的生产环境密码。
可选参数
- http:
port: 你的 http 的端口号。
- https: 启用 https 协议。如果启用了秘钥,则必须设置为 https。
port: https 的端口号。
certificate: SSL 证书的路径,仅在协议设置为 https 时应用。
private_key: SSL 密钥的路径,仅在协议设置为 https 时应用。
(4)启动Harbor
./install.sh
由于 Harbor 也是由一组容器构成,包括 redis、nginx等,安装过程会下载很多镜像,并启动很多容器,等脚本执行完后,看到提示这面这样就说明安装完毕了。
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://172.16.1.30.
For more details, please visit https://github.com/goharbor/harbor .
(5) 注册和创建仓库
访问 http://172.16.1.30 就看到登录界面了。(用户admin,密码:Harbor12345(在harbor配置文件中可以查看到)
新建项目
在项目中创建一个新的公开镜像仓库 testproject。
点击推送镜像,可以看到推送到此仓库的格式。
(6)推送镜像
我们使用此格式,从另一台机器推送镜像。
docker tag SOURCE_IMAGE[:TAG] 172.16.1.30/testproject/IMAGE[:TAG]
docker push 172.16.1.30/testproject/IMAGE[:TAG]
在本地终端上连接harbor:
docker login 172.16.1.30:80
因为默认走https所以不指定端口将默认443
将需要上传到harbor私有仓库的镜像进行push:
docker tag nginx:latest 172.16.1.30:80/testproject/nginx:latest #更改标签
docker push 172.16.1.30:80/testproject/nginx:latest #push到刚才在网页上创建的项目
push推送的时候,也要记得加上端口。
然后在 Harbor web 控制台中已经可以看到刚才上传的镜像了,私有本地仓库就创建好了,后期我们可以使用 admin 账户来管理。
并且在生产环境中,建议加入证书,使用 https 协议通信,为了防止单点故障,可以使用分布式存储如 Ceph 作为后端存储。
迁移Docker仓库
采用registry部署的迁移方法
参考文档:https://www.jianshu.com/p/0c4b55675b99
大概流程就是导出registry镜像,在新的机器导入,然后把镜像文件放到相同的目录下,启动就可以了。
采用Harbor部署的迁移方法
编写脚本把镜像重新上传到Harbor
切换镜像仓库
不管以上如何实现,但切换镜像仓库的方法大致相同。在测试没问题的前提下,执行以下流程:
1、如果选择registry,则只需要把原来registry仓库的镜像文件,直接复制到新的registry仓库的目录下。如过选用Harbor,则需要编写脚本把原来镜像仓库的镜像同步过去。
2、编写shell脚本通过ansible更新所有要与Registry交互的Docker主机。如果选择Insecure Registry需要更改所有 Docker主机的Docker Daemon。如果选择Secure Registry则是颁发证书。
3、通知新镜像仓库的地址,避免push、pull失败。
sudo docker run -d -p 5000:5000 --restart=always --name registry -v /app_data/registry/:/var/lib/registry registry:2
参考文档:
https://juejin.im/post/5cecd8f3f265da1bae38daa7
https://blog.51cto.com/13972012/2446357
https://monster0303.github.io/posts/3abcceaa/#%E4%BA%8C%E3%80%81-Harbor
支持HTTPS的私有DOCKER Registry :
https://blog.csdn.net/xcjing/article/details/70238273
https://www.cnblogs.com/xcloudbiz/articles/5526262.html
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)