docker镜像仓库

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: docker镜像仓库

一.Docker Hub (公有仓库)


Docker Hub官网:https://hub.docker.com/


 目前 Docker 官方维护了一个公共仓库Docker Hub ,大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。


 如果你觉得拉取 Docker Hub 的镜像比较慢的话,我们可以配置一个镜像加速器,当然国内大部分云厂商都提供了相应的加速器,简单配置即可。


 注册:你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。


 登录:通过执行docker login 命令交互式的输入用户名及密码来完成在命令行界 面登录 Docker Hub。


 注销:你可以通过docker logout 退出登录。


二.Registry (私有仓库)


 公司服务器大部分都是私网,为了安全和方便可以搭建私有仓库,而不用完全手动的去导入导出镜像,因为是局域网拉取速度非常快,可以节省带宽和大量时间。


 构建私有的镜像仓库的原由:

 有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。


 docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。


 一般情况下,不论是通过commit容器得到的镜像,或者是用dockerfile 制作的镜像,如果需要将镜像保存,可以使用我们之前提到的导出导入命令(save -o ;  load -i)。导出的包,然后再传给其他dockerHost,这种方法也是可行的。

 但往往在公司会有大量的镜像,而且不仅仅是单台的dockerHost。我们迫切需要有一个本地的共用的仓库,来实现多台dockerHost直接拉取镜像而不用手动的将镜像传来传去,之前的DockerHub可以帮助我们解决这个问题,当然前提需要申请一个DockerHub的账号,创建一个仓库。但这种方法需要消耗我们的带宽,因为是通过网络传输,既然是网络传输,就需要消耗一定的时间。

 

 Registry仓库,是通过一个容器给我们提供的服务,是比较简易的私有仓库,以后在企业中还会有功能更加完善的Harbor仓库。


 registry是官方提供的工具,可以用于构建私有的镜像仓库。你可以通过获取官方 registry 镜像来运行。


==================================

创建基于registry的私有仓库  


1)用docker容器运行registry私有仓库服务。


注:registry是官方打包好的服务,端口为5000,就像其他虚拟出来的web服务一样


注意,这里我们使用的是registry:2版本,还有一个registry镜像,这两个没有什么大的区别。**registry: 是用Python语言写的,registry:2使用Go 语言写的**,理论上来说,registry:2这个版本运行更快些。**


命令:

docker pull registry:2


2)运行私有仓库服务


命令:

docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2


   -v:  挂载目录。  宿主机的目录(如果没有此目录会自动创建):容器内的目录。(数据卷:实现容器与宿主机之间的共享,通过一个目录"卷")


   --restart=always:随着docker服务的启动而启动此容器


3) 镜像重命名(要上传的镜像名需要注明私仓的ip)


因为我们使用的私有镜像,在上传或下载的时候,都需要我们将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。


格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]


命令:

docker tag nginx:latest 192.168.100.205:5000/nginx



4)编辑docker配置文件(因为默认是拉取docker官方的镜像,需要重新指定)


#初次上传命令:

docker push 192.168.100.205:5000/nginx  #上传私有仓库会报错

#以下是报错:

#The push refers to repository [192.168.100.205:5000/nginx]

#Get https://192.168.100.205:5000/v2/: http: server gave HTTP response to HTTPS client


//**上传镜像失败原因如下:**


因为docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口,这是因为 Docker默认不允许非HTTPS 方式推送镜像。 如果没做这一步,会报HTTPS的错。


#编辑docker的配置文件,指定私有仓库地址


vim /usr/lib/systemd/system/docker.service


[Service]

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.205:5000  



#修改完成之后重新加载docker和重启

systemctl daemon-reload

systemctl restart docker


#再次上传测试

docker push 192.168.100.205:5000/nginx  



**本地dockerhost查看私有仓库镜像方法:进入到私有仓库的共享目录**


cd /registry/docker/registry/v2/repositories/

ls


5)其他dockerhost上传私有仓库


 这里注意,既然是私有仓库,肯定是要考虑多台DockerHost共用的情况, 如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后, daemon-reload ,restart docker服务。


###### 修改docker配置文件

vim /usr/lib/systemd/system/docker.service


[Service]

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.205:5000  


systemctl daemon-reload

systemctl restart docker.service

docker info

#看到私仓ip即为成功

Insecure Registries:

192.168.100.205:5000

