Docker镜像仓库

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

屏幕截图 2023-08-28 185348.png

一.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.8.10:5000/nginx

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

#初次上传命令:
docker push 192.168.8.10:5000/nginx  #上传私有仓库会报错
#以下是报错:
#The push refers to repository [192.168.8.10:5000/nginx]
#Get https://192.168.8.10: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.8.10:5000  
#修改完成之后重新加载docker和重启
systemctl daemon-reload
systemctl restart docker
#再次上传测试
docker push 192.168.8.10: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.8.10:5000  
systemctl daemon-reload
systemctl restart docker.service
docker info
#看到私仓ip即为成功
 Insecure Registries:
 192.168.8.10:5000
 127.0.0.0/8
###### 查看仓库有哪些镜像
curl -XGET http://192.168.8.10: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.8.10: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 xf 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.8.10    
#指定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 
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  

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
虚拟化 Docker Windows
win10使用Docker以及在天池比赛上提交容器镜像文件
win10使用Docker以及在天池比赛上提交容器镜像文件
82 1
|
14天前
|
存储 Linux Docker
Docker|了解容器镜像层(2)
Docker|了解容器镜像层(2)
28 0
Docker|了解容器镜像层(2)
|
19天前
|
存储 缓存 开发工具
Docker|了解容器镜像层(1)
Docker|了解容器镜像层(1)
57 0
|
1月前
|
存储 API 数据安全/隐私保护
企业级Docker镜像仓库Harbor部署与使用
企业级Docker镜像仓库Harbor部署与使用
|
1月前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
1021 0
|
1月前
|
关系型数据库 MySQL Linux
如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
198 0
|
1月前
|
存储 JSON 算法
docker私有镜像仓库的搭建及认证
docker私有镜像仓库的搭建及认证
307 1
|
1月前
|
存储 NoSQL 中间件
「译文」Docker 镜像仓库配置
「译文」Docker 镜像仓库配置
|
1月前
|
存储 安全 API
「译文」Docker 镜像仓库垃圾收集
「译文」Docker 镜像仓库垃圾收集
|
1月前
|
关系型数据库 MySQL Linux
Docker Registry本地镜像仓库部署并实现远程连接拉取镜像
Docker Registry本地镜像仓库部署并实现远程连接拉取镜像
229 1