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是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。你可以通过获取官方 registry 镜像来运行
一般情况下,不论是通过commit容器得到的镜像,或者是用dockerfile制作的镜像,如果需要将镜像保存,可以使用我们之前提到的导出导入命令(save -o ; load -i)。导出的包,然后再传给其他dockerHost,这种方法也是可行的。
但往往在公司会有大量的镜像,而且不仅仅是单台的dockerHost。我们迫切需要有一个本地的共用的仓库,来实现多台dockerHost直接拉取镜像而不用手动的将镜像穿来穿去,之前的DockerHub可以帮助我们解决这个问题,当然前提需要申请一个DockerHub的账号,创建一个仓库。但这种方法需要消耗我们的带宽,因为是通过网络传输,既然是网络传输,就需要消耗一定的时间。今天说的Registry仓库,是通过一个容器给我们提供的服务,是比较简易的私有仓库,以后在企业中还会有功能更加完善的Harbor仓库。
创建私有仓库
registry是官方提供的工具,可以用于构建私有的镜像仓库。你可以通过获
取官方 registry 镜像来运行。
1)用docker容器运行registry私有仓库服务。
//下载需要的镜像
[root@docker01 ~]# docker pull registry:2
PS:注意,这里我们使用的是registry:2版本,还有一个registry镜像,这两个没有什么大的区别。registry: 是用Python语言写的,registry:2使用Go语言写的,理论上来说,registry:2这个版本运行更快些。
2)运行私有仓库服务
[root@docker01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
-p: 端口映射。 宿主机端口:容器暴露的端口。
-p 80 : 如果-p选项后边只写了一个端口,那么这个端口是指容器暴露的端口号随机映射到宿主机(32768开始…)
-P :后边没有接任何的端口参数。那么它会把容器暴露的端口,全部随机的映射到宿主机。
-v: 挂载目录。 宿主机的目录:容器内的目录。
3) 镜像重命名
//因为我们使用的私有镜像,在上传或下载的时候,都需要我们将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。
格式为 docker tag IMAGE[:TAG]
[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
[root@docker01 ~]# docker tag registry:2 192.168.1.20:5000/registry
4)编辑docker配置文件
因为docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口, 这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。 如果没做这一步,会报HTTPS的错。
//编辑docker的配置文件,指定私有仓库地址
[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service
修改:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20:5000
修改完要重启
[root@docker01 ~]# systemctl daemon-reload
[root@docker01 ~]# systemctl restart docker
5)上传私有仓库
[root@docker01 ~]# docker push 192.168.1.20:5000/registry:latest
这里注意,既然是私有仓库,肯定是要考虑多台DockerHost共用的情况,如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后,daemon-reload ,restart docker服务。
//查看有哪些镜像
[root@docker01 ~]# curl -XGET http://192.168.1.20:5000/v2/_catalog
-X/–request 指定什么命令
-G/–get 以get的方式来发送数据
-E/–cert cert[:passwd] 客户端证书文件和密码 (SSL)
-T/–upload-file 上传文件
[root@docker01 ~]# curl http://192.168.1.20:5000/v2/busybox/tags/list
{
"name":"mycentos","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-compse工具。
//从github上下载方法
[root@docker01 ~]# curl -L https://github.com/docker/compose/releases/download/1.25.0 /docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
//这里我准备好了tar包,直接解压即可
[root@docker01 ~]# tar -zxPf docker-compose.1.25.0.tar.gz -C /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/docker-compose
//查看版本号,并验证命令可用
[root@docker01 ~]# docker-compose -v
docker-compose version 1.25.0, build 0a186604
//下载依赖包
[root@docker01 ~]# 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/下
[root@docker01 ~]# tar -zxf harbor-offline-installer-v1.7.4.tgz -C /usr/local/
//修改配置文件,指定harbor主机
[root@docker01 harbor]# pwd
/usr/local/harbor
[root@docker01 harbor]# vim harbor.cfg
修改:
hostname = 192.168.1.20
这里我们将主机名直接改成我们的IP地址,其实也可以使用域名,如果使用域名需要在windows主机上修改hosts文件,地址为:C:\Windows\System32\drivers\etc,将域名与ip添加进去即可。
# Configuration file of Harbor
//hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或 localhost
hostname = 192.168.1.20
//访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on ui_url_protocol = http
//最大连接数
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
//关于日志切割的大小,可以是KB、MB、GB
log_rotate_size = 200M
//是否启用代理访问
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 = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
//启动Harbor后,管理员admin,UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
//认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是 db_auth,mysql数据库认证
auth_mode = db_auth
是否开启自注册
self_registration = on
//token有效时间,默认30分钟
token_expiration = 30
//用户创建项目权限控制,默认是everyone(所有人),也可以设置为 adminonly(只能管理员) project_creation_restriction = everyone
// 修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动,并且注意,harbor默认使用的是80端口,最好确认是否有冲突,或者也可以在docker-compose.yml中修改对应的端口
[root@docker01 harbor]# ./install.sh
查看和监控**
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe15165d428c goharbor/nginx-photon:v1.7.4 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx
9a7fe804b8c0 goharbor/harbor-portal:v1.7.4 "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes (healthy) 80/tcp harbor-portal
bdb281280efb goharbor/harbor-jobservice:v1.7.4 "/harbor/start.sh" 3 minutes ago Up 3 minutes harbor-jobservice
61ed86617085 goharbor/harbor-core:v1.7.4 "/harbor/start.sh" 3 minutes ago Up 3 minutes (healthy) harbor-core
b92102e4d41d goharbor/redis-photon:v1.7.4 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp redis
f32429ed639c goharbor/harbor-adminserver:v1.7.4 "/harbor/start.sh" 3 minutes ago Up 3 minutes (healthy) harbor-adminserver
c7f21c38122d goharbor/registry-photon:v2.6.2-v1.7.4 "/entrypoint.sh /etc…" 3 minutes ago Up 3 minutes (healthy) 5000/tcp registry
f3aedb9740de goharbor/harbor-db:v1.7.4 "/entrypoint.sh post…" 3 minutes ago Up 3 minutes (healthy) 5432/tcp harbor-db
5f1012494f46 goharbor/harbor-registryctl:v1.7.4 "/harbor/start.sh" 3 minutes ago Up 3 minutes (healthy) registryctl
dae5e4ff55e1 goharbor/harbor-log:v1.7.4 "/bin/sh -c /usr/loc…" 3 minutes ago Up 3 minutes (healthy) 127.0.0.1:1514->10514/tcp
//docker-compose这个命令可以管理harbor服务,不过需要注意的是想使用以下命令,必须是和docker-compose.yml这个文件在同一个目录下,其实就是通过管理这个文件而管理harbor仓库的.
启动harbor: docker-compose start
停止harbor: docker-compose stop
重启harbor: docker-compose restart
harbor使用
启动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,供日
后进行分析。
//这时我们可以通过浏览器访问了。
默认用户名:admin
密码:Harbor12345
//新建仓库
docker client的设置
1、更改docker配置文件
//同理因为docker不支持https的原因,我们也需要将docker的配置文件进行更改。
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20
...
[root@docker02 ~]# systemctl daemon-reload
[root@docker02 ~]# systemctl restart docker
2、客户端登陆
[root@docker02 ~]# docker login -u admin -p Harbor12345 192.168.1.20
Login Succeeded
3、上传私有镜像
[root@docker02 ~]# docker tag nginx:latest 192.168.1.20/bdqn/nginx:v1.0
[root@docker02 ~]# docker push 192.168.1.20/bdqn/nginx:v1.0
The push refers to repository [192.168.1.20/bdqn/nginx]
85fcec7ef3ef: Pushed
3e5288f7a70f: Pushed
56bc37de0858: Pushed
1c91bf69a08b: Pushed
cb42413394c4: Pushed
v1.0: digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 size: 1362
//然后浏览器就可以查看到对应的镜像