目录
一、什么是仓库
二、Docker Hub
三、Registry 工作原理
四、配置镜像加速器
五、搭建私有仓库
1.初级搭建?
2.docker私有仓库的优化
?六、企业级私有仓库的搭建——harbor
1.harbor简介
2.harbor安装部署
??3、添加签名和扫描
?内容信任---镜像签名
?扫描
4、建立一个私有仓库?
一、什么是仓库
?Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。
?Docker运行中使用的默认仓库是 Docker Hub 公共仓库。仓库(Repository)是集中存放镜像的地方。
二、Docker Hub
Docker官方维护了一个公共仓库Docker?Hub,其中已经包括了数量上百万的镜像,大部分需求都可以通过在Docker?Hub?中直接下载镜像来实现。用户可以免费使用,也可以购买私有仓库。
首先在https://hub.docker.com/网站注册一个账号
在docker hub上新建一个公共仓库
docker info #可以查看到默认的官方仓库
docker search #搜索镜像
docker login #来完成 Docker Hub 的登录
docker logout #来完成 Docker Hub 的注销
docker tag busybox:latest yakexi007/busybox:latest #更名,重新打标签
docker push yakexi007/busybox:latest #上传到公共仓库
docker pull yakexi007/busybox:latest #从docker hub拉取镜像
docker rmi yakexi007/busybox:latest3 #删除本地镜像
?也可以浏览器中搜素内容是一样的。官方网站:https://hub.docker.com
从docker主机上传镜像,首先需要登录。通过 docker login 命令在终端输入用户名及密码来完成 Docker Hub 的登录
认证信息保存在改文件中,登陆一次就可。
??????
上传镜像到公共仓库。
我们打算创建一下最下面这个镜像。
?首先新建一个。
?更改名字,然后上传。
?刷新一下,上传成功。
?重新搜索,便可以找到
?注销
?浏览器中删除docker hub中的镜像仓库
三、Registry 工作原理
index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
?
Docker Registry有三个角色,分别是index、registry和registry client。
?
registry
?????????
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth ????????service的Token的方式进行认证。
?
Registry Client
?????????
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
?
index
?
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息
。
?
Web UI
?
元数据存储
?
认证服务
?
符号化
情景A:用户要获取并下载镜像
?情景B:用户要推送镜像到registry中
?情景C:用户要从index或registry中删除镜像
四、配置镜像加速器
从docker hub上下载镜像的速度太慢,需要配置镜像加速器,推荐使用阿里云的镜像加速器。
先注册阿里云帐号
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
systemctl daemon-reload #重载docker服务:
systemctl restart docker
docker info
docker images
docker pull zabbix/zabbix-agent #测试可以看到拉取速度很快
docker images
五、搭建私有仓库
?
docker
hub
虽然方便,但是还是有限制
?
需要
internet
连接,速度慢
?
所有人都可以访问
?
由于安全原因企业不允许将镜像放到外网
?
好消息是
docker
公司已经将
registry
开源,我们可以快速构建企业私有仓库
1.初级搭建?
docker pull registry #下载registry镜像
docker history registry:latest
docker run -d -p 5000:5000 --restart=always --name registry registry ##运行容器 -d 是打入后台 默认端口为5000 --restart=always表示随docker 自己启动
docker ps
netstat -antlp
curl localhost:5000/v2/_catalog ##查看仓库
docker images
docker tag nginx:latest localhost:5000/nginx:latest
docker push localhost:5000/nginx:latest ##上传镜像到本地仓库
curl localhost:5000/v2/_catalog ##查看仓库
查看此时没有内容。
2.docker私有仓库的优化
?为Docker仓库添加证书
make certs
yum install -y openssl11-1.1.1k-2.el7.x86_64.rpm openssl11-libs-1.1.1k-2.el7.x86_64.rpm
?生成秘钥,填写证书信息。域名一定要和DNS解析保持一致
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 rm -f registry ##删除原来的仓库
docker history registry:latest 里面默认卷
docker volume ls
docker volume prune ##清除卷内信息
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 ## -v 选项表示把宿主机的目录挂接到容器内的路径 -e是修改内部选项 监听端口 端口映射443容器内的程序会在/var/lib/registry
docker ps
ll /opt/registry/ ##里面为空
docker images
vim /etc/hosts #给docker1添加解析:reg.westos.org
docker tag nginx:latest reg.westos.org/nginx:latest ##贴标签
docker push reg.westos.org/nginx:latest
上传时发现需要认证
mkdir -p /etc/docker/certs.d/reg.westos.org
cd certs/
ls
cp westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt ##拷贝证书到指定目录中,docker引擎会识别到
ll /etc/docker/certs.d/reg.westos.org/ca.crt
docker push reg.westos.org/nginx:latest
cd /opt/registry/docker/registry
?加入认证功能
mkdir auth
yum install -y httpd-tools
htpasswd --help
htpasswd -cB auth/htpasswd admin ##为admin用户和dmq用户添加认证信息和密码,并查看,第一次用-c
cat auth/htpasswd ##看到用户密码
htpasswd -B auth/htpasswd wxh
cat auth/htpasswd
docker rm -f registry
docker ps -a
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
再次上传测试
curl -k https://reg.westos.org/v2/_catalog -u admin:westos ##查看仓库镜像
ll -d /opt/registry/
docker tag yakexi007/game2048:latest reg.westos.org/game2048:latest
docker push reg.westos.org/game2048:latest ##需要认证
docker login reg.westos.org ##登陆到域名reg.westos.org
cat .docker/config.json ##认证信息
docker push reg.westos.org/game2048:latest
curl -k https://reg.westos.org/v2/_catalog -u admin:westos ##可以看到上传的镜像
?六、企业级私有仓库的搭建——harbor
1.harbor简介
?Harbor是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库。
作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
官方网站:Redirecting to https://goharbor.io
2.harbor安装部署
删除之前的仓库,防止端口被占用。
docker rm -f registry
docker ps -a
软件下载
下载地址:https://github.com/goharbor/harbor/releases
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/ #向目录中复制证书
cd
cd harbor/
./install.sh ##启动脚本(失败需要安装docker-compose)
?安装失败,需要安装docker-compose。
从github 上下载最新版本。是可执行的二进制文件,直接放到指定位置即可。
file docker-compose-linux-x86_64-v2.2.3 ##查看版本信息
mv docker-compose-linux-x86_64-v2.2.3 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose ##给执行权限
which docker-compose
docker-compose ##运行
cd harbor/
ls
./install.sh ##启动脚本成功, ##会自动生成docker-compose文件【此命令必须和docker-compose.yml保持在同一目录】
ls
docker-compose ps ##执行的时候是从docker-compose.yml文件里加载信息的【有9个容器】
?测试:网页浏览172.25.0.1
?向仓库中上传镜像文件
再新建一台虚拟机,并安装docker
cd /etc/yum.repos.d/
ls
scp Centos-7.repo docker-ce.repo server2:/etc/yum.repos.d/ ##软件仓库传过去为了安装docker
cd /etc/sysctl.d/
scp docker.conf server2:/etc/sysctl.d/ ##传输文件为了修改内核选项
yum install -y docker-ce
sysctl --system #生效
systemctl enable --now docker #设置开机自起
docker info
vim /etc/hosts #给docker1添加解析:reg.westos.org
开始拉取。
此时需要添加主机名,只输入镜像名还会从外网拉取,不能从本地仓库拉取。
?
docker info? ? ? ? 发现下载位置已经更改。
测试:
先将之前的删除。
再次拉取
3、添加签名和扫描
docker-compose ps #查看正在运行的容器
docker-compose stop #停止所有容器
docker-compose down #停止并删除所有容器
重新建立仓库,添加相应功能
./install.sh --with-notary --with-trivy --with-chartmuseum
#镜像签名; 镜像扫描; harbor_chart功能
发现之前的信息都还在,是因为删除了仓库,但是数据保存在本地。
?内容信任---镜像签名
打开项目内容信任功能即不允许没有签名的镜像上传下载
拉取失败
内容信任的服务端口是4443
cd .docker/
ls
部署根证书:
mkdir -p tls/reg.westos.org:4443 ##建立目录
cd tls/
ls
cd reg.westos.org:4443
cp /data/certs/westos.org.crt ca.crt
启动docker内容信任
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://reg.westos.org:4443
docker push reg.westos.org/library/nginx:latest #在上传的时候一定要加标签,因为内容信任是通过标签判断的
上传同一镜像的不同版本,只需要仓库的key,如果上传不同的镜像则需要根的key
此时是?上传同一镜像的不同版本,只需要仓库的key
docker images nginx
docker tag nginx:1.18.0 reg.westos.org/library/nginx:1.18.0
docker push reg.westos.org/library/nginx:1.18.0
拉取也成功了。
?扫描
以前上传的镜像都是没有经过扫描的,可以对已经上传的镜像进行扫描:?
点击扫描
?扫描出来很多漏洞
4、建立一个私有仓库?
取消镜像签名
unset DOCKER_CONTENT_TRUST #取消这个选项,改成0也可以
export
?
?上传镜像到私有仓库
docker tag yakexi007/game2048:latest reg.westos.org/westos/game2048:latest
docker push reg.westos.org/westos/game2048:latest
拉取镜像失败
新建一个用户(密码大小写加数字最少8位)
?进入项目?--> westos--> 成员-->+ user为维护人员
?以新建用户登录后,大多功能消失。
登陆新用户拉取成功,私有的,专属的。
|