
docker仓库,用来管理镜像。主要分为公共仓库和私人仓库。下面介绍了公共仓库Docker Hub、私人仓库Registry和harbor。
保存和分发镜像的最直接方法就是使用 Docker Hub。
Docker Hub 是 Docker 公司维护的公共 Registry。用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中,如果不希望别人访问自己的镜像,也可以购买私有 repository。
一般,你需要先在docker中心创建一个账户(如果您尚未有)。你可以直接在Docker Hub创建你的账户。

如果有已有账号可以点击sign in 进行登录,登陆后是这个样子

使用
docker login登录dockerhub
这将提示您输入用户名,这个用户名将成为你的公共存储库的命名空间名称。如果你的名字可用,docker会提示您输入一个密码和你的邮箱,然后会自动登录到Docker Hub,你现在可以提交和推送镜像到Docker Hub的你的存储库。
docker login

出现
Login Succeeded就说明我们登录成功注:你的身份验证凭证将被存储在你本地目录的
.dockercfg文件中
通过
docker images可以看到我们所有的镜像列表
docker images
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yh2EyQc0-1661931669726)(C:/Users/baiyp/AppData/Roaming/Typora/typora-user-images/image-20210517112922229.png)]
我们现在的
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命令就解决了容器的拉取以及容器运行的问题
官方提供了Docker Hub网站来作为一个公开的集中仓库。然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用。
Docker仓库实际上提供两方面的功能,一个是镜像管理,一个是认证。前者主要由docker-registry项目来实现,通过http服务来上传下载;后者可以通过docker-index(闭源)项目或者利用现成认证方案(如nginx)实现http请求管理。
docker registry 就是管理 docker 镜像的服务, Docker 公司维护的 registry 就是 http://hub.docker.com ,它可以让我们方便的下载预先做好的镜像。
我们可以通过获取官方的
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的方式

对于 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-reload
service docker restart

执行命令再次推送
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3

我们发现这次推送成功了
访问测试检查是否已经推送
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

可以通过
docker rmi 镜像ID删除本地镜像
docker rmi baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/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:5000/learn-docker-storage:0.0.3

我们发现自己的registry很快就拉取并且运行起来了
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

harbor是一个由vm公司开源的企业级容器镜像仓库,有以下功能
- 管理用户界面
- 基于角色的访问控制
- LDAP/AD 集成及日志审计等基本运维操作
harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是 Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓 库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum 可以提供存储chart数据的仓库。
另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似 于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的 CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的 漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。
这里我们使用离线安装
公司的项目一般不予许我们上传到 Docker Hub 这类的公共仓库中,所有学会创建一个私有仓库也是非常必要的
虽然hub.docker.com上可以保存镜像,但是网速相对较慢,在内部环境中搭建一个私有的公共仓库是个更好的方案。
| 组件 | 功能 |
|---|---|
| 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的环境上面我们已提前安装了
解压harbor的安装包
tar -zxf harbor-offline-installer-v2.1.4.tgz
进入目录 然后将
harbor.yml.tmp复制一份并该命为harbor.yml
cd harbor
cp harbor.yml.tmpl harbor.yml

注意: 这里跟老版本不一样,没有了harbor.cfg文件,我们需要手动复制harbor.yml.tmpl在做修改即可
harbor作为私有仓库作用在公司内网,一般都是信任关系,没多大必要做https,使用http即可!
所以 把https相关的已经注释掉

并注意配置文件的用户名密码配置,默认是 用户名是:admin,密码是:Harbor12345,如果修改需要安装前修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YbbcDk4m-1661931669729)(C:/Users/baiyp/AppData/Roaming/Typora/typora-user-images/image-20210324144045203.png)]
使用
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的安装目录执行以下命令就可以启动和停止了
# 启动
docker-compose up -d
# 停止
docker-compose stop
# 重新启动
docker-compose restart
输入
http://harborIP就可以直接访问了,这里访问我们的地址http://192.168.64.153/

输入用户名密码就可以登录了 ,如果没有修改配置文件 默认是 用户名是:admin,密码是:Harbor12345

登录后就可以进行操作了
使用docker login命令就可以登录harbor了
docker login -u admin -p Harbor12345 192.168.64.153

我们发现登录报错了,这和registry一样,docker模式使用https方式,而我们使用的是http的方式登录
对于 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-reload
service docker restart

docker login -u admin -p Harbor12345 192.168.64.153
这次我们就成功登录了

到这里我们就已经登录成功了
我们推送镜像我要把我们的镜像名称改成符合规范的格式
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页面查看

可以通过
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

执行运行命令
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用户角色在项目(项目-成员-新加成员)中为3类:项目管理员、开发人员、访客
点击创建用户可以创建一个用户

我们创建一个itcast的用户

创建用户后进入项目模块添加成员

选择成员后并选择权限

访客只能进行拉取不能推送和管理

我们用
itcast用户通过web端登录测试下,我们发现用户是没有修改权限的

登录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在任何地方使用以及推送
前面说了怎么搭建harbor仓库,这里讲一讲harbor实现https访问,因为只需要内网访问,没必要去申请一个ssl证书,所以我就用
openssl颁发自签名证书,实现https访问。
mkdir -p /tmp/data/cert && cd /tmp/data/cert && ll

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安装目录修改
harbor.yml,修改下面几个选项
/tmp/data/cert/itcastharbor.com.crt/tmp/data/cert/itcastharbor.com.key
停止运行中的服务
docker-compose down
运行目录harbor下的prepare完成https的配置
./prepare

在harbor目录下运行安装命令
./install.sh

我们需要将推送的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-reload
service docker restart
为了让本机能够正常访问到harbor的web环境需要配置本地的hosts文件增加如下配置
192.168.64.153 itcastharbor.com
windows环境下host路径在
C:\Windows\System32\drivers\etc
通过域名访问harbor,域名就是我们刚才配置的
itcastharbor.com域名访

因为我们的证书是自签的,不是第三方认证的,素以有安全性提示,点击继续就可以访问

到这里登录后就可以访问了

本文由
传智教育博学谷教研团队发布。如果本文对您有帮助,欢迎
关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。转载请注明出处!
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我一定是犯了n00b错误。我编写了以下Ruby代码:moduleFoodefbar(number)returnnumber.to_s()endendputsFoo.bar(1)测试.rb:6:in':undefinedmethodbar'forFoo:Module(NoMethodError)我想在名为Foo.bar的模块上定义一个方法。但是,当我尝试运行代码时,出现未定义方法错误。我做错了什么? 最佳答案 你可以这样做:moduleFoodefself.bar(number)number.to_sendendputsFoo.bar
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分