镜像仓库治理
docker仓库,用来治理镜像。次要分为公共仓库和私人仓库。上面介绍了公共仓库Docker Hub、私人仓库Registry和harbor。
DockerHUb仓库治理
什么是DockerHUb
保留和散发镜像的最间接办法就是应用 Docker Hub。
Docker Hub 是 Docker 公司保护的公共 Registry。用户能够将本人的镜像保留到 Docker Hub 收费的 repository 中,如果不心愿他人拜访本人的镜像,也能够购买公有 repository。
账号注册和登陆
个别,你须要先在docker核心创立一个账户(如果您尚未有)。你能够间接在Docker Hub创立你的账户。
如果有已有账号能够点击sign in 进行登录,登陆后是这个样子
Docker客户端登录
应用docker login
登录dockerhub
这将提醒您输出用户名,这个用户名将成为你的公共存储库的命名空间名称。如果你的名字可用,docker会提醒您输出一个明码和你的邮箱,而后会主动登录到Docker Hub,你当初能够提交和推送镜像到Docker Hub的你的存储库。
docker login
呈现
Login Succeeded
就阐明咱们登录胜利注:你的身份验证凭证将被存储在你本地目录的
.dockercfg
文件中
治理镜像
通过docker images
能够看到咱们所有的镜像列表
docker images
删除镜像
咱们当初的learn-docker-storage
有三个版本,当初咱们把前两个有问题的版本删除,docker rmi 镜像ID
能够删除镜像
docker rmi learn-docker-storage:0.0.1 learn-docker-storage:0.0.2
这样咱们就删除了咱们没有用的镜像了,能够节俭内存空间
批改镜像命名
批改镜像的 repository 使之与 Docker Hub 账号匹配。
Docker Hub 为了辨别不同用户的同名镜像,镜像的 registry 中要蕴含用户名,残缺格局为:[用户名]/镜像名:tag
咱们通过 docker tag
命令重命名镜像
docker tag learn-docker-storage:0.0.3 baiyp/learn-docker-storage:0.0.3
这样就将咱们的镜像改名了,这个就合乎咱们的dockerhub的标准了
推送镜像
推送镜像
当初咱们要将咱们的镜像推送到
docker hub
推送镜像的标准是
docker push 注册用户名/镜像名:tag
,因为咱们下面曾经把镜像名字改正确了,所以能够间接推送。
docker push baiyp/learn-docker-storage:0.0.3
这样咱们就将咱们的数据推送到docker hub,咱们发现只有最顶层的镜像推送了,openjdk的镜像并没有推送,间接复用了仓库的,这就是分层的益处
查看镜像
咱们能够到docker hub
查看咱们的镜像
能够看到咱们的镜像曾经推送过去了,点开详情能够看到咱们镜像的内容以及tag号
仓库镜像测试
删除本地镜像
能够通过docker rmi 镜像ID
删除本地镜像
docker rmi baiyp/learn-docker-storage:0.0.3 learn-docker-storage:0.0.3
再次查看本地镜像,曾经没有了咱们的微服务的镜像
docker images
从仓库拉取镜像
这个时候能够从docker hub
拉取镜像
docker pull baiyp/learn-docker-storage:0.0.3
这个时候曾经将镜像拉取下来了,咱们能够运行镜像了
运行镜像
执行上面的命令进行创立镜像
docker run -d \-v /tmp/data/logs:/logs \-p 8003:8003 \--name learn-docker-storage \--network=learn-docker-network \baiyp/learn-docker-storage:0.0.3
拜访测试
咱们拜访下,查看下是否能够失常运行
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
到这里咱们就实现dockerhub仓库的公布与拉取
间接运行测试
在实在环境中,咱们个别不会拉取在运行,个别都是间接运行,如果docker查看镜像不存在会主动拉取
进行服务并删除镜像
docker rm -f learn-docker-storage docker rmi baiyp/learn-docker-storage:0.0.3
咱们间接运行容器
docker run -d \-v /tmp/data/logs:/logs \-p 8003:8003 \--name learn-docker-storage \--network=learn-docker-network \baiyp/learn-docker-storage:0.0.3
这一个run命令就解决了容器的拉取以及容器运行的问题
registry仓库治理
registry简介
官网提供了Docker Hub网站来作为一个公开的集中仓库。然而,本地拜访Docker Hub速度往往很慢,并且很多时候咱们须要一个本地的公有仓库只供网内应用。
Docker仓库实际上提供两方面的性能,一个是镜像治理,一个是认证。前者次要由docker-registry我的项目来实现,通过http服务来上传下载;后者能够通过docker-index(闭源)我的项目或者利用现成认证计划(如nginx)实现http申请治理。
docker registry 就是治理 docker 镜像的服务, Docker 公司保护的 registry 就是 http://hub.docker.com ,它能够让咱们不便的下载事后做好的镜像。
装置registry
咱们能够通过获取官网的 registry
镜像来运行。
这将应用官网提供的 registry
镜像来启动公有仓库,默认状况下,仓库会被创立在容器的 /var/lib/registry
目录下。咱们能够通过 -v
参数将镜像文件寄存在本地的指定门路。
docker run -d \-p 5000:5000 \-v /tmp/data/registry:/var/lib/registry \--restart=always \registry
这样咱们的registry曾经启动起来了
拜访测试
这时咱们能够通过浏览器拜访 http://ip:5000/v2/_catalog
查看仓库是否启动胜利。
curl http://192.168.64.152:5000/v2/_catalog
上传镜像
registry 上传镜像的命名标准是 仓库IP:5000/镜像名称:tag
批改镜像名称
将咱们的镜像改成服务标准的名字
docker tag baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/learn-docker-storage:0.0.3
推送镜像
应用命令推送镜像
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3
咱们发现推送报错了,这是因为docker推送默认应用的https的形式,而咱们的registry只反对http的形式
批改Docker推送配置
对于 Linux 零碎,咱们能够在/etc/docker/daemon.json
(daemon.josn
文件不存在则新建该文件)
vi /etc/docker/daemon.json
增加上面的配置
{ "insecure-registries": ["仓库IP:5000"] }
残缺的配置如下
{ "insecure-registries": ["192.168.64.153:5000"], "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]}
执行以下命令重启从新加载配置并失效
systemctl daemon-reloadservice docker restart
再次进行推送
执行命令再次推送
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3
咱们发现这次推送胜利了
再次拜访registry
拜访测试查看是否曾经推送
curl http://192.168.64.153:5000/v2/_catalog | python -m json.tool
咱们发现咱们的镜像曾经推送到了registry,咱们通过以下URL拜访下tag列表
curl http://192.168.64.153:5000/v2/learn-docker-storage/tags/list | python -m json.tool
registry镜像测试
删除本地镜像
能够通过docker rmi 镜像ID
删除本地镜像
docker rmi baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/learn-docker-storage:0.0.3
运行registry中的镜像
docker run -d \-v /tmp/data/logs:/logs \-p 8003:8003 \--name learn-docker-storage \--network=learn-docker-network \192.168.64.153:5000/learn-docker-storage:0.0.3
咱们发现自己的registry很快就拉取并且运行起来了
拜访微服务测试
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
应用Harbor治理仓库
什么是Harbor
harbor是一个由vm公司开源的企业级容器镜像仓库,有以下性能
- 治理用户界面
- 基于角色的访问控制
- LDAP/AD 集成及日志审计等根本运维操作
harbor是构建企业级公有docker镜像的仓库的开源解决方案,它是 Docker Registry的更高级封装,它除了提供敌对的Web UI界面,角色和用户权限治理,用户操作审计等性能外,它还整合了K8s的插件(Add-ons)仓 库,即Helm通过chart形式下载,治理,装置K8s插件,而chartmuseum 能够提供存储chart数据的仓库。
另外它还整合了两个开源的平安组件,一个是Notary,另一个是Clair,Notary相似 于公有CA核心,而Clair则是容器平安扫描工具,它通过各大厂商提供的 CVE破绽库来获取最新破绽信息,并扫描用户上传的容器是否存在已知的 破绽信息,这两个平安性能对于企业级公有仓库来说是十分具备意义的。
Harbor的三种装置形式
这里咱们应用离线装置
- 在线装置:从Docker Hub下载Harbor相干镜像,因而装置软件包十分小
- 离线装置:安装包蕴含部署的相干镜像,因而安装包比拟大
- OVA安装程序(第三方):当用户具备vCenter环境时,应用此安装程序,在部署 OVA后启动Harbor
为什么应用私用仓库
公司的我的项目个别不予许咱们上传到 Docker Hub 这类的公共仓库中,所有学会创立一个公有仓库也是十分必要的
尽管hub.docker.com
上能够保留镜像,然而网速绝对较慢,在外部环境中搭建一个公有的公共仓库是个更好的计划。
harbor 的根本组件
组件 | 性能 |
---|---|
harbor-adminserver | 配置管理核心 |
harbor-db | 数据库 |
harbor-jobservice | 镜像复制 |
harbor-log | 日志操作 |
harbor-ui | Web治理页面和API |
nginx | 前端代理,负责前端页面和镜像上传/下载转发 |
redis | 会话 |
registry | 镜像存储 |
前置工作
下载安装包
Harbor官网地址:https://github.com/goharbor/harbor/releases 下载最新版安装包
筹备环境
须要装置docker以及docker-compose的环境下面咱们已提前装置了
- 装置Docker环境
- 装置docker-compose环境
离线装置
解压安装包
解压harbor的安装包
tar -zxf harbor-offline-installer-v2.1.4.tgz
进入目录 而后将harbor.yml.tmp
复制一份并该命为harbor.yml
cd harborcp harbor.yml.tmpl harbor.yml
留神: 这里跟老版本不一样,没有了harbor.cfg文件,咱们须要手动复制harbor.yml.tmpl在做批改即可
批改harbor.yml
harbor作为公有仓库作用在公司内网,个别都是信赖关系,没多大必要做https,应用http即可!
所以 把https相干的曾经正文掉
并留神配置文件的用户名明码配置,默认是 用户名是:admin,明码是:Harbor12345,如果批改须要装置前批改
加载本地镜像
应用docker load
命令加载本地镜像,不必再从dockerhub下载了
docker load -i harbor.v2.1.4.tar.gz
这样容器镜像就被加载到了本地,咱们能够通过docker images
命令查看导入的镜像
docker images
执行装置命令
先执行预处理命令,会创立一些文件夹,初始化一些文件
./prepare
而后开始真正的装置过程
./install.sh
如果呈现-Harbor has been installed and started successfully
示意装置胜利,并查看docker过程
docker ps
能够看到很多服务曾经起来了。
启动和进行harbor
在harbor的装置目录执行以下命令就能够启动和进行了
# 启动docker-compose up -d # 进行docker-compose stop # 重新启动docker-compose restart
harbor应用
拜访harbor
输出http://harborIP
就能够间接拜访了,这里拜访咱们的地址http://192.168.64.153/
输出用户名明码就能够登录了 ,如果没有批改配置文件 默认是 用户名是:admin,明码是:Harbor12345
登录后就能够进行操作了
Docker登录harbor
应用docker login命令就能够登录harbor了
docker login -u admin -p Harbor12345 192.168.64.153
咱们发现登录报错了,这和registry一样,docker模式应用https形式,而咱们应用的是http的形式登录
批改Docker配置
对于 Linux 零碎,咱们能够在/etc/docker/daemon.json
(daemon.josn
文件不存在则新建该文件)
vi /etc/docker/daemon.json
增加上面的配置
{ "insecure-registries": ["harbor地址"] }
残缺的配置如下
{ #因为默认端口号是80 所以不须要加端口号 "insecure-registries": ["192.168.64.153"], "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]}
执行以下命令重启从新加载配置并失效
systemctl daemon-reloadservice docker restart
再次进行登录
docker login -u admin -p Harbor12345 192.168.64.153
这次咱们就胜利登录了
到这里咱们就曾经登录胜利了
批改镜像tag
咱们推送镜像我要把咱们的镜像名称改成符合规范的格局
docker tag \192.168.64.153:5000/learn-docker-storage:0.0.3 \192.168.64.153/library/learn-docker-storage:0.0.3
这里有一个library
门路,是harbor默认的项目名称
推送镜像
能够通过docker push
进行推送镜像,留神须要先登录在进行推送
docker push 192.168.64.153/library/learn-docker-storage:0.0.3
到这里咱们曾经推送到了harbor,咱们能够登录library页面查看
harbor 测试
删除本地镜像
能够通过docker rmi 镜像ID
删除本地镜像
docker rmi \192.168.64.153:5000/learn-docker-storage:0.0.3 \192.168.64.153/library/learn-docker-storage:0.0.3
运行harbor 中的镜像
执行运行命令
docker run -d \-v /tmp/data/logs:/logs \-p 8003:8003 \--name learn-docker-storage \--network=learn-docker-network \192.168.64.153/library/learn-docker-storage:0.0.3
拜访微服务测试
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
查看harbor详情
详情外面会显示拉取次数
HarBor用户权限阐明
HarBor用户角色在我的项目(我的项目-成员-新加成员)中为3类:我的项目管理员、开发人员、访客
- 我的项目管理员:增删改查
- 开发人员:上传和下载
- 访客:只容许下载
HarBor权限配置
新建用户
点击创立用户能够创立一个用户
咱们创立一个itcast的用户
用户受权
创立用户后进入我的项目模块增加成员
抉择成员后并抉择权限
访客只能进行拉取不能推送和治理
用户登录测试
咱们用itcast
用户通过web端登录测试下,咱们发现用户是没有批改权限的
docker登录测试
登录docker客户端
docker login -u itcast -p Qwert123 192.168.64.153
尝试推送镜像
docker push 192.168.64.153/library/learn-docker-storage:0.0.3
咱们发现是无奈进行推送镜像的
拉取镜像测试
先删除本地的容器以及镜像
docker rm -f learn-docker-storage docker rmi 192.168.64.153/library/learn-docker-storage:0.0.3
尝试拉取并启动本地镜像
docker run -d \-v /tmp/data/logs:/logs \-p 8003:8003 \--name learn-docker-storage \--network=learn-docker-network \192.168.64.153/library/learn-docker-storage:0.0.3
微服务拜访测试
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
Harbor反对Https(扩大)
为了反对微服务推送咱们须要将HarBor
设置为https,能够让HarBor
在任何中央应用以及推送
生成SSL证书
后面说了怎么搭建harbor仓库,这里讲一讲harbor实现https拜访,因为只须要内网拜访,没必要去申请一个ssl证书,所以我就用openssl
颁发自签名证书,实现https拜访。
创立证书目录
mkdir -p /tmp/data/cert && cd /tmp/data/cert && ll
创立 CA 根证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/L=beijing/O=itcast/CN=harbor-registry"
这里subj是主题的意思含意如下
C=国家,S=省(市),L=区(县、市),O=组织机构,OU=组织单位,CN=通用名称
生成证书签名
生成一个证书签名, 设置拜访域名为itcastharbor.com
openssl req -newkey rsa:4096 -nodes -sha256 -keyout itcastharbor.com.key -out server.csr -subj "/C=CN/L=beijing/O=itcast/CN=itcastharbor.com"
生成主机证书
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out itcastharbor.com.crt
操作步骤如下
配置harbor.yml
而后进入harbor装置目录批改harbor.yml
,批改上面几个选项
- hostname,应用IP或域名,不要用回环地址,localhost等
- certificate,yourdomain.com.crt的门路
/tmp/data/cert/itcastharbor.com.crt
- private_key,yourdomainr.com.key的门路
/tmp/data/cert/itcastharbor.com.key
重新安装harbor服务
进行harbor
进行运行中的服务
docker-compose down
运行目录harbor下的prepare实现https的配置
./prepare
重新安装
在harbor目录下运行装置命令
./install.sh
批改Docker推送配置
咱们须要将推送的IP改成域名
vi /etc/docker/daemon.json
上文中咱们对registry曾经操作了,这里须要改用harbor,须要重新配置
#因为默认端口号是80 所以不须要加端口号{ "insecure-registries": ["仓库IP或域名"] }
残缺的配置如下
{ "insecure-registries": ["itcastharbor.com"], "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]}
执行以下命令重启从新加载配置并失效
systemctl daemon-reloadservice docker restart
批改本地host文件
为了让本机可能失常拜访到harbor的web环境须要配置本地的hosts文件减少如下配置
192.168.64.153 itcastharbor.com
windows环境下host门路在C:\Windows\System32\drivers\etc
域名拜访harbor
通过域名拜访harbor,域名就是咱们方才配置的itcastharbor.com
域名访
因为咱们的证书是自签的,不是第三方认证的,素以有安全性提醒,点击持续就能够拜访
到这里登录后就能够拜访了
本文由
传智教育博学谷
教研团队公布。如果本文对您有帮忙,欢送
关注
和点赞
;如果您有任何倡议也可留言评论
或私信
,您的反对是我保持创作的能源。转载请注明出处!