镜像仓库
一.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 <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 .通过浏览器访问
用户:admin
密码:Harbor12345
已有仓库 library
可以新建项目仓库
可以新建用户
在项目中添加用户并赋予权限:
项目管理员
开发人员
访客
docker client的设置
1、更改docker配置文件
vim /usr/lib/systemd/system/docker.service
修改:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.8.10
systemctl daemon-reload
systemctl restart docker
2、客户端登陆
docker login -u admin -p Harbor12345 192.168.8.10
3、上传私有镜像
镜像名称要修改成:私有仓库ip/项目名称/镜像名称`
docker tag nginx:latest 192.168.8.10/library/nginx
docker push 192.168.8.10/library/nginx