一.什么是仓库

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

        Docker运行中使用的默认仓库是 Docker Hub 公共仓库。

二、Docker Hub

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

https://hub.docker.com 可以去注册一个!再看它的官方文档去了解了解。

三、本地仓库搭建及其Registry 工作原理

1.先清理之前的实验

[root@server1 ~]# docker images | grep webserver | awk '{system("docker rmi "$1":"$2"")}'
[root@server1 ~]# docker ps -a

[root@server1 ~]# docker images

 2.搭建本地仓库

(1)下载registry镜像

 (2)运行registry容器并开放5000端口

 docker run -d --name registry -p 5000:5000 registry    ##启动本地仓库,端口映射为5000

(3)仓库作用:先上传镜像到本地仓库(本地镜像在命名时需要加上仓库的ip和端口)

[root@server1 ~]# docker tag busybox:latest localhost:5000/busybox:latest

[root@server1 ~]# docker push localhost:5000/busybox:latest  上传

上传成功后本地路径中也产生了文件,
删除之后,重新加载,之前的内容依然存在

3.Registry 工作原理

一次docker pull 或 push 背后发生的事情:

 

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

Docker Registry有三个角色,分别是index、registry和registryclient.

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

 Web UI、元数据存储、认证服务、符号化。

  • registry      是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过index Auth service的Token的方式进行认证。

  • Registry Client       Docker充当registry客户端来维护推送和拉取,以及客户端的授权。

 用户要获取并下载镜像:

 

  用户要上传镜像到registry中:

 用户要从index或registry中删除镜像

在这里插入图片描述

 4. 配置docker镜像加速器

注册阿里云帐号。
登陆之后,   产品与服务—>容器镜像服务—>镜像加速器

使用阿里云的加速器:

