目录

一、docker仓库

1、什么是仓库

2、Docker Hub

(1)首先在https://hub.docker.com/网站注册一个账号

(2)在docker hub上新建一个公共仓库

(3)接下来要从docker主机上传镜像

(4)修改镜像名并上传镜像:

(5)docker hub帐号的注销:

3、Registry 工作原理 

(1)一次docker pull 或 push背后发生的事情

(2)Docker Registry有三个角色,分别是index、registry和registry client。

(3)情景A:用户要获取并下载镜像。

 (4)情景B:用户要推送(上传)镜像到registry中。

 (5)情景C:用户要从index或registry中删除镜像。

4、配置镜像加速器

 5、搭建私有仓库

(1)下载registry镜像

(2)运行registry容器

(3)上传镜像到本地仓库

(4)为Docker仓库添加证书加密功能

6、企业级私有仓库的搭建——harbor

(1)软件下载:https://github.com/goharbor/harbor/releases

(2)解压并配置

(3)安装harbor

(4)安装完成后测试及使用

(5)实验——搭建基本的分布式仓库/客户端场景

(6)docker-compose的使用

(7)镜像签名的设置——公开仓库

(8)harbor私有仓库的建立及操作

(9)漏洞扫描


一、docker仓库

1、什么是仓库

Docker 仓库是用来存放镜像的,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。

Docker运行中使用的默认仓库Docker Hub 公共仓库。(Docker hub 官方网站如下)

Docker Hubicon-default.png?t=M1H3https://hub.docker.com/

2、Docker Hub

docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。 

(1)首先在https://hub.docker.com/网站注册一个账号

(2)在docker hub上新建一个公共仓库

 

(3)接下来要从docker主机上传镜像

由于docker默认的仓库为docker hub,因此在docker hub上注册完成后可以在终端登录。 

首先需要登录(上一步在docker hub上注册的帐号)

[root@server1 ~]# docker login

Username: zzh981030

Password:Lw******.

 登录的认证信息保存在</root/.docker/config.json>,只要认证信息存在,后边就不用再登录了。

 

先在浏览器创建镜像名

(4)修改镜像名并上传镜像:

docker hub为了区分不同用户的同名镜像,要求镜像的格式是:

docker push zzh981030/base-debian10:tagname

docker tag gcr.io/distroless/base-debian10 zzh981030/base-debian10:latest
                                            #修改镜像名为docker hub要求的格式
docker push zzh981030/base-debian10:latest     #上传镜像

上传完成后,在docker hub网站上可以看到刚刚从终端上传的镜像。(圈住的地方为官方给出的上传镜像的格式)

(5)docker hub帐号的注销:

 上传完成后,终端“search”便可以搜索到刚才上传的镜像。

帐号注销后,查看<.docker/config.json >认证文件,文件内容已经清除。

docker logout             #注销帐号

(6)docker hub镜像的删除

3、Registry 工作原理 

(1)一次docker pull 或 push背后发生的事情

 

 index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。

(2)Docker Registry有三个角色,分别是index、registry和registry client。

index

负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。

Web UI

元数据存储

认证服务

符号化

registry是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
Registry ClientDocker充当registry客户端来维护推送和拉取,以及客户端的授权。

(3)情景A:用户要获取并下载镜像。

 (4)情景B:用户要推送(上传)镜像到registry中。

 (5)情景C:用户要从index或registry中删除镜像。

4、配置镜像加速器

从docker hub上下载镜像的速度太慢,需要配置镜像加速器。

这里以阿里云为例:(需要提前注册阿里云帐号)

(1)获取加速地址

阿里云-上云就上阿里云阿里云——阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务,以及大数据人工智能服务、精准定制基于场景的行业解决方案。免费备案,7x24小时售后支持,助企业无忧上云。https://www.aliyun.com/

 

 

这里获得了阿里云的镜像加速地址<https://mv8n7wnp.mirror.aliyuncs.com>

(2)修改daemon配置文件</etc/docker/daemon.json>来使用加速器

vim /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://mv8n7wnp.mirror.aliyuncs.com"]
    }

(3)导入配置并重启服务

systemctl daemon-reload                 #重新导入daemon配置