127.0.0.0/8



###### 查看仓库有哪些镜像

curl -XGET http://192.168.100.205:5000/v2/_catalog

 -X/--request  指定什么命令

 -G/--get 以get的方式来发送数据

 -E/--cert cert[:passwd] 客户端证书文件和密码 (SSL)

 -T/--upload-file  上传文件


curl http://localhost:5000/v2/_catalog      #查看本地私有仓库镜像


curl http://192.168.100.205:5000/v2/nginx/tags/list

{"name":"nginx","tags":["latest"]} //并看到详细的自定义 版本号



==========================================

Harbor(企业级别私有仓库)


 Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装。


 它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计(用户都做了哪些操作)等功能外,它还整合了K8s(谷歌的产品)的插件(Add-ons)仓库。

 即 Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库.【注:helm就相当于k8s的yum】。

 另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair。Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞

 库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。


Harbor安装有3种方式:


   在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小


   离线安装:安装包包含部署的相关镜像,因此安装包比较大


   OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor本文记录通过离线安装的方式部署。


**//这里选用离线安装的方式。**


1、下载一个docker-compose工具。


 docker-compose工具的作用是编排镜像,可以像剧本一样把要做的事先规划好,例如要启动的镜像丶镜像名字丶运行机制丶数据卷,实现更加便捷,快速。


1.7.4版本的harbor安装好之后会有一个docker-compose.yml文件,安装docker-compse工具就是为了支持这个功能从github上下载docker-compse工具


curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  


#下载完成之后查看/usr/local/bin/目录(直接下载到环境变量目录)

#增加可执行权限

chmod +x /usr/local/bin/docker-compose


#查看版本号,并验证命令可用

docker-compose -v


#下载依赖包(docker环境已经安装)

yum -y install yum-utils device-mapper-persistent-data lvm2



2、harbor离线模式


直接在百度搜 harbor进官网 harbor的部署方式,**有在线和离线两种方式,考虑到网速原因,

这里我们采用离线下载方式。

wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz  


#将harbor包解压到/usr/local/下

tar -zxf harbor-offline-installer-v1.7.4.tgz -C /usr/local/

 



3.修改配置文件


[root@docker bin]# cd /usr/local/harbor/   #进入harbor目录

[root@docker harbor]# vim harbor.cfg

hostname = 192.168.100.205    

#指定harbor主机,可以改成我们的ip或者域名,使用域名的话在Windows访问harbor要指定hosts文件

ui_url_protocol = http

#访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on

max_job_workers = 10

#最大连接数

customize_crt = on

ssl_cert = /data/cert/server.crt

ssl_cert_key = /data/cert/server.key

secretkey_path = /data

admiral_url = NA

#是否生成证书

log_rotate_count = 50

#关于日志切割选项

log_rotate_size = 200M

#关于日志切割的大小,可以是KB、MB、GB

http_proxy =

https_proxy =

no_proxy = 127.0.0.1,localhost,core,registry

#是否启用代理访问

email_identity =

email_server = smtp.mydomain.com

email_server_port = 25

email_username = sample_admin@mydomain.com

email_password = abc

email_from = admin <sample_admin@mydomain.com>

email_ssl = false

email_insecure = false

#邮件设置,发送重置密码邮件时使用

harbor_admin_password = Harbor12345

#启动Harbor后,管理员admin,UI登录的密码,默认是Harbor12345

auth_mode = db_auth

#认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证

self_registration = on

#是否开启自注册

token_expiration = 30

#token有效时间,默认30分钟

project_creation_restriction = everyone

#用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)



修改完配置文件后,在当前目录执行./install.sh,Harbor服务就会根据当前目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动,并且注意,harbor默认使用的是80端口,最好确认是否有冲突,或者也可以在docker-compose.yml中修改对应的端口  


[root@docker harbor]#  ./install.sh



**最终harbor还是由一个个镜像组成一个架构,实现私有仓库的功能**


[root@docker harbor]# docker ps

CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                      PORTS                                                              NAMES

d14144b4cb96        goharbor/harbor-jobservice:v1.7.4        "/harbor/start.sh"       19 minutes ago      Up 19 minutes                                                                                  harbor-jobservice

225a92534326        goharbor/nginx-photon:v1.7.4             "nginx -g 'daemon of…"   19 minutes ago      Up 19 minutes (healthy)     0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx

