docker仓库管理
docker 仓库分为公有云仓库 和 私有云仓库
公有云仓库:
- 官方
- 阿里云等第三方仓库,推荐
私有云仓库:
- docker registory
- docker harbor,推荐
阿里云 docker 仓库
- 访问凭证
- 命名空间
- 镜像仓库
范例:
1 | # 1. 浏览器的登录阿里云,创建命名空间107,镜像仓库可以创建也可以不创建,如果不创建,push的时候会自动创建 |
私有云单机仓库 Docker Registry
官方文档:https://docs.docker.com/registry/
部署文档:https://github.com/docker/docs/blob/main/registry/deploying.md
https://blog.csdn.net/weixin_41605937/article/details/122367707
服务端
1. 生成证书
一路回车就可以
1 | $ openssl req -new -x509 -days 3650 -nodes -out ./ssl/certs/reg.cntv.local.crt -keyout ./ssl/private/reg.cntv.local.key |
2.创建授权的 registry 用户和密码
1 | # 1. 创建授权用户密码使用目录 |
创建用户还可以使用如下命令:
1 | $ docker run \ |
3. 启动容器
1 | # 指定443端口 |
api:
1 | Path: "/v2/", |
查询、删除镜像:
1 | #查询镜像 |
客户端
1. 添加 hosts
1 | $ cat /etc/hosts |
2. 修改 daemon.json 并重启 docker
1 | # 将https://reg.cntv.local添加到insecure-registries |
注意:修改 daemon.json 后需要重启 docker.service
3. 登陆
1 | docker login -u ops -p 123456. reg.cntv.local:5000 |
4. 上传&下载
1 | # 上传 |
Docker 之分布式仓库 Harbor
harbor 功能介绍:
- 基于角色的访问控制
- 镜像复制
- 图形化用户界面
- 审计管理
- 国际化
- resful api
- 部署简单
harbor 组成:
harbor 是由很多容器组成实现完整功能
- proxy:对应启动组件 nginx。它是一个 nginx 反向代理,代理 notary client(镜像认证)、docker client(镜像上传下载等)和浏览器的访问请求(core service)给后端的各服务
- UI(Core Service):对应启动组件 harbor-ui。底层数据存储使用 mysql 数据库,主要提供了四个子功能:
- UI:一个 web 管理页面 ui
- API:Harbor 暴露的 API 服务
- Auth:用户认证服务,decode 后的 token 中的用户信息在这里进行认证;auth 后端可以接 db、ldap、uaa 三种认证实现
- Token 服务(上图中未体现):负责根据用户在每个 project 中的 role 来为每一个 docker push/pull 命令发布一个 token,如果从 docker client 发送给 registry 的请求没有带 token,registry 会重定向请求到 token 服务创建 token
- registry:对应启动组件 registry。负责存储镜像文件,和处理镜像的 pull/push 命令。Harbor 对镜像进行强制的访问控制,Registry 会将客户端的每个 pull、push 请求转发到 token 服务来获取有效的 token
- admin service:对应启动组件 harbor-adminserver。是系统的配置管理中心附带检查存储用量,ui 和 jobserver 启动时候需要加载 adminserver 的配置
- job service:对应启动组件 harbor-jobservice。负责镜像复制工作的,他和 registry 通信,从一个 registry pull 镜像然后 push 到另一个 registry,并记录 job_log
- log collector:对应启动组件 harbor-log。日志汇总组件,通过 docker 的 log-driver 把日志汇总到一起
- db:对应启动组件 harbor-db,负责存储 project、 user、 role、replication、image_scan、access 等的 metadata 数据
配置 harbor 仓库
两台 harbor 服务器 10.0.0.118 和 10.0.0.119 均按照以下步骤配置:
- 安装 docker
- 安装 docker compose,docker compose 必须先于 harbor 安装,否则会报错
- 下载 Harbor 安装包并解压缩
- 编辑配置文件 harbor.yml,旧版本是 harbor.cfg
- 运行 harbor 安装脚本
- 实现开机自动启动 harbor
- 登录 harbor 主机网站
- 建立项目
- 修改 harbor 配置
1 | # 1. 安装docker |
1 | # 2. 安装docker compose |
1 | # 3. 下载Harbor安装包并解压缩 |
1 | # 4. 编辑配置文件 harbor.yml |
1 | # 5. 运行 harbor 安装脚本 |
1 | # 6. 实现开机自动启动 harbor |
- 登录 harbor 主机网站
http://10.0.0.118
1 | # 9. 修改harbor配置 |
配置 docker 客户端
客户端 10.0.0.117
- 安装 docker
- 登录 harbor
- 给本地镜像大标签并上传到 harbor
- 下载 harbor 的镜像
1 | # 1. 安装docker |
- 建立项目
项目可以设置为“公开”,这样不用登陆就可以 pull,但是要想 push 还是得登陆
1 | # 3. 登录harbor.两种方法,命令行或者配置文件 |
1 | # 3. 给本地镜像大标签并上传到harbor |
1 | # 4. 下载harbor的镜像 |
harbor 高可用
实现 harbor 有两种方式:共享存储 和 镜像复制,这里只学习后者,可以通过 web 界面直接配置镜像复制
前面配置了两台 harbor 仓库,10.0.0.118 和 10.0.0.119,但是只使用了一台,这里使用另一台组成双向复制
注意:不是主从,而是双向复制,通过负载均衡器将请求分流
h1:10.0.0.118
h2:10.0.0.119
确保 h1 和 h2 中有相同的项目
h1 和 h2 均新建仓库,目标分别为对方
复制模式选择 push-based
h1 和 h2 均新建复制,目标分别为对方
测试,分别在 h1 和 h2 上传(注意上传前先登录 harbor)然后删除,都能同步成功
harbor 配置 https
harbor 默认使用 http,可以配置 https,不过我认为没有这个必要
在前面配置好 harbor 仓库的基础上,执行以下操作:
配置服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51root@u1:~# mkdir -p /root/.rnd
root@u1:~# mkdir -p /usr/local/harbor/certs
root@u1:~# cd /usr/local/harbor/certs
root@u1:/usr/local/harbor/certs# ls
# 创建私有CA
root@u1:/usr/local/harbor/certs# openssl req -newkey rsa:1024 -nodes -sha256 -keyout ca.key -x509 -subj "/CN=ca.ljk.org" -days 3650 -out ca.crt
Generating a RSA private key
..............+++++
...................................+++++
writing new private key to 'ca.key'
-----
root@u1:/usr/local/harbor/certs# ls
ca.crt ca.key
# 生成harbor主机的证书申请
root@u1:/usr/local/harbor/certs# openssl req -newkey rsa:1024 -nodes -sha256 -subj "/CN=harbor.ljk.org" -keyout harbor.ljk.org.key -out harbor.ljk.org.csr
Generating a RSA private key
.....................................................................+++++
..........+++++
writing new private key to 'harbor.ljk.org.key'
-----
root@u1:/usr/local/harbor/certs# ls
ca.crt ca.key harbor.ljk.org.csr harbor.ljk.org.key
# 给harbor主机颁发证书
root@u1:/usr/local/harbor/certs# openssl x509 -req -in harbor.ljk.org.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.ljk.org.crt
Signature ok
subject=CN = harbor.ljk.org
Getting CA Private Key
root@u1:/usr/local/harbor/certs# tree
.
├── ca.crt
├── ca.key
├── ca.srl
├── harbor.ljk.org.crt
├── harbor.ljk.org.csr
└── harbor.ljk.org.key
0 directories, 6 files
root@u1:/usr/local/harbor/certs# vim ../harbor.yml
hostname: harbor.ljk.org # 此行需改为域名
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /usr/local/harbor/certs/harbor.ljk.org.crt
private_key: /usr/local/harbor/certs/harbor.ljk.org.key
...
root@u1:/usr/local/harbor/certs# cd ..
root@u1:/usr/local/harbor# systemctl stop harbor.service # 这一步要等挺久
root@u1:/usr/local/harbor# ./prepare
root@u1:/usr/local/harbor# ./install.sh
root@u1:/usr/local/harbor# systemctl start harbor.service配置客户端
1
2
3
4
5
6
7
8
9
10
11root@u3:~# echo '10.0.0.118 harbor.ljk.org' >> /etc/hosts
# 因为是自建证书,所以harbor规定,客户端也下载一份,位于/etc/docker/certs.d/harbor.ljk.org
# 其实,只需要harbor.ljk.org.crt即可,这里为了方便,全部拷贝过来
root@u3:~# scp lujinkai@harbor.ljk.org:/usr/local/harbor/certs/* /etc/docker/certs.d/harbor.ljk.org/
# 登录成功
root@u3:~# docker login harbor.ljk.org
# 上传镜像
root@u3:~# docker image push harbor.ljk.org/library/alpine:v1