11.Docker镜像中心
通过网盘分享的文件:MD文档笔记
链接: https://pan.baidu.com/s/1ao2wfyLEdN50YmIqdzfGYQ?pwd=5w5z 提取码: 5w5z
–来自百度网盘超级会员v6的分享
Docker Hub 与阿里云都是 Docker 的公网镜像中心,用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库,并可将仓库设置为私有库,使他人无法看到,更无法 pull,以保证镜像的安全性
不过在实际生产中为了保障镜像的安全性,为了避免由于网络带宽或网速等问题而影响到镜像的拉取或推送,公司一般不会使用公网镜像中心,而是在公司内部搭建一个私有镜像中心
一.发布镜像到阿里云公网
下面详细介绍如何将前面已经构建好的 hello-my-world 镜像发布到阿里云
1.镜像中心结构对比
(1).DockerHub镜像中心结构

(2).阿里云镜像中心结构

2.镜像仓库的创建
(1).注册账号
首先要注册拥有一个阿里云的账号并且该账号需要完成实名认证
可以使用账号、手机号、支付宝账号等
(2).创建镜像中心实例
阿里云地址: https://www.aliyun.com/
登录阿里云

输入手机号、验证码登录

在搜索框输入"容器镜像服务"后点击后面的搜索按钮

点击"个人实例"后打开"提示"窗口
注意个人版是免费使用的,但功能有限

点击"创建个人版"

选择"地域"后勾选"用户协议",然后点击"立即创建"

点击"设置Registry登录密码"
对于初次开通镜像中心,需要设置登录镜像中心的密码

输入密码

初始化成功
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(3).设置访问凭证
如果不是第一次创建镜像中心"实例"或之前创建的"实例"的登录密码忘记了,可再次设置
进入"容器镜像服务"

选择"个人实例"

选择"设置固定密码"

设置新密码

(4).创建命名空间
阿里云在镜像中心与镜像仓库中间又增加了一层"命名空间",可以将镜像仓库分类到不同的命名空间中
所以对于镜像中心需要先创建"命名空间"

设置命名空间名字

命名空间创建完毕后可看到命名空间列表

(5).创建镜像仓库
命名空间创建完毕后就需要创建镜像仓库了
在创建镜像仓库之前需要先选择该镜像仓库要创建在哪个命名空间中

设置仓库信息

这里需要指定该镜像仓库的代码源,即镜像来自于哪里
由于我们需要将镜像 push 到该镜像仓库,所以选择"本地仓库"

然后就会跳转到下面页面,阿里云自动生成的对该仓库的各种操作命令,用户只需要复制该命令即可完成相应操作

该页面在再次登录后,也可通过"镜像仓库"列表中该仓库的"名称"链接跳转到

3.Docker客户端操作
(1).登录阿里云镜像中心
语法
docker login --username=zhl890112 仓库地址
【示例】
docker login --username=zhl890112 registry.cn-hangzhou.aliyuncs.com

(2).复制并重命名镜像
语法规则
docker tag [镜像ID] registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:[镜像版本号]
【示例】
docker tag 74cc54e27dc4 registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:1.0
docker tag 74cc54e27dc4 registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:2.0
docker tag 74cc54e27dc4 registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:3.0
docker images

(3).推送镜像
语法规则
docker push 仓库地址/longdidi/hello-world:[镜像版本号]
【示例】
docker push registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:1.0

(4).拉取镜像
语法
docker pull registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:[镜像版本号]
【示例】
docker pull registry.cn-hangzhou.aliyuncs.com/longdidi/hello-world:1.0

(5).删除镜像
打开"镜像仓库"列表,点击该仓库的"名称"跳转到该仓库信息页面

点击"镜像版本",可查看到该仓库中包含的镜像信息

选中某些镜像后,点击相应"删除"按钮或"批量删除"按钮即可删除相应镜像

(6).删除仓库
打开"镜像仓库"列表,直接点击该仓库对应的"删除"按钮即可删除该仓库

(7).登出阿里云仓库
docker logout registry.cn-hangzhou.aliyuncs.com

二.私有镜像中心
1.私有镜像中心简介
对于后面要学习的私有镜像中心搭建内容,需要提前掌握一些基础知识
这里先学习这些知识
1.1.HTTP/HTTPS 协议
(1).协议
HTTP 与 HTTPS 协议都是客户端浏览器和服务器间的一种约定,约定如何将服务器中的信息下载到本地,并通过浏览器显示出来
- HTTP 协议是一种明文传输协议,其对传输的数据不提供任何加密措施
- HTTPS 协议则是通过SSL/TLS 为数据加密,以保障数据的安全性