[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json  编辑镜像加速器配置
[root@server1 docker]# cat daemon.json 
{
  "registry-mirrors": ["https://qjjesv8p.mirror.aliyuncs.com"]
}
[root@server1 docker]# 
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker
[root@server1 docker]# docker info

[root@server1 docker]# docker ps
[root@server1 docker]# docker ps -a
[root@server1 docker]# cd
[root@server1 ~]# docker pull mysql

[root@server1 ~]# docker images

 

 将mysql镜像删除,然后使用docker官方的加速器:

[root@server1 ~]# cd -
/etc/docker
[root@server1 docker]# ls
daemon.json  key.json
[root@server1 docker]# cat daemon.json 
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker
[root@server1 docker]# docker info
[root@server1 docker]# cd
[root@server1 ~]# docker pull mysql

5.搭建私有仓库

[root@server1 ~]# ls
anaconda-screenshots  docker                             openssl11-libs-1.1.1g-3.el7.x86_64.rpm
base-debian10.tar     openssl11-1.1.1g-3.el7.x86_64.rpm
[root@server1 ~]# yum install openssl11-1.1.1g-3.el7.x86_64.rpm openssl11-libs-1.1.1g-3.el7.x86_64.rpm
[root@server1 ~]# mkdir certs
[root@server1 ~]# ls
anaconda-screenshots  certs   openssl11-1.1.1g-3.el7.x86_64.rpm
base-debian10.tar     docker  openssl11-libs-1.1.1g-3.el7.x86_64.rpm
[root@server1 ~]# 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

[root@server1 ~]# docker run -d --restart=always --name registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGIDTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -p 443:443 registry   
283a5253fbd5e92bf99953630e763c50ce80b7d4a95efb50e9e4f6b61c894c9b
[root@server1 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                             NAMES
283a5253fbd5   registry   "/entrypoint.sh /etc…"   8 seconds ago   Up 7 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp, 5000/tcp   registry
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED        SIZE
localhost:5000/busybox            latest    beae173ccac6   5 days ago     1.24MB
mysql                             latest    3218b38490ce   2 weeks ago    516MB
registry                          latest    b8604a3fe854   7 weeks ago    26.2MB
centos                            latest    5d0da3dc9764   3 months ago   231MB
nginx                             1.18      c2c45d506085   8 months ago   133MB
yakexi007/game2048                latest    19299002fdbe   5 years ago    55.5MB
yakexi007/mario                   latest    9a35a9e43e8c   6 years ago    198MB
gcr.io/distroless/base-debian10   latest    d48fcdd54946   52 years ago   19.2MB
[root@server1 ~]# docker tag localhost:5000/busybox:latest reg.westos.org/busybox:latest
[root@server1 ~]# docker push reg.westos.org/busybox:latest ##上传失败
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
daemon.json  key.json
[root@server1 docker]# mkdir certs.d
[root@server1 docker]# ls
certs.d  daemon.json  key.json
[root@server1 docker]# cd certs.d/
[root@server1 certs.d]# mkdir reg.westos.org
[root@server1 certs.d]# cd reg.westos.org/
[root@server1 reg.westos.org]# cp /root/certs/westos.org.crt ca.crt
[root@server1 reg.westos.org]# ls
ca.crt
[root@server1 reg.westos.org]# pwd
/etc/docker/certs.d/reg.westos.org
[root@server1 reg.westos.org]# cd
[root@server1 ~]# docker push reg.westos.org/busybox:latest 

[root@server1 ~]# mkdir auth 
[root@server1 ~]# yum install -y httpd-tools
[root@server1 ~]# htpasswd -cB auth/htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin
[root@server1 ~]# cat auth/htpasswd 
admin:$2y$05$DOHbuVGTTS/iMhRq9xBT9uNQd.0m6HqoOwr82qwGvIiPEyAVivx9S
[root@server1 ~]# htpasswd -B auth/htpasswd gyy
New password: 
Re-type new password: 
Adding password for user gyy
[root@server1 ~]# cat auth/htpasswd 
admin:$2y$05$DOHbuVGTTS/iMhRq9xBT9uNQd.0m6HqoOwr82qwGvIiPEyAVivx9S
gyy:$2y$05$PI.LrvlfgP4laHopOlJLoe6XsBPdht6/v5Xmax4AIwTVkT5MI0Wom
[root@server1 ~]# docker rm -f registry 
registry
[root@server1 ~]# 

 [root@server1 ~]# docker run -d --restart=always --name registry -v /root/certs:/certs -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 -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  registry
[root@server1 ~]# docker ps
[root@server1 ~]# docker images

[root@server1 ~]# docker volume ls

 清除没有在使用的卷:
 

[root@server1 ~]# docker push reg.westos.org/busybox:latest    ##没有认证
[root@server1 ~]# docker login reg.westos.org
[root@server1 ~]# docker push reg.westos.org/busybox:latest   ##再次上传
[root@server1 ~]# curl -u admin:westos -k https://reg.westos.org/v2/_catalog  ##查看是否上传成功

四、 docker-harbor仓库

先把旧的registry删除

[root@server1 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                             NAMES
2d26479b98f3   registry   "/entrypoint.sh /etc…"   31 minutes ago   Up 31 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp, 5000/tcp   registry
[root@server1 ~]# docker rm -f registry 

 1.软件包

docker-compose-linux-x86_64-v2.0.1

harbor-offline-installer-v2.3.4.tgz

[root@server1 ~]# mv docker-compose-linux-x86_64-v2.0.1 /usr/local/bin/docker-compose
[root@server1 ~]# chmod +x /usr/local/bin/docker-compose
[root@server1 ~]# tar zxf harbor-offline-installer-v2.3.4.tgz 
[root@server1 ~]# cd harbor/
[root@server1 harbor]# ls
[root@server1 harbor]# cp harbor.yml.tmpl harbor.yml
[root@server1 harbor]# vim harbor.yml

hostname: reg.westos.org

certificate: /data/certs/westos.org.crt
private_key: /data/certs/westos.org.key

harbor_admin_password: westos

[root@server1 harbor]# mkdir /data
[root@server1 harbor]# cd
[root@server1 ~]# mv certs/ /data/
[root@server1 ~]# cd /data/
[root@server1 data]# ls
certs
[root@server1 data]# cd certs/
[root@server1 certs]# ls
westos.org.crt  westos.org.key
[root@server1 certs]# 

2.修改配置信息

 [root@server1 harbor]# vim harbor.yml 

hostname: reg.westos.org

certificate: /data/certs/westos.org.crt
private_key: /data/certs/westos.org.key

harbor_admin_password: westos

 3.安装

[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]# ./install.sh ##出错

 [root@server1 harbor]# netstat -antlp  ##查看端口

 查看当前正在运行的进程:

 查看镜像:

 [root@server1 harbor]# docker-compose ps   ##docker-compose必须在harbor目录下运行

4.登陆网页

 访问https://172.25.52.1/   ——>登陆

5. 获取认证

docker logout reg.westos.org  ##退出之前的认证
docker login reg.westos.org
Username: admin
Password:
是登陆web页面的账号密码。

[root@server1 ~]# docker tag reg.westos.org/busybox:latest reg.westos.org/library/busybox:latest
[root@server1 ~]# cat auth/htpasswd 
admin:$2y$05$DOHbuVGTTS/iMhRq9xBT9uNQd.0m6HqoOwr82qwGvIiPEyAVivx9S
gyy:$2y$05$PI.LrvlfgP4laHopOlJLoe6XsBPdht6/v5Xmax4AIwTVkT5MI0Wom
[root@server1 ~]# docker logout reg.westos.org   ##退出之前的认证
Removing login credentials for reg.westos.org
[root@server1 ~]# cd docker/
[root@server1 docker]# ls
CentOS-Base.repo  Dockerfile  Dockerfile.old  index.html  nginx-1.20.2.tar.gz
[root@server1 docker]# cd
[root@server1 ~]# cd .docker/
[root@server1 .docker]# ls
config.json
[root@server1 .docker]# cat config.json 
[root@server1 .docker]# docker login reg.westos.org  ##重新进行认证
[root@server1 .docker]# cd
[root@server1 ~]# docker push reg.westos.org/library/busybox:latest ##上传

 再次上传一个nginx镜像:

 在前端访问:https://172.25.52.1

 项目——>library——>镜像仓库

 可以在日志中查看上传和下载信息等

6.添加默认仓库路径(客户端)

首先需要在server2中下载安装docker-ce,然后进行配置

[root@server2 ~]# cd /etc/yum.repos.d/
[root@server2 yum.repos.d]# ls
Centos-Base.repo  docker-ce.repo  dvd.repo  redhat.repo
[root@server2 yum.repos.d]# yum install -y docker-ce
[root@server2 yum.repos.d]# sysctl --system
[root@server2 yum.repos.d]# systemctl enable --now docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server2 yum.repos.d]# docker info

 在server1中:

[root@server1 sysctl.d]# cd /etc/docker/
[root@server1 docker]# ls
certs.d  daemon.json  key.json
[root@server1 docker]# scp -r certs.d/ server2:/etc/docker/                                                            
[root@server1 docker]# scp -r daemon.json server2:/etc/docker/

添加默认仓库路径 

 docker info  查看到新的添加的镜像路径

测试:

[root@server2 docker]# docker pull busybox  ##拉取镜像

[root@server2 docker]# docker pull nginx:1.18

 可以在日志中看到

7.重新下载配置

[root@server1 ~]# cd harbor/
[root@server1 harbor]# docker-compose stop
[root@server1 harbor]# docker-compose down
[root@server1 harbor]# ./install.sh --with-notary --with-trivy --with-chartmuseum

内容信任 ,镜像扫描
相当于:配置中加入了漏洞扫描,内容信任等选项。  在打开的网页中选择漏洞扫描

这里主要是作为后期的优化

 

 

 进行镜像扫描:

  扫描后的镜像如下图:

 

 当扫描之后没有漏洞就可以进行签名(上图中的nginx镜像为1.18版本,版本过旧有漏洞)

启用docker内容信任,网页选择内容信任

 部署根证书:

mkdir ~/.docker/tls/reg.westos.org:4443 -p
cd ~/.docker/tls/reg.westos.org:4443
cp /etc/docker/certs.d/reg.westos.org/ca.crt .

启用docker内容信任:

export DOCKER_CONTENT_TRUST=1
 export DOCKER_CONTENT_TRUST_SERVER=https://reg.westos.org:4443

 上传之前上传的镜像:

 [root@server1 ~]# docker push reg.westos.org/library/nginx:1.18

 显示已经存在,需要我们输入root key和 repository key   当我们只修改标签的时候,我们只用输入repository key

密码  westos007

在前端访问查看签名:

[root@server1 ~]# docker tag  nginx:latest reg.westos.org/library/nginx:latest
[root@server1 ~]# docker push reg.westos.org/library/nginx:latest   ##只修改标签,只用输入repository key

 网页访问,签名成功

更多推荐