systemctl restart docker                #重启docker


[root@server1 ~]# docker info | tail -n 5        #查看docker信息
      127.0.0.0/8
      Registry Mirrors:
      https://mv8n7wnp.mirror.aliyuncs.com/            #镜像下载地址已经切换为阿里云
      Live Restore Enabled: false

(4)测试

以zabbix为例,拉取镜像时速度明显加快

 5、搭建私有仓库

docker hub虽然方便,但是还是有限制 需要internet连接,速度慢 所有人都可以访问 由于安全原因企业不允许将镜像放到外网

docker公司已经将registry开源,我们可以快速构建企业私有仓库(以下为官方文档)

Deploy a registry server | Docker DocumentationExplains how to deploy a registryhttps://docs.docker.com/registry/deploying/

(1)下载registry镜像

docker pull registry            #下载registry镜像

查看镜像信息:

docker history registry:latest            #查看镜像信息

(2)运行registry容器

docker run -d -p 5000:5000 --restart=always --name registry registry:latest 
# -d 后台运行; -p 宿主机端口:容器端口; --restart=always 容器随docker自启动; --name 容器名称

查看端口映射

(3)上传镜像到本地仓库

本地镜像在命名时需要加上仓库的ip和端口

# docker tag nginx:latest localhost:5000/nginx:latest

# docker push localhost:5000/nginx:latest

curl localhost:5000/v2/_catalog            #查看本地仓库内容

 更改为本地私有仓库可识别的标签

docker tag nginx:latest localhost:5000/nginx:latest    #更改标签
#其中localhost:5000表示本机端口

上传镜像到私有仓库

docker push localhost:5000/nginx:latest 

 再次检查,已经上传到私有仓库

(4)为Docker仓库添加证书加密功能

默认情况下私有仓库不需通过认证即可操作,因此很不安全,所以需要对私有仓库进行加密

第一步:生成证书(域名westos.org要求在主机上有解析)

生成密钥时,对openssl的版本有要求,所以需要先升级openssl

yum install -y openssl11-1.1.1k-2.el7.x86_64.rpm  openssl11-libs-1.1.1k-2.el7.x86_64.rpm 

生成证书:

mkdir -p certs                        #创建certs目录用来存放证书

openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt
                                        #生成证书

注意:在填写注册信息时,这两个地方的域名一定要一致,都则将导致域名无法识别。

应用证书功能到仓库:

先删除容器,并且删除容器创建的卷

 重新运行容器:

docker run -d   --restart=always   --name registry   -v /root/certs:/certs  -v /opt/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key   -p 443:443 registry

#具体参数如下
docker run -d   \                                    #后台运行
--restart=always \                                  #跟随docker启动
--name registry   \                                    #容器名称
-v /root/certs:/certs  \                            #目录映射关系——宿主机目录:容器内目录
-v /opt/registry:/var/lib/registry \                #目录映射
-e REGISTRY_HTTP_ADDR=0.0.0.0:443   \                #允许端口
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt   \    #证书名称及域名
-e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key   \             #证书名称及域名
-p 443:443 \                                        #端口映射——宿主机端口:容器端口
registry                                            #镜像名称

先在hosts中添加解析:

docker tag  nginx:latest reg.westos.org/nginx:latest       #更改镜像标签为私人仓库可识别格式
docker push reg.westos.org/nginx:latest                #上传镜像

但是上传镜像时并没有验证证书,这是因为docker检测证书时会从指定路经下读取证书,因此需要将证书放在指定路径下,操作步骤如下:

#创建目录
[root@server1 ~]# mkdir -p /etc/docker/certs.d/reg.westos.org      
[root@server1 ~]# cd certs/
[root@server1 certs]# ls
westos.org.crt  westos.org.key

#复制证书
[root@server1 certs]# cp westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
        #目录的名字“reg.westos.org”一定要和域名保持一致,docker引擎会自动识别


[root@server1 certs]# 
[root@server1 certs]# ll /etc/docker/certs.d/reg.westos.org/ca.crt
-rw-r--r-- 1 root root 2159 Feb 18 13:14 /etc/docker/certs.d/reg.westos.org/ca.crt

