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 连接
  1. 为镜像打上标签
[root@centos7_10 ~]$ docker tag httpd:image1 192.168.1.12:5000/web:v0.1 
#标签名为 [registry_URL]:[PORT]/[registry]:[version]
  1. 推送镜像
[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
  1. 推送完成后查看 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

  1. 下载 harbor 包
https://goharbor.io/        #官方网站
  1. 解压 harbor 包
[root@centos7 harbor]# tar xf harbor-offline-installer-v2.1.1.tgz -C /usr/local/
  1. 进入 /usr/local 目录,修改配置文件
1. 修改 harbor 文件名为 harbor.yml
2. 注释 https 的方式
3. 更改密码一项
  1. 安装 harbor
[root@centos7 harbor]# ./install.sh
  1. 访问测试

用户为 admin 密码为设置的密码

测试

Docker harbor 使用

  1. 创建用户

image-20201115122148823

定义用户名密码

image-20201115122318758

登录新用户并创建项目

image-20201115125738180

推送镜像流程

  1. 使用 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
  1. 为镜像打标签
[root@centos7_10 ~]$ docker tag php:latest 100.0.0.10/web/php:latest 
  1. 推送镜像
[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
  1. 查看仓库中的镜像文件

image-20201115125753620

复制方法

同步镜像时仓库不需要创建同步时也可以自动创建

  1. 通过存储服务器进行同步

通过后端文件共享的方式容易造成复制带宽的浪费

  1. 通过镜像同步进行服务器同步

所以一般会推荐使用数据同步

推或拉

image-20201120124647004

在设置复制规则时,可以选择是 push-basedpull=based,使用这两种方式。

push-based 是将本地 harbor 的镜像推送到远端的 barbor 中。

pull-based 是将远端服务器的 harbor 拉取到本地。

根据实际要求来完成定义。

单向复制实现

  1. 创建 harbor 仓库并创建同步项目

image-20201120121437090

创建复制的仓库目标

image-20201120121856964

image-20201120121841116

创建复制规则

触发模式

  • 手动
    • 通过手动的方式同步镜像资源
  • 自动
    • 通过 crontd 的定时任务的方式设置同步
  • 事件驱动
    • 当仓库发生变更时会同步当前的镜像

image-20201120122033745

客户端上传镜像,测试是否同步

用户验证推送身份,验证的身份会保存在 /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
  1. 查看是否同步成功

主仓库

image-20201120122926291

副仓库

image-20201120122956435

查看同步的状态列表

通过用户的 push 来变动并同步镜像

image-20201120123035571

双向复制的实现

通过两台 harbor 进行同步复制。

  1. 设置仓库推送的目标

image-20201120123644967

设置推送规则

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

image-20201120123731922

用户验证并推送镜像

使用 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