Docker Registry 分类
Sponsor Registry 第三方的 Registry,提供给客户和 Docker 社区使用
Mirror Registry 第三方的 Registry,只提供给客户使用
Vendor Registry 由发布 Docker 镜像的提供上提供的 Registry
Private Registry 通过设有防火墙和额外的安全层的私有实体提供的 registry
Registry 的应用
如果公司将服务器托管到了阿里云或者其他拥有 docker 仓库的平台,那么直接使用即可。
如果公司将服务器在本地使用,那么就可以在本地建有一个 registry 来提供存储镜像及其他应用。
Registry 的作用
用来存储镜像,使用 registry 时使用存储卷,将存储卷挂载即可。默认为docker 管理的卷,可以使用自定义的绑定卷进行绑定。
搭建 registry
Registry 的安装
centos 自带的版本,使用 info 命令查看出的版本 0.9 版本,安装后版本为 2.6.2 版本。
info 命令查看的是仓库中已有软件包的最低版本。
软件包名为 docker-distribution 但是安装使用 docker-registry 来安装
docker-registry 默认是使用 http 来监听并通信的,但是 docker 客户端默认使用的是 https 协议,所以会出现不兼容。
相关软件包
[root@centos7_10 ~]$ rpm -ql docker-distribution
/etc/docker-distribution/registry/config.yml #主配置文件
/usr/bin/registry #二进制执行文件
/usr/lib/systemd/system/docker-distribution.service #启动服务文件
/usr/share/doc/docker-distribution-2.6.2
/usr/share/doc/docker-distribution-2.6.2/AUTHORS
/usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
/usr/share/doc/docker-distribution-2.6.2/LICENSE
/usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
/usr/share/doc/docker-distribution-2.6.2/README.md
/var/lib/registry #私有仓库中存储的镜像位置
主配置文件详解
/etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry #指定服务名称
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry #指定镜像存储位置
http:
addr: :5000 #指定监听的端口
查看启动服务后监听端口的地址
[root@centos7_10 ~]$ lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
registry 8243 root 3u IPv6 70296 0t0 TCP *:commplex-main (LISTEN)
使用 http 协议推送镜像过程
修改配置文件
"insecure-registries": ["192.168.1.11"] #添加此条选项
也可以在 service 文件中定义
--insecure-registry 192.168.1.11:[PORT] #指定信任的 http 连接
- 为镜像打上标签
[root@centos7_10 ~]$ docker tag httpd:image1 192.168.1.12:5000/web:v0.1
#标签名为 [registry_URL]:[PORT]/[registry]:[version]
- 推送镜像
[root@centos7_10 ~]$ docker push 192.168.1.12:5000/web:v0.1
The push refers to repository [192.168.1.12:5000/web]
Get https://192.168.1.12:5000/v2/: http: server gave HTTP response to HTTPS client
- 推送完成后查看 registroy 仓库
在 registroy 仓库中会进行分层存放
[root@centos7_12 ~]# ls /var/lib/registry/docker/registry/v2/repositories/web/_layers/sha256/
188c0c94c7c576fff0792aca7ec73d67a2f7f4cb3a6e53a84559337260b36964
76f49b64a48abb7750c9c8cc6b7422fab0428299dc7384d05e419d17978c009c
c9a33d7bd85a62296be8a780103b816e0bb5319906592789b87788b802636941
Harbor
图形化的镜像管理平台,并且可以对个别仓库做主从关系。并且原生支持 replication。
功能
- 支持多用户注册
- 支持风险扫描
- 支持日志分析
- 支持访问控制
- 支持扩展 API 并且和图形用户界面
https://goharbor.io/docs/2.1.0/install-config/ harbor 官方文档
harbor.cnf 配置
hostname 配置的主机名最好是网络上可以访问的。
ui_url_protocol 定义使用的协议
max_job_workers 定义并发下载的限制
customize_crt 是否要使用自定义证书
ssl_cert ssl_cert_key 定义 key 和 crt 位置
secretkey_path 私钥存放位置
admiral_url admin 的URL 地址,NA 表示不定义
harbor_admin_password 指定 harbor 的密码
dh_host 定义 db 主机
db_password 指定 db 密码
db_port db 的监听端口
docker-compose.yml
此文件中定义了 docker-compose 是如何启动并将各个容器联合起来的,所以里面存储着定义的 volume 挂载位置。
Docker compose 命令
stop 启动
start 启动
pause 暂停
unpause 开启
scale 扩展
logs 查看日志
build 制作镜像
可以使用 -f 进行指定 docker-compose 的文件名启动
docker-compose -f /apps/harbor/docker-compose up
安装 harbor
- 下载 harbor 包
https://goharbor.io/ #官方网站
- 解压 harbor 包
[root@centos7 harbor]# tar xf harbor-offline-installer-v2.1.1.tgz -C /usr/local/
- 进入 /usr/local 目录,修改配置文件
1. 修改 harbor 文件名为 harbor.yml
2. 注释 https 的方式
3. 更改密码一项
- 安装 harbor
[root@centos7 harbor]# ./install.sh
- 访问测试
用户为 admin 密码为设置的密码