7f2a9029daaa        goharbor/harbor-portal:v1.7.4            "nginx -g 'daemon of…"   19 minutes ago      Up 19 minutes (healthy)     80/tcp                                                             harbor-portal

f8300fc73e5b        goharbor/harbor-core:v1.7.4              "/harbor/start.sh"       19 minutes ago      Up 19 minutes (healthy)                                                                        harbor-core

db1a750cbb23        goharbor/redis-photon:v1.7.4             "docker-entrypoint.s…"   19 minutes ago      Up 19 minutes               6379/tcp                                                           redis

987e23d2b823        goharbor/registry-photon:v2.6.2-v1.7.4   "/entrypoint.sh /etc…"   19 minutes ago      Up 19 minutes (healthy)     5000/tcp                                                           registry

cdb12eb42239        goharbor/harbor-adminserver:v1.7.4       "/harbor/start.sh"       19 minutes ago      Up 19 minutes (healthy)                                                                        harbor-adminserver

ee4da2c5f86f        goharbor/harbor-registryctl:v1.7.4       "/harbor/start.sh"       19 minutes ago      Up 19 minutes (healthy)                                                                        registryctl

c3c9076df1dd        goharbor/harbor-db:v1.7.4                "/entrypoint.sh post…"   19 minutes ago      Up 19 minutes (healthy)     5432/tcp                                                           harbor-db

f60346774830        goharbor/harbor-log:v1.7.4               "/bin/sh -c /usr/loc…"   19 minutes ago      Up 19 minutes (unhealthy)   127.0.0.1:1514->10514/tcp                                          harbor-log



docker-compose这个命令可以管理harbor服务,不过需要注意的是想使 用以下命令,必须是和docker-compose.yml这个文件在同一个目录下,其实就是通过管理这个文件而管理harbor仓库的。


启动harbor: docker-compose start

停止harbor: docker-compose stop

重启harbor: docker-compose restart


========================================

harbor使用


1 .启动harbor  


[root@docker harbor]# docker-compose start

Starting log         ... done

Starting postgresql  ... done

Starting redis       ... done

Starting adminserver ... done

Starting registry    ... done

Starting core        ... done

Starting jobservice  ... done

Starting portal      ... done

Starting proxy       ... done

Starting registryctl ... done


#以下是harbor的架构(是由容器虚拟出来的)

Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI,token等服务。

db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。

UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。

jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。

Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。

Registry:镜像仓库,负责存储镜像文件。

Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。



2 .通过浏览器访问

http://192.168.100.205/harbor


用户:admin

密码:Harbor12345


已有仓库 library

可以新建项目仓库


可以新建用户

在项目中添加用户并赋予权限:

   项目管理员  

   开发人员  

   访客

 

docker client的设置


1、更改docker配置文件


vim /usr/lib/systemd/system/docker.service  

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.205

systemctl daemon-reload

systemctl restart docker



2、客户端登陆  


docker login -u admin -p Harbor12345 192.168.100.205



3、上传私有镜像  


镜像名称要修改成:私有仓库ip/项目名称/镜像名称`


docker tag nginx:latest 192.168.100.205/library/nginx

docker push 192.168.100.205/library/nginx  


相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
171 0
|
4月前
|
存储 运维 数据安全/隐私保护
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
|
3月前
|
Docker 容器
使用rootfs制作docker容器镜像
使用rootfs制作docker容器镜像
|
5月前
|
应用服务中间件 nginx 数据安全/隐私保护
借助阿里个人版镜像仓库+云效实现全免费同步docker官方镜像到国内
受docker hub 6月初网络变更的影响,国内拉取docker官方镜像变得不稳定……
|
4月前
|
Docker 容器
docker: 搭建 harbor 镜像仓库
docker: 搭建 harbor 镜像仓库
|
6月前
|
存储 Linux Docker
Docker|了解容器镜像层(2)
Docker|了解容器镜像层(2)
101 0
Docker|了解容器镜像层(2)
|
6月前
|
存储 缓存 开发工具
Docker|了解容器镜像层(1)
Docker|了解容器镜像层(1)
121 0
|
7月前
|
存储 API 数据安全/隐私保护
企业级Docker镜像仓库Harbor部署与使用
企业级Docker镜像仓库Harbor部署与使用
|
7月前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
2997 0
|
7月前
|
关系型数据库 MySQL Linux
如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
373 0