Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
docker search 应用,可以看到该应用的官方仓库在哪里:
比如:docker info
首先在https://hub.docker.com/网站注册一个账号
在docker hub上新建一个公共仓库
注意:此处由于我们是在官方新建了仓库,所以我们下面的docker login 也是直接登陆到官方,(可以使用docker info 查看仓库地址)
下图展示了 该用户的官方认证信息保存在.docker目录中,这样就保证了后续的操作就不需要频繁的login,只需要login一次就可以了。
做完上述操作,刷新一下该页面,就能得到如下界面。
docker logout #注销帐号
注意:login一次就好,上传的时候也只需要在login时认证一次,注销后需要重新认证。
一次docker pull 或 push背后发生的事情:
Docker Registry有三个角色,分别是index、registry和registry client。
(1)index
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化
(2)registry
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
(3)Registry Client
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
以下 是几种访问情形。
docker用户端向index端提出访问申请,然后,index端将镜像地址以及token返回给客户端,客户端知道了镜像地址以后拿着token去取镜像,registry端此时会和index端做一次token校验,确认token的真实性,确认无误后,会允许客户端下载镜像。
从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以阿里云为例:(需要提前注册阿里云帐号)
整体操作思路如下:
配置docker daemon文件:
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“阿里云加速器地址”]
}
重载docker服务:
systemctl daemon-reload
systemctl restart docker
(1)获取阿里云加速器地址
这里获得了阿里云的镜像加速器地址。
(2)修改daemon配置文件来使用加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://t5ajcuue.mirror.aliyuncs.com"]
}
(3)导入配置并重启服务
systemctl daemon-reload #重新导入daemon配置
systemctl restart docker #重启docker
docker info #查看docker信息
docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
具体搭建步骤如下:
(1)下载registry镜像
docker pull registry
(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
docker tag : 标记本地镜像,将其归入某一仓库。
示例:将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像: docker tag ubuntu:15.10 runoob/ubuntu:v3
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
示例:上传本地镜像myapache:v1到镜像仓库中:docker push myapache:v1
默认情况下私有仓库不需通过认证即可操作,因此很不安全,所以需要对私有仓库进行加密。
具体操作步骤如下:
(1)生成证书(域名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
(2)重新运行容器:
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 #镜像名称
但是上传镜像时并没有验证证书,这是因为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
证书复制完成后,重新上传镜像。在目录下可以看到刚才上传的镜像,目录已经不再是空的了。
[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 zlw #创建用户zlw
(再次创建用户时不要添加参数-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
直接上传镜像会显示用户认证失败。因为本次启动容器时开启了用户认证功能,所以需要先登录后才能上传镜像。
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
官方地址:https://vmware.github.io/harbor/cn/
1.在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
2.离线安装:安装包包含部署的相关镜像,因此安装包比较大
3.OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动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的密码
接下来创建data目录,并将cert目录移过去,保持与 habor配置文件中的一致性:
mkdir /data #创建目录,用来存放harbor数据(和配置文件中一致)
cp -r certs /data/ #向目录中复制证书
上图中可以看出明显的错误,habor.yml文件中,写的很清楚 是要在根目录下(/)新建一个目录,然后在把certs目录移过去,但是我把目录建立在了家目录下(~),这就会导致后续执行habor安装脚本时出问题。
”/“是根目录,”~“是家目录。Linux存储是以挂载的方式,相当于是树状的,源头就是”/“,也就是根目录。而每个用户都有”家“目录,也就是用户的个人目录,比如root用户的”家“目录就是/root,普通用户a的家目录就是/home/a.可以看到
(3)配置docker-compose
注意:hatbor使用时需要安装依赖性
(4)安装habor
[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目录执行安装脚本
上面可以看出habor安装执行完毕,在浏览器中访问宿主机IP,可以看到harbor界面:
接下来我们进行实验搭建:
实验需求:server1是一个docker私有仓库,server2是一个客户端。server2要从私有仓库server1中下载镜像。
实验环境:新配置一台虚拟机server2,并配置好软件源。
在server2上配置好docker
#server1中
scp /etc/yum.repos.d/* [email protected]:/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
在server1上 做如下操作:
同理,可以将另一个镜像也如此上传到仓库中。
在界面可观察如下:
接下来,就是在server2端拉取镜像:
首先需要将证书 派发给server2,
刚刚为什么是在内网拉取的呢?因为我们使用docker pull reg.westos.org/library/nginx:1.18.0 这种格式,告诉他去哪儿拉取。
那么如何在内网也实现这种简单的操作呢?
一种可行的方法是将加速器地址设置为私人仓库的IP,就类似于server1中阿里云的加速器,在server2中变成了私人仓库server1。
#在server2中
vim /etc/docker/daemon.json #编辑加速器地址
{
"registry-mirrors": ["https://reg.westos.org"]
}
systemctl daemon-reload #重新导入daemon配置
systemctl restart docker #重启docker
此时 默认的仓库已经变成了我们自己的私有仓库,而且 在真实的生产环境中,是不允许连接外网的,这样不安全 。
且在客户端日志中都有记录。
注意:docker-compose工具只能在
docker-compose ps 查看正在运行的容器
docker-compose stop 停止所有容器(有些慢)
docker-compose down 停止并删除所有容器(很快)
./install.sh --with-notary --with-trivy --with-chartmuseum
#镜像签名; 镜像扫描; harbor_chart功能
这是因为这个镜像没有签名认证,所以不能使用。
镜像签名的部署(在私人仓库服务器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的内容信任服务器位置及端口
此时,去界面查看已发现刚刚上传的镜像(game2048)已经签名。
客户端拉取镜像也没有任何问题:
[root@server1 ~]# docker tag yakexi007/game2048:latest reg.westos.org/westos/game2048:latest #更改镜像标签
[root@server1 ~]# docker push reg.westos.org/westos/game2048 #上传镜像到私有仓库
在server2上拉取时,会出现如下内容:
这是因为,匿名用户拉取私有仓库时会报错,因为没有权限。
因此需要在harbor中创建一个用户,可以使用该用户访问镜像。创建用户方法如下:
然后,在westos项目中添加成员:
使用zlw用户登录habor,进能看到如下内容。