证书复制完成后,重新上传镜像。在目录</opt/registry/docker/registry>下可以看到刚才上传的镜像,目录已经不再是空的了。

docker push reg.westos.org/nginx:latest

 应用认证功能到仓库:

[root@server1 ~]# docker rm -f registry                #删除registry容器
[root@server1 ~]# mkdir auth                        #创建目录,用于存储认证信息
[root@server1 ~]# yum install -y httpd-tools            #安装工具,用于生成密钥

创建用户并生成密钥/文件: 

htpasswd -cB auth/htpasswd admin            #创建用户admin
htpasswd -B auth/htpasswd zzh                #创建用户zzh
          (再次创建用户时不要添加参数-c,否则会覆盖之前的文件,只有第一次创建用户时需要添加参数c)

docker run -d   --restart=always   --name registry   -v /root/certs:/certs  -v /opt/registry:/var/lib/registry -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key   -p 443:443 registry

#具体参数如下
docker run -d   \                                    #后台运行
--restart=always \                                  #跟随docker启动
--name registry   \                                    #容器名称
-v /root/certs:/certs  \                            #目录映射关系——宿主机目录:容器内目录
-v /opt/registry:/var/lib/registry   \              #目录映射
-v /root/auth:/auth    \                             #用户认证功能的目录映射
-e "REGISTRY_AUTH=htpasswd"    \                    #指定用户密码
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd         #指定用户密钥路径
-v /opt/registry:/var/lib/registry \                #目录映射
-e REGISTRY_HTTP_ADDR=0.0.0.0:443   \                #允许端口
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt   \    #证书名称及域名
-e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key   \             #证书名称及域名
-p 443:443 \                                        #端口映射——宿主机端口:容器端口
registry                                            #镜像名称

 

curl -k https://reg.westos.org/v2/_catalog -u admin:westos    #查看私有仓库的镜像

由于再次运行容器时,目录映射关系和上一次实验的一样,所以之前上传的镜像这次也可以直接访问到。

 

docker tag yakexi007/game2048:latest reg.westos.org/game2048:latest    #修改镜像标签
docker push reg.westos.org/game2048:latest             #上传镜像
    88fca8ae768a: Preparing 
    6d7504772167: Preparing 
    192e9fad2abc: Preparing 
    36e9226e74f8: Preparing 
    011b303988d2: Preparing 
    no basic auth credentials

 直接上传镜像会显示用户认证失败。因为本次启动容器时开启了用户认证功能,所以需要先登录后才能上传镜像。

 

[root@server1 ~]# docker login reg.westos.org        #登录reg.westos.org
Username: admin
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@server1 ~]# docker push reg.westos.org/game2048:latest         

#查看镜像
[root@server1 ~]# curl -k https://reg.westos.org/v2/_catalog -u admin:westos
{"repositories":["game2048","nginx"]}

私有仓库的搭建已完成,但是对于企业来说,涉及到的镜像很多,如果手动一个一个上传很不现实,因此引入企业级私有仓库的搭建——harbor

6、企业级私有仓库的搭建——harbor

首先清除上一实验中的容器(必须删除,否则会因为端口冲突导致安装失败)

(1)软件下载:https://github.com/goharbor/harbor/releases

(2)解压并配置

tar zxf harbor-offline-installer-v2.3.4.tgz         #解压


[root@server1 ~]# cd harbor/
[root@server1 harbor]# ls
common.sh  harbor.v2.3.4.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@server1 harbor]# cp harbor.yml.tmpl harbor.yml        #从模板生成配置文件

#编辑配置文件
[root@server1 harbor]# vim harbor.yml
  5 hostname: reg.westos.org                        #仓库的域名
 17   certificate: /data/certs/westos.org.crt        #仓库的证书
 18   private_key: /data/certs/westos.org.key
 34 harbor_admin_password: westos                    #登录web的密码

mkdir /data                           #创建目录,用来存放harbor数据(和配置文件中一致)
cp -r certs /data/                    #向目录中复制证书

由于配置文件中证书的位置并不存在,因此需要在指定路径下(配置文件中的第17、18行)生成证书。直接将上一步的证书复制到指定路径下。

同理,harbor的所有数据都存储在</data>目录下,只要目录不删除,harbor删除与否都不影响数据。