通常情况下HTTP 会直接与运输层的 TCP 进行通信,默认使用 80 端口号
但在使用 SSL/TLS 协议的 HTTPS 后,就演变成了直接与运输层的 SSL/TLS 进行通信,再由 SSL/TLS 与 TCP进行通信
即 HTTPS 是间接与 TCP 进行通信的,HTTPS 默认使用 443 端口号
(2).SSL/TLS
-
SSL(Secure Sockets Layer)
安全套接字协议
旧版安全协议
-
TLS(Transport Layer Security)
传输层安全协议
新版安全协议
它们主要用于保障在 Internet 上数据传输的安全性与完整性
(3).加密验证方式
HTTP 协议通过明文传输存在三大风险
-
被窃听的风险
-
被篡改的风险
-
被冒充的风险
HTTPS 协议通过用户身份验证与传输加密大大降低了 HTTP 中的这些风险
HTTPS 协议中的身份验证采用的是非对称加密验证方式,而传输加密采用的则是对称加密验证方式
-
对称加密验证
加密与解密使用的密钥相同
例如登录使用的账号/密码就属于对称加密验证(用户提交的账号/密码与保存在服务器中的账号/密码必须相同验证才能成功)
-
非对称加密验证
加密与解密使用的密钥不同
其本质上就是数据算法
主要有三类算法
-
因子分解算法
-
离散对数算法
-
椭圆曲线算法
其中因了分解算法使用最为广泛
-
(4).公钥与私钥
非对称加密验证中需要一对密钥(一个用于加密、一个用于解密,即所谓的公钥与私钥)
-
公钥
可以公开的密钥
是发放给其他人的密钥
-
私钥
非公开的密钥
是只有加密者自己保存的密钥
公钥与私钥都可用于加密/解密
-
数字签名(签名认证)
公钥加密、私钥解密称为信息加密与信息解密
-
信息加密(信息解密)
私钥加密、公钥解密称为数字签名与签名验证
1.2.HTTPS 工作原理
以"特工张三与总部李四的通信故事"来说明 HTTPS 的工作原理
(1).明文通信过程
存在的问题是信息可能被劫持(数据被窃取、被篡改),数据非常不安全

(2).使用数字签名加密
整个通信过程包含两个阶段
-
通信关系建立阶段

-
通信阶段

(3).钓鱼问题
使用数字签名可能出现钓鱼问题,就是在张三与总部通信时,有个特工王五冒充张三的身份,生成了王五的公钥矛私钥,并且生成了一个与张三很相似的链接地址并且偷偷将李四手中张三的地址替换为王五的地址,将李四手中保存的张三的公钥替换为王五的公钥,这样就造成了李四认为一直在和张三通信,其实是和王五在通信

(4).使用数字证书
整个通信过程包含三个阶段
-
通信基础构建阶段

-
通信关系建立阶段

-
通信阶段

(5).对称加密通信
整个通信过程包含三个阶段
通信阶段中的身份验证采用非对称加密验证方式,通信过程采用对称加密验证方式
-
通信基础构建阶段

-
通信关系建立阶段

-
通信阶段

(6).HTTPS 通信原理
- 通信基础构建过程

- 通信关系建立过程

- 通信过程

1.3.HTTPS 重要概念
(1).数字证书
数字证书(也称为 SSL/TLS 证书)是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式
它是由 CA(Certificate Authority,证书权威认证机构,证书中心)颁发的一种身份证明,里面包含了该通讯方的公钥、证书有效时间、域名及 CA 的数字签名等
数字证书的一个非常重要的作用就是"防钓鱼"
全球的 CA(权威证书中心)一共也没有几个,即全球可以颁发数字证书的机构并不多(而像我国阿里、腾讯等也都属于这些大的权威证书中心的代理机构)
我们可以通过他们来申办证书,而他们本身并不具有生成证书的权限
(2).根证书
数字证书是由 CA颁发的一种身份证明,是用CA 私钥加密过的,所以客户端必须具有 CA 公钥才能解密服务器的数字证书,这个CA 公钥就被称为 CA 根证书(也称为根证书)
数字证书除了权威证书中心可申请到外,也可自己生成,但自己生成的证书并没有在客户端系统中,这时就需要用户在客户端先安装数字证书,并将其添加到相应的"信任"状态才可
这就是我们平时如果要在本地电脑中打开网银平台对自己的电子银行进行操作之前,会先提示安装根证书的原因,这个安装根证书的提示,就包含网银的数字证书与 CA 根证书
(3).数字摘要
数字摘要是将任意长度的消息变成固定长度的短消息
数字摘要就是利用了 Hash 函数的单向性,将需要加密的明文"摘要"成一串 128 位长度数字串
这个数字串又称为数字指纹
其单向性体现在不同明文"摘要的结果"一定是不同的,相同明文"摘要的结果"必定是一致,但摘要结果无法计算出其原始明文
(4).数字签名
数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,它是一种类似写在纸上的手写物理签名,用于鉴别数字信息是否被篡改的方法
数字签名是非对称密钥技术与数字摘要技术的应用
使用私钥对明文的数字摘要加密,形成数字签名
使用公钥对数字签名解密称为签名验证
1.4.htpasswd 命令
registry 私有镜像中心中默认是没有用户认证功能的,可通过 htpasswd 来实现用户认证
(1).简介
htpasswd 是开源 Web 服务器 Apache HTTP Server 的内置工具,用于创建、更新 HTTP基本认证的密码文件
(2).安装 httpd-tools
htpasswd 命令在 Linux 中默认是没有的,需要先行安装
而该工具在 httpd-tools 工具包中,所以需要先安装该工具包
yum install -y httpd-tools

(3).创建文件并添加用户
为方便演示在/root目录下 创建一个目录 auth,在其中存放生成的认证文件
将字符串 zhangsan 与 123 分别指定为用户名与密码,并写入到"/root/auth/"目录中的文"htpasswd.user"文件中
# 创建目录
mkdir -p /root/auth
# 进入该目录
cd /root/auth
# 将用户名、密码写入到htpasswd.user文件中
htpasswd -Bbc htpasswd.user zhangsan 123

查看 htpasswd.user 文件内容,可以看到该用户名与密码,只不过密码是加密过的
cat htpasswd.user

