简介


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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