注意:hatbor使用时需要安装依赖性<docker-compose-linux-x86_64-v2.2.3>,这是一个二进制文件,按以下步骤操作,令其具有可执行权限即可

(3)安装harbor

[root@server1 ~]# cd  harbor/
[root@server1 harbor]# ls
common.sh  harbor.v2.3.4.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@server1 harbor]# pwd
/root/harbor

[root@server1 harbor]# ./install.sh             #进入harbor目录执行安装脚本

(4)安装完成后测试及使用

在浏览器中访问宿主机IP,可以看到harbor界面

向harbor中上传镜像:

docker tag busybox:latest reg.westos.org/library/busybox:latest
                                #更改镜像标签
docker push  reg.westos.org/library/busybox:latest        #上传镜像

 

(5)实验——搭建基本的分布式仓库/客户端场景

实验需求:server1是一个docker私有仓库,server2是一个客户端。server2要从私有仓库server1中下载镜像。

实验环境:新配置一台虚拟机server2,并配置好软件源。

#server1中
scp /etc/yum.repos.d/* root@172.25.254.2:/etc/yum.repos.d/    #复制软件源到server2中

server2中
yum repolist                                    #刷新软件源
yum install -y docker-ce                        #安装docker

systemctl enable --now docker                    #启动docker

vim /etc/hosts                                    #添加reg.westos.org解析
    172.25.254.1	server1 reg.westos.org

在server2拉取镜像:

这是因为没有用户认证。可通过以下方法解决。

#在server1中
scp -r certs.d/ 172.25.254.2:/etc/docker/        #向server2中复制认证的证书

再次拉取,镜像很快便传输完成,这要比从外网拉取快得多。

一点改进:

从私人仓库拉取镜像时,必须指明拉取的位置<reg.westos.org/library/nginx:latest>,实际操作中是否可以直接<docker pull nginx>从私人仓库里拉取。由于不添加镜像来源的话,默认是从外网拉取,因此需要更改docker的默认配置文件,令其默认先从私人仓库里拉取镜像。

一种可行的方法是将加速器地址设置为私人仓库的IP,就类似于server1中阿里云的加速器,在server2中变成了私人仓库server1。

#在server1中
scp /etc/docker/daemon.json root@172.25.254.2:/etc/docker/        #复制加速器模板到server2中


#在server2中    
vim /etc/docker/daemon.json                                 #编辑加速器地址
    {
      "registry-mirrors": ["https://reg.westos.org"]
    }
systemctl daemon-reload                                 #重新导入daemon配置
systemctl restart docker                                #重启docker

 

清除server2中的镜像后重新测试:直接拉取镜像名便可以从私人仓库上获取到镜像

[root@server2 docker]# docker pull nginx                #直接拉取镜像名
    latest: Pulling from library/nginx
    091c283c6a66: Pull complete 
    55de5851019b: Pull complete 
    b559bad762be: Pull complete 
    Digest: sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee
    Status: Downloaded newer image for nginx:latest

 查看harbor日志,显示匿名用户下载镜像的详细信息。 

(6)docker-compose的使用

注意:docker-compose工具只能在<docker-compose.yml>同一目录下使用!!!

具体参数及用法:

docker-compose ps查看正在运行的容器
docker-compose stop停止所有容器
docker-compose down停止并删除所有容器

重新安装harbor:

./install.sh --with-notary --with-trivy --with-chartmuseum
                #镜像签名;     镜像扫描;     harbor_chart功能

安装harbor时新增的这些选项会安装更多的容器。

(7)镜像签名的设置——公开仓库

启用Harbor的“内容信任”,那么没有签名认证的镜像将无法通过审查。

从客户端拉取server1中的镜像,可以看到镜像因为没有签名被拒绝拉取。

这时因为这个镜像没有签名认证,所以不能使用。

镜像签名的部署(在私人仓库服务器server1中)

第一步:部署根证书

在以下两个位置都部署上证书,证书是一样的

#证书所在位置
位置一:
/etc/docker/certs.d/reg.westos.org/ca.crt

位置二:
~/.docker/tls/reg.westos.org:4443/ca.crt

mkdir -p ~/.docker/tls/reg.westos.org:4443/        #创建目录

cp /etc/docker/certs.d/reg.westos.org/ca.crt ~/.docker/tls/reg.westos.org\:4443/
                                                    #复制证书

 

第二步:启用docker内容信任

[root@server1 ~]# export DOCKER_CONTENT_TRUST=1
                                    #激活docker的内容信任
[root@server1 ~]# export DOCKER_CONTENT_TRUST_SERVER=https://reg.westos.org:4443
                                    #告诉docker的内容信任服务器及端口

第三步:上传镜像

docker tag yakexi007/mario:latest reg.westos.org/library/mario:latest
                                                #更改镜像标签
docker push reg.westos.org/library/mario:latest 
                                                #上传镜像

 注意:带有签名的镜像在上传时,必须加上版本,否则将导致签名无法识别或者上传失败。

上传镜像时,会要求设置两个密码。第一个“root key”表示上传根镜像时用到的密码;第二个"repository key"表示仓库的密码,上传镜像版本改变时需要输入。(密码要求字母+数字,且不小于8位,这里设置为westos007)

完成后这个镜像的签名就解决了。在web界面中查看镜像信息,显示签名以完成。

在server2客户端中拉取镜像,有签名的镜像可以被正常下载。 

第四步:删除签名

[root@server1 ~]# export 
declare -x DOCKER_CONTENT_TRUST="1"
declare -x DOCKER_CONTENT_TRUST_SERVER="https://reg.westos.org:4443"
...


[root@server1 ~]# export DOCKER_CONTENT_TRUST=0        #取消签名认证
[root@server1 ~]# export 
declare -x DOCKER_CONTENT_TRUST="0"                    #再次查看时签名认证已取消
declare -x DOCKER_CONTENT_TRUST_SERVER="https://reg.westos.org:4443"

也可以直接删除这个选项
[root@server1 ~]# unset DOCKER_CONTENT_TRUST            #删除签名认证选项
[root@server1 ~]# export                                 #再次查看时已经没有这个选项了
declare -x DOCKER_CONTENT_TRUST_SERVER="https://reg.westos.org:4443"
declare -x HISTCONTROL="ignoredups"

(8)harbor私有仓库的建立及操作

新建私有仓库

[root@server1 ~]# docker tag yakexi007/game2048:latest reg.westos.org/westos/game2048:latest                    #更改镜像标签
[root@server1 ~]# docker push reg.westos.org/westos/game2048        #上传镜像到私有仓库

向私有仓库上传镜像:

匿名用户拉取私有仓库时会报错,因为没有权限。

因此需要在harbor中创建一个用户,可以使用该用户访问镜像。创建用户方法如下:

添加该用户对私有仓库“westos”的操作权限:

 

使用新创建的用户登录harbor,可以看到该用户很多权限受限,仅仅可以操作私有仓库“westos”

 

再次在客户端拉取私有仓库的镜像,需要先用该用户登录,就可以访问该用户被授权的私有仓库了。

#登录harbor仓库
[root@server2 ~]# docker login reg.westos.org
Username: zzh
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@server2 ~]# docker pull reg.westos.org/westos/game2048
Using default tag: latest
latest: Pulling from westos/game2048
534e72e7cedc: Pull complete 
f62e2f6dfeef: Pull complete 
fe7db6293242: Pull complete 
3f120f6a2bf8: Pull complete 
4ba4e6930ea5: Pull complete 
Digest: sha256:8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
Status: Downloaded newer image for reg.westos.org/westos/game2048:latest
reg.westos.org/westos/game2048:latest

(9)漏洞扫描

 

 在点击扫描时因为是从外网更新漏洞库,所以会一直卡在这。可以手动下载漏洞库,链接如下:https://github.com/aquasecurity/trivy-db/releasesicon-default.png?t=M1H3https://github.com/aquasecurity/trivy-db/releases

 下载完成后,将漏洞库放在</data/trivy-adapter/trivy/db>目录上并解压。(注意所有人所有组均为10000.10000)

然后点击web管理页面的扫描,就会调取本地的漏洞库进行扫描了。

扫描完成后可以查看镜像的漏洞信息,以便后期的修复。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