docker入门教程九:docker仓库与搭建方法

仓库分为2个类型,跟游戏一样,分为官方的以及非官方的,比较官方的名称是叫docker hub以及私有仓库。docker hub在之前的文章有介绍过,在此省过。而私有仓库的搭建方法主要有docker-registry以及harbor。

docker-registry

docker-registry 是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。

安装

docker-registry其实就是一个镜像,直接docker run即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
[DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the docker.io registry NOW to avoid future disruption.
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:db8e07b1da92e1774458798a018512d71d869887d80b13cf126acda20122e41e
Status: Downloaded newer image for registry:latest
8f964fb3ede031f22a3113c8c668a3703d09801e2d904812e16d7389a477ce8d
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f964fb3ede0 registry "/entrypoint.sh /etc?? 14 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp registry

推送镜像

安装完成之后,就可以推送了,但由于docker push时默认是上传到https://index.docker.io/v1/,需要先修改一下tag才可以推送至本机的私有仓库

1
2
3
4
5
6
7
root@localhost ~]# docker tag busybox:latest localhost:5000/busybox
[root@localhost ~]# docker push localhost:5000/busybox
The push refers to repository [localhost:5000/busybox]
6c0ea40aef9d: Pushed
latest: digest: sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808 size: 527
[root@localhost ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["busybox"]}

使用curl就可以查看仓库中的镜像。这里可以看到 {"repositories":["busybox"]},表明镜像已经被成功上传了。

网络共享

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.137.66:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。如下:

1
2
3
4
[root@localhost ~]# docker tag alpine:latest 192.168.137.66:5000/alpine
[root@localhost ~]# docker push 192.168.137.66:5000/alpine
The push refers to repository [192.168.137.66:5000/alpine]
Get https://192.168.137.66:5000/v2/: http: server gave HTTP response to HTTPS client

报错信息已经提示了,默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的insecure-registries配置选项来取消这个限制。

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": ["192.168.137.66:5000"]
}
[root@localhost ~]# systemctl restart docker.service
[root@localhost ~]# docker push 192.168.137.66:5000/alpine
The push refers to repository [192.168.137.66:5000/alpine]
03901b4a2ea8: Pushed
latest: digest: sha256:acd3ca9941a85e8ed16515bfc5328e4e2f8c128caa72959a58a127b7801ee01f size: 528

私有仓库也是支持https的,配置方法:https://yeasy.gitbooks.io/docker_practice/content/repository/registry_auth.html

harbor

官方的docker-registry由于没有比较完善的可视化界面,在生产环境下如果要搭建私有仓库,这时就需要harbor了。

简介

VMware公司开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服务。它以Docker公司开源的registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文,对广大中国用户是一个好消息。

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,供日后进行分析。

部署

目前harbor已经开源在 github 上,在 https://github.com/goharbor/harbor/releases 下载最新的release版本,目前最新版本是 v1.9.0 。harbor提供了在线和离线两种安装方式,由于离线版本有500多M,对于国内网速就是龟速了,如果机器能通外网,还是选择在线安装版,在安装时,会自动下载很多镜像,但我们有经常加速了,所以就不需要担心速度的事情。

在安装之前,建议先阅读: Installation & Configuration Guide 官方文档。

下载好 harbor离线包 之后,直接解压,修改harbor.yml。主要修改了hostname以及harbor_admin_password,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost ~]# cat harbor/harbor.yml |grep -v "#" |grep -v '^$'
hostname: 192.168.137.66
http:
port: 80
harbor_admin_password: xxx
database:
password: root123
max_idle_conns: 50
max_open_conns: 100
data_volume: /data
clair:
updaters_interval: 12
jobservice:
max_job_workers: 10
notification:
webhook_job_max_retry: 10
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 1.9.0
proxy:
http_proxy:
https_proxy:
no_proxy: 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair
components:
- core
- jobservice
- clair

修改完成之后,直接 sh install.sh ,稍等10分钟左右,就可以部署完成,这其中的时间,基本上都是去下载镜像。如下,会运行10个镜像。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost harbor]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5eaf82738f20 goharbor/nginx-photon:v1.9.0 "nginx -g 'daemon of?? 4 hours ago Up 4 hours (healthy) 0.0.0.0:80->8080/tcp nginx
8962976e71b3 goharbor/harbor-jobservice:v1.9.0 "/harbor/harbor_jobs?? 4 hours ago Up 4 hours (healthy) harbor-jobservice
9472d8e20131 goharbor/harbor-core:v1.9.0 "/harbor/harbor_core" 4 hours ago Up 4 hours (healthy) harbor-core
cb8b2d091029 goharbor/harbor-registryctl:v1.9.0 "/harbor/start.sh" 4 hours ago Up 4 hours (healthy) registryctl
2f372e044673 goharbor/harbor-portal:v1.9.0 "nginx -g 'daemon of?? 4 hours ago Up 4 hours (healthy) 8080/tcp harbor-portal
f9ff9cfc58cf goharbor/redis-photon:v1.9.0 "redis-server /etc/r?? 4 hours ago Up 4 hours (healthy) 6379/tcp redis
fcc76b84ff2b goharbor/harbor-db:v1.9.0 "/docker-entrypoint.?? 4 hours ago Up 4 hours (healthy) 5432/tcp harbor-db
ee76006a58dc goharbor/registry-photon:v2.7.1-patch-2819-v1.9.0 "/entrypoint.sh /etc?? 4 hours ago Up 4 hours (healthy) 5000/tcp registry
8821283e41f4 goharbor/harbor-log:v1.9.0 "/bin/sh -c /usr/loc?? 4 hours ago Up 4 hours (healthy) 127.0.0.1:1514->10514/tcp harbor-log

直接访问 http://192.168.137.66 即可以访问了,再进行登陆,账号为admin,密码为上面设置的harbor_admin_password

这样就完成了搭建,很简单吧~

推送镜像

与docker-registry一样,需要设置insecure-registries参数,设置的方法请参考上文。同样,也需要修改tag,但由于使用了密码,所以需要先登陆才能推送。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# docker tag busybox:latest 192.168.137.66/library/busybox:latest
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.137.66/library/busybox latest 19485c79a9bb 4 weeks ago 1.22MB
busybox latest 19485c79a9bb 4 weeks ago 1.22MB

[root@localhost ~]# docker login 192.168.137.66 -u admin -p admin123
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@localhost ~]# docker push 192.168.137.66/library/busybox:latest
The push refers to repository [192.168.137.66/library/busybox]
6c0ea40aef9d: Pushed
latest: digest: sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808 size: 527

这样在harbor也是可以看到这个镜像了。

参考链接

CentOS部署Harbor镜像仓库

使用registry搭建Docker私有仓库

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/k8s/docker-registry.html
  • 本文主题: docker入门教程九:docker仓库与搭建方法
  • 版权声明: 本博客所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%