(4).再添加两用户
再写入两对用户名与密码,此时无需再写-c 选项了
htpasswd -Bb htpasswd.user lisi 123
htpasswd -Bb htpasswd.user wangwu 123
cat htpasswd.user

(5).修改密码
修改密码与添加密码使用方式相同
-
若指定的用户名不存在则为添加该用户与密码
-
若指定的用户名存在则为该用户修改密码
【示例】
htpasswd -Bb htpasswd.user wangwu 456

(6).删除用户名与密码
删除用户名与密码使用选项-D
htpasswd -D htpasswd.user lisi

用户名 lisi 消失了
cat htpasswd.user

(7).使用-n 选项创建文件
使用-n 选项,再配合重定向符也可将用户密码写入到文件
【示例】下面的命令将用户名与密码写入到了当前目录的 authfile 中了
htpasswd -Bbn tom 123 > authfile

这种情况下若要添加和修改密码,则可通过追加重定向符来完成
htpasswd -Bbn jerry 123 > authfile

查看
cat authfile

1.5.容器的退出状态码
Docker Daemon 通过退出状态码向用户反馈容器中应用的退出方式
(1).状态码分类
容器退出状态码是[0, 255]范围内的整数
分为三类
-
状态码0
表示容器中应用是正常退出
例如通过docker stop命令退出/bin/bash,或docker引擎关闭后引发的容器退出/bin/bash 等
-
[1,128]范围内的状态码
非正常退出状态
表示容器内部运行错误引发的容器无法启动,或应用运行出错
-
[129,255]范围内的状态码
非正常退出状态
表示容器接收到终止信号而退出
(2).状态码 1
常见有两种情况可能会引发容器的退出状态码为 1
-
应用程序内部错误
例如分母为 0、内存溢出、数组下标越界等
-
Dockerfile 中的无效引用
即 Dockerfile 中引用了不存在的文件,导致容器无法启动
(3).状态码 125
容器启动后要执行指定的[command],但[command]没有运行成功
没有成功的原因通常是[command] 引用了未定义的变量,或执行了没有权限的命令等
(4).状态码 126
容器启动后要执行指定的[command],但[command]没有运行成功
没有成功的原因通常是该[command]的执行缺少依赖
例如Dockerfile 中要运行 CMD 为[“java”,“-jar”,“demo.jar”],而该容器中没有 JDK
(5).状态码 127
容器启动后要执行指定的[command],但[command]没有运行成功
没有成功的原因通常是该[command]中引用了不存在的文件或目录
例如Dockerfile 中要运行 CMD 为[“java”,“-jar”,“demo.jar”],而该容器中没有 demo.jar
(6).状态码 128
由自己开发的容器内的代码触发了退出命令并给出了退出状态码,但状态码不在 0-255范围内,此时返回给用户的退出状态码为 128
(7).状态码 130
当容器中的应用接收到来自操作系统的终止信号时,应用会立即退出,并返回给用户130 状态码
(8).状态码 137
当容器中的应用接收到来自 dockerd 的强制终止信号时会立即退出,并返回给用户 137状态码
(9).状态码 143
当容器接收到来自 dockerd 的优雅终止信号时,如果当前容器并没有用户访问,那么容器会立即退出,并返回给用户 143 状态码
如果容器正好有用户访问,那么 dockerd 会等待 10s,10s 后会向容器发送kill 信号,此时返回给用户 137 状态码
(10).退出状态码查看方式
查看退出状态码的方式有两种
-
docker ps –a
docker ps -a
-
docker inspect
docker inspect 容器ID或容器名
1.6.容器的重启策略
docker 容器启动后并不会永远处于运行状态,各种意外都可能会导致容器退出
在生产环境下容器退出后采用手动重启方式肯定是非常低效或不可行的
而 Docker 引擎提供了容器的重启策略,通过在容器创建时指定–restart 选项不同的值,来达到不同的重启效果
其取值有以下几种
(1).no
默认策略,在容器退出时不重启容器
(2).on-failure[:n]
在容器非正常退出时,即退出状态码非 0 的情况下才会重启容器
其后还可以跟一个整型数,表示重启的次数
(3).always
只要容器退出就会重启容器
(4).unless-stopped
只要容器退出就会重启容器,除非通过 docker stop 或 docker kill 命令停止容器
2.Distribution私有镜像中心
一般私有镜像中心是专门的一台服务器,不用作平时的 Docker 容器的运行管理
相对于该镜像中心,其它要对其进行 push 与 pull 操作的 Docker 主机,就称为Docker 客户端
2.1.镜像中心搭建
(1).安装 docker-distribution
docker-distribution 是通过yum 安装的
yum install -y docker-distribution

(2).查看安装的文件
通过rpm 命令可查看到该安装包安装的内容
rpm -ql docker-distribution

