简介
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。
点击推送镜像,可以看到推送到此仓库的格式。