Docker harbor 使用
- 创建用户

定义用户名密码

登录新用户并创建项目

推送镜像流程
- 使用 docker login 进行登录验
[root@centos7_10 ~]$ docker login http://100.0.0.10
Username: dingchen
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@centos7_10 ~]$ docker tag php:latest 100.0.0.10/web/php:latest
- 推送镜像
[root@centos7_10 ~]$ docker push 100.0.0.10/web/php:latest
The push refers to repository [100.0.0.10/web/php]
79fe7d329e98: Pushed
5d0eba46a22a: Pushed
111f8d94fb63: Pushed
a1cf235e8b21: Pushed
2c0f80c72317: Pushed
8888f89886ba: Pushed
f182865e86e9: Pushed
b2bb5e569df9: Pushed
d0fe97fa8b8c: Pushed
latest: digest: sha256:770921846342e89a3ab5fec5305878710ee7dbb5d24b7c7b879d516611cc916e size: 2201
- 查看仓库中的镜像文件

复制方法
同步镜像时仓库不需要创建同步时也可以自动创建
- 通过存储服务器进行同步
通过后端文件共享的方式容易造成复制带宽的浪费
- 通过镜像同步进行服务器同步
所以一般会推荐使用数据同步
推或拉

在设置复制规则时,可以选择是 push-based 或 pull=based,使用这两种方式。
push-based 是将本地 harbor 的镜像推送到远端的 barbor 中。
pull-based 是将远端服务器的 harbor 拉取到本地。
根据实际要求来完成定义。
单向复制实现
- 创建 harbor 仓库并创建同步项目

创建复制的仓库目标


创建复制规则
触发模式
- 手动
- 通过手动的方式同步镜像资源
- 自动
- 通过 crontd 的定时任务的方式设置同步
- 事件驱动
- 当仓库发生变更时会同步当前的镜像

客户端上传镜像,测试是否同步
用户验证推送身份,验证的身份会保存在 /root/.docker/config.json 中
[root@centos7_13 docker]# docker login 192.168.1.10
Username: dingchen
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
更改 tag 标签
[root@centos7_13 docker]# docker tag mysql 192.168.1.10/web/mysql
推送镜像
[root@centos7_13 docker]# docker push 192.168.1.10/web/mysql:latest
The push refers to repository [192.168.1.10/web/mysql]
fbb074c5f05d: Layer already exists
53027404cf6f: Layer already exists
05065d451ded: Layer already exists
b5c03392f039: Layer already exists
d05cae664157: Layer already exists
ccc9d99589b0: Layer already exists
21855dc9d111: Layer already exists
954ae77d425d: Layer already exists
5a04f2c11114: Layer already exists
0cfb425b2248: Layer already exists
92266a3c960d: Layer already exists
f5600c6330da: Layer already exists
latest: digest: sha256:dc9f92520ae11960f13d858d912d00eaf4dc3a6ddb2f2f0691f6da1eb89e79e6 size: 2828
- 查看是否同步成功
主仓库

副仓库

查看同步的状态列表
通过用户的 push 来变动并同步镜像

双向复制的实现
通过两台 harbor 进行同步复制。
- 设置仓库推送的目标

设置推送规则
同样设置成事件驱动,并且同样是推送。

用户验证并推送镜像
使用 docker login 命令指定的仓库服务器及用户名密码
[root@centos7_13 docker]# cat /root/.docker/config.json
{
"auths": {
"192.168.1.11": {
"auth": "ZGluZ2NoZW46V29haXdvMDAw"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.13 (linux)"
}
}
更改确认 192.168.1.11 为不安全的仓库
[root@centos7_13 docker]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://9ac42ay9.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.1.11"]
}
更改镜像标签名并推送
[root@centos7_13 docker]# docker tag alpine 192.168.1.11/web/alipine:latest
[root@centos7_13 docker]# docker push 192.168.1.11/web/alipine:latest
The push refers to repository [192.168.1.11/web/alipine]
ace0eda3e3be: Pushed
latest: digest: sha256:d7342993700f8cd7aba8496c2d0e57be0666e80b4c441925fc6f9361fa81d10e size: 528
图形化 web 管理工具 Portainer
Portainer 是一个可视化的容器选项的图形化管理工具,官方站点位置 https://www.portainer.io/
启动方式
1. 拉取镜像
[root@centos7_10 harbor]# docker pull portainer/portainer-ce
2. 启动容器,指定端口,如果是 linux 中的docker 必须要指定 -v 参数并且必须要指定 socket 文件存在的位置
[root@centos7_10 harbor]# docker container run -d --name portainer -v /data/portainer/:/data -v /var/run/docker.sock:/var/run/docker.sock -p 9000:9000 portainer/portainer-ce