-
/etc/docker-distribution/registry/config.yml
是镜像中心的核心配置文件
-
/usr/bin/registry
是安装到/usr/bin 目录中的一个 registry 命令
-
/usr/lib/systemd/system/docker-distribution.service
表示 docker-distribution 是个服务
-
/usr/share/doc/*
是所有文档
-
/var/lib/registry
是镜像的保存目录
(3).启动镜像中心
docker-distribution 是作为服务出现的,所以使用服务启动方式来启动它
systemctl start docker-distribution

2.2.Docker 客户端操作
私有镜像中心搭建成功了,Docker 客户端就可以向其中 push 或 pull 镜像了
(1).修改 daemon.json 文件
默认情况下为了保证安全,Docker 客户端都采用的是 https 提交各种请求
例如:登录请求、pull 请求、push 请求等
但私有镜像中心默认不支持 https 协议
所以需要修改 Docker客户端使其提交http 请求
修改方式是在 Docker 客户端的/etc/docker/daemon.json 文件中添加如下内容,指定镜像中心的地址是安全的
[root@docker ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.11:5000"],
"registry-mirrors": [
"https://yx4bftgd.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
],
"data-root": "/root/images/"
}

(2).重启 docker 引擎
配置文件修改了需要重启 docker 引擎以加载新的配置
systemctl restart docker

(3).登录私有镜像中心
docker login 192.168.1.11:5000

(4).复制并重命名镜像
通过 docker tag 命令可以对原有镜像进行复制并重命名
这个重命名的镜像的<repository>中需要采用<domain-name>/<software-name>格式
docker tag hello-world 192.168.1.11:5000/hmyw:1.0

再复制两个镜像
docker tag hello-world 192.168.1.11:5000/hmyw:2.0
docker tag hello-world 192.168.1.11:5000/hmyw:3.0

共计复制三个镜像
docker images

(5).推送镜像
docker push 192.168.1.11:5000/hmyw:1.0
docker push 192.168.1.11:5000/hmyw:2.0
docker push 192.168.1.11:5000/hmyw:3.0

(6).查看镜像中心
通过http://<私有镜像中心 IP>:5000/v2/_catalog 可查看到私有镜像中心中包含的所有仓库列表
curl -XGET http://192.168.1.11:5000/v2/_catalog

通过http://<私有镜像中心 IP>:5000/v2/<repository>/tags/list 可查看指定仓库的tag 列表
curl -XGET http://192.168.1.11:5000/v2/hmyw/tags/list

(7).登出私有镜像中心
docker logout 192.168.1.11:5000
2.3.删除镜像
(1).修改容器配置
docker-distribution 私有库默认是不支持镜像删除的,需要修改镜像中心的配置文件"/etc/docker-distribution/registry/config.yml"
在 storage 节点下加入如下配置
[root@docker ~]# vim /etc/docker-distribution/registry/config.yml

修改过文件后重启 docker-distribution 服务
systemctl restart docker-distribution

(2).获取镜像 digest
该删除操作仅支持根据镜像的 Digest 删除,所以首先要获取到该镜像的 digest
当然获取镜像 digest 的方式有两种
-
一种是先将镜像下载到本地在本地通过命令查看
下载到本地再通过 docker images --digests 命令查看
docker images --digests
-
一种是直接通过Http 请求获取
通过 http://<私有镜像中心 IP>:5000/v2/<repository>/manifests/<tag>可查看
但该请求在提交时需要携带–header "Accept:application/vnd.docker.distribution.manifest.v2+json"请求头信息
在响应头的 Docker-Content-Digest 属性中携带着有镜像的 Digest
curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET http://192.168.1.11:5000/v2/hmyw/manifests/1.0
(3).删除镜像
通过提交 Delete 请求 http://<私有镜像中心 IP>:5000/v2/<repository>/manifests/<digest>删除指定的镜像
不过需要注意的是该<digest>镜像可能有多个<tag>,其会删除所有该<digest>的镜像
curl -I -XDELETE http://192.168.1.11:5000/v2/hmyw/manifests/sha256:7565f2c7034d87673c5ddc3b1b8e97f8da794c31d9aa73ed26afffa1c8194889

此时再查看该仓库中的 tags发现已经被删除了
curl -XGET http://192.168.1.11:5000/v2/hmyw/tags/list

(4).垃圾清理
在删除过镜像后在镜像存放目录下的 docker/registry/v2/blobs 目录下仍保留了大量删除镜像相关的数据形成了垃圾数据,这些数据最好清理掉
清理这些数据需要使用 docker-distribution 内部提供的registry garbage-collect 命令,且该命令需要提供镜像中心的配置文config.yml 作为参数
registry garbage-collect /etc/docker-distribution/registry/config.yml hmyw

3.Registry私有镜像中心
3.1.HTTP方式搭建
3.1.1.镜像中心搭建
(1).拉取镜像
Registry 私有镜像中心的本质其实就是一个运行中的容器,该容器的镜像为 registry
截止目前该registry 镜像共有两个大的版本
- 1.0
- 2.0
latest 版本为 2.0 版本
所以首先要拉取 registry 镜像到本地
docker pull registry

(2).创建用户密码文件
默认情况下创建好的私有镜像中心对于任何用户都是可以 push 的,这肯定是不安全的,所以在启动镜像中心之前,先创建一个用于保存用户名与密码的文件
这里要使用 Apache 的 htpasswd 命令创建用户名与密码
在任何目录中 mkdir 一个目录 auth,专门用于存放用户信息
本例选择在/usr/local目录下创建 auth目录,然后将字符串 zhangsan 与 111 分别指定为用户名与密码并写入到 auth 目录中的htpasswd.user 文件中
# 创建目录
mkdir -p /usr/local/auth
# 进入目录
cd /usr/local/auth
# 创建密码文件
htpasswd -Bbc htpasswd.user zhangsan 123

查看 htpasswd.user 文件内容可以看到该用户名与密码,只不过密码是加密过的
[root@docker auth]# cat htpasswd.user

(3).启动镜像中心容器
创建并启动 registry 镜像的容器
默认情况下被客户端 push 来的镜像会被保存在/var/lib/registry 中
docker run --name myregistry01 \
--restart always \
-v /var/lib/registry:/var/lib/registry \
-v /usr/local/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd.user" \
-dp 5000:5000 \
registry

3.1.2.windows 浏览器访问
在浏览器中通过"http://192.168.1.11:5000/v2/_catalog"地址访问查询镜像中心中的仓库
如果可以登录进去则说明私有镜像中心搭建成功
注意是 http 请求
登录页面

登录成功页面

3.1.3.Docker 客户端操作
registry 私有镜像中心搭建成功了,Docker 客户端就可以对其进行操作了
(1).修改 daemon.json 文件
默认情况下为了保证安全,Docker 客户端都采用的是 https 提交各种请求
例如登录请求、pull 请求、push 请求等
但私有镜像中心不接受 https 请求,所以需要告诉 Docker客户端该镜像中心地址是安全的,这样 Docker 客户端将会自动采用 http 请求方式
而对 Docker 客户端的告知方式是手工修改 Docker 客户端的/etc/docker/daemon.json 文件
在文件中添加如下内容
[root@docker auth]# vi /etc/docker/daemon.json
"insecure-registries":["192.168.1.11:5000"],

完整内容如下
{
"insecure-registries":["192.168.1.11:5000"],
"registry-mirrors": [
"https://kfp63jaj.mirror.aliyuncs.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://yx4bftgd.mirror.aliyuncs.com",
"https://docker.1panel.live/",
"https://registry.dockermirror.com/",
"https://ccr.ccs.tencentyun.com/",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
],
"data-root": "/root/images/"
}
(2).重启 docker 引擎
配置文件修改了需要重启 docker 引擎以加载新的配置
systemctl restart docker

最好重启虚拟机,有时候刷新不起作用
(3).登录私有镜像中心
docker login -u zhangsan 192.168.1.11:5000

(4).复制并重命名镜像
通过 docker tag 命令可以对原有镜像进行复制并重命名
这个重命名的镜像的<repository>中需要采用<domain-name>/<username>/<software-name>格式,且<username>是登录镜像中心的用户名
docker tag hello-world 192.168.1.11:5000/zhangsan/hw:1.0

(5).推送镜像
docker push 192.168.1.11:5000/zhangsan/hw:1.0

(6).查看镜像中心
通过"http://<私有镜像中心IP>:5000/v2/_catalog"可查看到私有镜像中心中包含的所有仓库列表
curl -u zhangsan:123 -XGET http://192.168.1.11:5000/v2/_catalog

通过http://<私有镜像中心IP>:5000/v2/<repository>/tags/list 可查看指定仓库的tag 列表
curl -u zhangsan:123 -XGET http://192.168.1.11:5000/v2/zhangsan/hw/tags/list

(7).登出私有镜像中心
docker logout 192.168.1.11:5000
3.2.HTTPS方式搭建
3.2.1.OpenSSL 生成 SSL 证书
在阿里云申请 SSL 证书需要申请者具有自己的域名,对于初学习者来说可能不是所有人都具备的
在学习阶段使用 OpenSSL 也可以自己生成 SSL 证书
(1).安装 OpenSSL
OpenSSL 是一个开源的软件库,SSL 标准的工业化实现
可通过 yum 命令进行安装
yum install -y openssl-devel

安装完毕后可通过 openssl version 命令来查看
openssl version

(2).创建证书目录
在任意目录下创建一个 cert 目录,用于存放 SSL 证书
这里创建"/root/ssl/cert"目录
[root@docker ~]# mkdir -p /root/ssl/cert
[root@docker ~]# cd /root/ssl/cert/

(3).创建证书中心 CA
若要让证书中心CA 为我们生成证书必须要先有CA
证书中心 CA 主要就是创建CA 的私钥与证书
-
创建 CA 的私钥
首先要创建证书中心的私钥
openssl genrsa -out ca.key 4096
此时在当前目录下就生成了 ca.key 文件
可以查看生成私钥的具体内容
cat ca.key
-
创建 CA 的证书
openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=CA/OU=CAUnit/CN=cacn.com" \ -key ca.key \ -out ca.crt
此时在当前目录下就生成了 ca.crt 文件
可以查看生成证书的具体内容
cat ca.crt
(4).创建申请者证书
-
生成私钥
进入到 cert 目录
openssl genrsa -out xxx.com.key 4096
此时在当前目录下就生成了 xxx.com.key 文件
可查看该文件内容
cat xxx.com.key
-
生成请求文件
要生成正式的数字证书文件之前,需要先生成一个包含申请者自身个人信息的请求文件csr,将来的证书文件中的申请者信息就来自于该文件
openssl req -sha512 -new -key xxx.com.key -out xxx.com.csr
此时在当前目录下就生成了 server.csr 文件
可以查看 server.csr 文件内容
cat xxx.com.csr
-
生成 v3.ext 文件
在 v3.ext 文件中最重要的修改是 subjectAltName,要指定为当前的主机 IP
[root@docker cert]# vi v3.ext authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation,keyEncipherment,dataEncipherment extendedKeyUsage=serverAuth subjectAltName=IP:192.168.1.11 [alt_name] DNS.1=xxx.com DNS.2=xxx.cn此时在当前目录下就生成了 v3.ext 文件
(5).生成申请者证书
-
生成申请者证书
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in xxx.com.csr \ -out xxx.com.crt
可以查看生成的证书文件 xxx.com.crt,只不过是加过密的
cat xxx.com.crt
-
重命名证书名
将 crt 文件重命名为 cert
因为默认情况下docker 将.crt 文件识别为CA 证书,将.cert识别为用户生成的证书
当然这个重命名也是通过 openssl 命令完成的
openssl x509 -inform PEM -in xxx.com.crt -out xxx.com.cert
至此在当前目录下共生成了 8 个文件

-
复制 Server 证书
在/etc/docker 目录下创建certs.d/<域名>目录
docker 默认会到该目录中查看证书文件
mkdir -p /etc/docker/certs.d/xxx.com
将服务器的证书及私钥复制到该目录
cp xxx.com.cert /etc/docker/certs.d/xxx.com/ cp xxx.com.key /etc/docker/certs.d/xxx.com/
-
复制 CA 证书
docker 默认会查看/etc/pki/tls/certs/ca-bundle.crt 证书中心的证书
所以需要将 CA 证书复制到该目录下并重命名为 ca-bundle.crt
mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.back cp ca.crt /etc/pki/tls/certs/ca-bundle.crt
(6).重启 docker
systemctl restart docker

3.2.2.启动镜像中心容器
在 docker run 命令中除了要指定生成的证书与私钥外,还需要将存放证书与私钥的目录设置为数据卷,以方便容器启动时读取
docker run --name myregistry02 \
--restart always \
-v /etc/docker/certs.d/xxx.com:/cert \
-v /var/lib/registry:/var/lib/registry \
-v /root/auth:/auth \
-e "REGISTRY_HTTP_TLS_CERTIFICATE=/cert/xxx.com.cert" \
-e "REGISTRY_HTTP_TLS_KEY=/cert/xxx.com.key" \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd.user" \
-dp 5000:5000 \
registry

查看容器状态是 UP 状态
docker ps

3.2.3.windows 浏览器访问
提交 https 请求
https://192.168.1.11:5000/v2/_catalog

点击继续前往

输入 用户名密码

登录成功

3.2.4.Docker 客户端操作
使用 Docker 客户端访问遵循 HTTPS 协议的registry 私有镜像中心,与访问遵循 HTTP 协议的没有区别,对于用户来说是没有感知的
发出 HTTPS 访问请求
curl -v https://192.168.1.11:5000

当然为了证明与 Docker 客户端设置/etc/docker/daemon.json 文件无关,可以将该文件中原来加入的内容删除,重启 Docker 后再测试
docker login -u zhangsan 192.168.1.11:5000

可以看到 docker login 提交的是 https 请求,并且登录成功
4.Harbor私有镜像中心
无论是使用 docker-distribution 还是 registry 容器,它们搭建的镜像中心都非常的简陋,没有可视化 Web 界面来管理镜像
而 Harbor 镜像中心解决了这个问题
Harbor 是由 VMware 公司中国团队使用Go 语言开发的一款 Registry server 开源项目,其是在 Docker Registry 的基础之上进行了二次封装
作为一个企业级私有 Registry 服务器, Harbor 提供了更好的性能与安全,同时也提供了一个非常方便、漂亮的 Web 管理界面
-
Harbor官网
-
Harbor 的官网为https://goharbor.io/

-
Harbor 在 github 上的官网https://github.com/goharbor/harbor
-
-
Harbor 安装要求
-
硬件要求

-
软件要求
下载安装包
-
wget下载
在官网复制 Latest 最新版的离线安装包的下载链接地址
访问https://goharbor.io/

复制链接地址

在 Linux 系统中通过wget 命令将其下载到某目录中
https://github.com/goharbor/harbor/releases/download/v2.13.1/harbor-offline-installer-v2.13.1.tgz
-
Windows下载
访问https://goharbor.io/

点击安装包直接下载

-
-
4.1.HTTP方式搭建
4.1.1.安装Harbor
(1).上传Harbor
创建工作目录
mkdir -p /root/harbor
cd /root/harbor

上传安装包到安装目录

(2).解压安装包
将下载好的包解压到某目录中
解压后其就是一个独立的目录 harbor
[root@docker harbor]# tar -zxvf harbor-offline-installer-v2.13.1.tgz

(3).修改 harbor.yml
复制一份 harbor 解压包中的 harbor.yml.tmpl,并重命名为 harbor.yml
[root@docker harbor]# cd harbor/
[root@docker harbor]# cp harbor.yml.tmpl harbor.yml

修改 harbor.yml 配置文件
共修改三处
- 将 hostname 指定为当前主机的 IP
- 注释掉所有 https 相关配置
- 记住(或修改)admin 用户的登录密码
另外需要注意一点harbor 默认的端口号为 80
[root@docker harbor]# vi harbor.yml

(4).运行 prepare
运行 harbor 解压目录中的prepare 命令
该命令会先拉取 prepare 镜像,然后再生成很多的其后期要用到的配置文件
[root@docker harbor]# ./prepare

(5).运行install.sh
运行 harbor 解压目录中的 install.sh 命令,其会自动完成五步的安装过程,并在最终启动很多的容器
这些容器本质上就是通过 docker-compose 进行编排管理的
[root@docker harbor]# ./install.sh

(6).查看运行的容器
[root@docker harbor]# docker ps

4.1.2.windows 浏览器访问
在浏览器地址栏中输入"http://192.168.1.11"即可看到如下页面

在其中输入用户名 admin,密码为 harbor.yml 中设置的密码即可登录
登录成功页面

4.1.3.Harbor 的启停
由于Harbor 是由 10 个容器同时运行完成的,且是通过 docker-compose 完成的容器编排
Harbor 安装完成后会在 harbor 解压目录中生成 docker-compose.yml 文件,所以Harbor的启停命令,都是由 docker-compose 完成的,且需要在 harbor 的解压目录中完成
-
Harbor 停止
docker-compose stop
-
Harbor 启动
docker-compose up -d
4.1.4.Docker 客户端操作
Registry 私有镜像中心搭建成功了,Docker 客户端就可以对其进行操作了
(1).修改 daemon.json 文件
默认情况下,为了保证安全,Docker 客户端都采用的是 https 提交各种请求
例如登录请求、pull 请求、push 请求等
但私有镜像中心不接受 https 请求,所以需要告诉 Docker客户端该镜像中心地址是安全的,这样 Docker 客户端将会自动采用 http 请求方式
而对 Docker 客户端的告知方式是,手工修改 Docker 客户端的/etc/docker/daemon.json 文件
在文件中添加如下内容
[root@docker harbor]# vi /etc/docker/daemon.json

(2).重启 docker 引擎
配置文件修改了,需要重启 docker 引擎,以加载新的配置
systemctl restart docker
(3).登录私有镜像中心
docker login 192.168.1.11
(4).复制并重命名镜像
通过 docker tag 命令可以对原有镜像进行复制并重命名
这个重命名的镜像的<repository>中需要采用<domain-name>/<project-name>/<software-name>格式
当然,如果需要区分用户的话,也可以采用<domain-name>/<project-name>/<username>/<software-name>格式
docker tag hello-world 192.168.1.11/test/admin/hmyw:1.0
(5).推送镜像
docker push 192.168.1.11/test/admin/hmyw:1.0
(6).登出私有镜像中心
docker logout 192.168.1.11
4.2.HTTPS搭建方式
4.2.1.阿里云申请SSL证书
阿里云的 SSL 证书服务是由阿里云联合中国及中国以外地域多家数字证书颁发机构(CA),在阿里云平台上直接提供的数字证书申请和部署服务,帮助用户以较低的成本将服务从 HTTP 转换成 HTTPS,实现网站或移动应用的身份验证和数据加密传输
若要在阿里云申请 SSL 证书需要具备两个条件
-
具有阿里云账户
当然淘宝账户、支付宝账户也可以
-
具有一个自己申请到的域名
不一定非要是阿里云申请的
4.2.1.1.购买域名
(1).填写信息模版
申请证书得先有域名才可以,因此需要先购买一个域名
在搜索框中输入"域名与网站"后点击搜索按钮,在查询结果中点击"控制台"按钮

点击"去创建"按钮

填写个人信息后点击提交按钮

申请完成

一段时间后查看是否审核成功

(2).注册域名
在"域名管理"的"域名列表"下面点击"注册域名"

输入域名后点击查询

选择合适的域名注册

开始购买

点击"支付"

支付成功

查看审核信息

4.2.1.2.购买个人证书
首先登录阿里云官网 https://aliyun.com,然后搜索"ssl 证书"关键字,在搜索结果中点击"控制台"

在左侧导航栏中选择"证书管理 > SSL证书管理"

转至"个人测试证书(原免费证书)“页签,并点击"购买证书”

根据需要选择合适的证书类型(免费版或pro),阅读并同意服务协议后完成购买流程

点击"支付"

支付完成

4.2.1.3.提交证书申请
再次登录数字证书管理服务控制台

通过同样的路径进入"个人测试证书(原免费证书)“页面,点击"申请证书”

(1).自动验证方式
自动DNS验证需要系统在您在DNS服务内自动添加DNS解析记录后达到自动验证的效果,为保障自动DNS验证顺利进行,添加DNS解析记录时,会删除在DNS服务内重复/冲突的DNS解析记录
填写证书信息

申请成功,点击"验证信息"按钮

验证成功

查看自动验证添加的DNS解析记录
搜索框输入"云解析DNS"后点击"搜索",在搜索结果中点击"控制台"按钮

在"公网云解析"标签页面中点击我们的域名,进入域名详情

查看详情

添加DNS解析设置
回到列表,点击"添加记录"按钮

设置解析信息

解析变更确认

(2).手动验证方式
填写信息

申请成功,点击验证信息

点击"登录DNS控制台"

点击我们的域名,进入域名设置页面

点击"添加记录"按钮

设置解析信息

确认解析变更

查看添加记录

回到证书申请页面,点击验证按钮

验证通过后即可进入下面的步骤
4.2.1.4.DNS解析验证
进入页面
https://boce.aliyun.com/detect/dns/ab0c4a8b99dd4007a6ffdd0e59521d1f
输入我们的域名,进行DNS解析验证

4.2.1.5.下载证书
回到SSL证书管理页面,证书申请通过之后就可以下载了

在下载页面进行下载

4.2.2.安装Harbor
(1).上传并解压
创建工作目录
mkdir -p /root/harbor
cd /root/harbor

上传安装包到安装目录

(2).解压安装包
将下载好的包解压到某目录中
解压后其就是一个独立的目录 harbor
tar -zxvf harbor-offline-installer-v2.13.1.tgz

(3).复制证书文件
将从阿里云下载的 pem 证书文件与 key 私钥文件存放到 harbor 主机的任意目录中
这里在 harbor 解压目录中新建一个 cert 目录,专门用于存放这两个文件
mkdir -p /root/harbor/harbor/cert

上传证书到这个目录下

为了方便将两个文件分别重命名为了server.pem 与 private.key
cd /root/harbor/harbor/cert/
mv jnawww.foreverlove.icu.pem server.pem
mv jnawww.foreverlove.icu.key peivate.key

(4).授权
chmod 644 /root/harbor/harbor/cert/server.pem
chmod 600 /root/harbor/harbor/cert/peivate.key
chown -R root:root /root/harbor/harbor/cert/

(5).修改 harbor.yml
复制一份 harbor 解压包中的 harbor.yml.tmpl,并重命名为 harbor.yml
cd /root/harbor/harbor
cp harbor.yml.tmpl harbor.yml

修改 harbor.yml 配置文件,共修改三处
- 将 hostname 指定为当前主机的域名
- 在 https 相关配置指定 pem 与 key 文件
- 记住(或修改)admin 用户的登录密码
/root/harbor/harbor/cert/server.pem
/root/harbor/harbor/cert/private.key

(6).运行 prepare
本次再执行 prepare 命令,就不会再看到那个有关 HTTPS 的 warning 了
./prepare

(7).运行install.sh
./install.sh

4.2.3.windows 客户端设置
(1).修改 hosts 文件
由于当前 harbor 部署的主机并没有外网 IP,即申请的域名并没有真正分配给该主机,所以只有临时修改一下 windows 系统中的 DNS 文件C:\Windows\System32\drivers\etc\hosts,以形成一种"假的"IP 与域名间的映射
在 hosts 文件中增加一行如下内容

(2).浏览器访问
在浏览器地址栏中输入"www.foreverlove.com"即可完成对 harbor 的访问

4.2.4.Docker 客户端设置
(1).修改 daemon.json
修改 Docker 客户端的/etc/docker/daemon.json文件,在文件中指定www.foreverlove.com为安全镜像中心域名
[root@docker ~]# vi /etc/docker/daemon.json
# 增加如下内容
"insecure-registries": ["www.foreverlove.com"],

(2).重启 docker 引擎
配置文件修改了需要重启 docker 引擎以加载新的配置
systemctl restart docker

(3).修改 hosts 文件
修改/etc/hosts 文件
在其中增加如下一行内容
无需重启主机
[root@docker ~]# vi /etc/hosts
# 增加如下内容
192.168.217.137 www.foreverlove.com

(4).重启Harbor
cd /root/harbor/harbor
docker-compose up -d

(5).docker 客户端访问
使用 docker login 命令直接即可完成登录
docker login www.foreverlove.com

5.Harbor 架构与工作原理
5.1.Harbor 架构模块
Harbor 整体架构中的组件非常多,下面简单介绍几个非常重要的模块
-
Proxy
反向代理服务器,由 Nginx 充当
负责接收并转发来自客户端的请求,无论请求是直接来自于浏览器的HTTP 请求,还是来自于 Docker 客户端的命令
根据不同的请求Proxy 会将其转发至 Core 或 Registry 模块
-
Core
Harbor 的核心模块
有两个非常重要的子服务模块
-
Notification Manager
通过 webhook 实现的消息管理模块
当 registry 中镜像发生改变时会立即通知到 web 页面,即会在 web 页面中显示更新
-
API Server
Proxy 根据不同的路由规则将请求首先转发到API Server 的不同接口
但无论哪个处理接口,都强制要求对请求进行权限控制,即都需要请求先根据不同身份从 API Server 中的 AUTH 模块中获取到一个有效的 token
AUTH 模块是通过 token service实现的用户认证
-
-
GC Collector
负责整个系统中的GC 管理
-
Chart Museum
Helm 的仓库
-
Notary
数据权限控制器
-
Log Collector
负责Harbor 中其他模块的日志汇总
-
Job Service
负责镜像复制
在高可用 Harbor 集群中,通过 Job Service 可以将本地镜像同步到远程Harbor 实例上
-
Distribution
镜像中心
由 registry 镜像充当,负责存储 Docker 镜像及处理 docker push/pull 请求
-
k-v storage
主要是为 Job Service 提供缓存服务的,将 Job 元数据临时性存放在其中
默认由 Redis充当
所以Redis 在高可用 Harbor 集群中的作用很大
-
Local/Remote Storage
可以将工程元数据、用户数据、角色数据、同步策略以及镜像元数据等存放在本地或远程服务器中的内存块、文件或持久化对象中
不过一般会使用 SQL Database
-
SQL Database
用于存放工程元数据、用户数据、角色数据、同步策略以及镜像元数据等
默认采用PostgreSQL 数据库
5.2.Harbor 架构图及工作原理
有关Harbor 的系统架构描述,Harbor 在GitHub 的官网中如下地址有直接的描述及架构图 https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor
架构图分解的非常细致

5.3.Docker 命令执行流程
(1).关于公钥与私钥
Harbor 搭建完毕后,token service 中就会保存该 harbor 的私钥,registry 中保存该 harbor的公钥
-
数字签名与签名认证
- 数字签名:使用私钥加密称为数字签名
- 使签名验证:用公钥解密称为签名验证
-
加密解密
- 加密:使用公钥加密称为加密
- 解密:使用私钥解密称之为解密
(2).docker login 命令

(3).docker push 命令

更多推荐

所有评论(0)