一、docker镜像仓库
docker镜像仓库(repository)是集中存放镜像的地方。方便与后续的镜像拉取与上传,便于对镜像的集中管理。镜像仓库一般可分为Docker Hub公共中央仓库和个人或者公司使用的私有仓库,私有仓库如果是个人使用则可以直接使用docker自带的registry私有仓库,如果是企业级使用则可以搭建Harbor镜像私有仓库。
二、Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000的镜像。大部分需求,都可以通过在Docker Hub 中直接下载镜像来实现。
docker hub的网址为:Docker Hub
可以通过执行docker login 命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
用户无需登录即可通过docker search 命令来查找官方仓库中的镜像,并利用dockerpull 命令来将它下载到本地。
三、私有仓库
有时候Docker Hub可能因为网络或者安全等原因,并不能直接使用,这时用户就可以创建一个本地仓库供个人使用:
下面简要介绍其安装部署以及使用过程:
# vim /etc/docker/daemon.json
# cat /etc/docker/daemon.json
{"insecure-registries" : ["192.168.4.1:5000"]
}# systemctl restart docker
在安装了Docker 后,可以通过获取官方 registry 镜像来运行
# docker run -id -p 5000:5000 registry
创建好私有仓库之后,就可以使用docker tag 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。
例如私有仓库地址为192.168.4.1:5000
# docker tag busybox:latest 192.168.4.1:5000/busybox
# docker tag myos:test 192.168.4.1:5000/myos_test
# docker tag httpd:sshd 192.168.4.1:5000/httpd_sshd
使用docker push 上传标记的镜像
# docker push 192.168.4.1:5000/busybox
The push refers to a repository [192.168.4.1:5000/busybox]
779f37a09c89: Pushed
latest: digest: sha256:4efd5033df5ddf3cff692505ae2a8e6d492014dbadd2f7281ccda9f744d41901 size: 527
# docker push 192.168.4.1:5000/myos_test
The push refers to a repository [192.168.4.1:5000/myos_test]
8202e413fce3: Pushed
0d281e60bd3c: Pushed
b41d6696cce4: Pushed
0aeb287b1ba9: Pushed
latest: digest: sha256:860417d703ab3dce337a7f69ccaa417b67842729114d9f34f3760525e4e8a604 size: 1155
# docker push 192.168.4.1:5000/httpd_sshd
The push refers to a repository [192.168.4.1:5000/httpd_sshd]
67de9bddfeb9: Pushed
7ed802e5e1cf: Pushed
7fa005843c99: Pushed
c68f5228f676: Pushed
0b433cb3a604: Pushed
1e0fef9107ab: Pushed
8202e413fce3: Mounted from myos_test
0d281e60bd3c: Mounted from myos_test
b41d6696cce4: Mounted from myos_test
0aeb287b1ba9: Mounted from myos_test
latest: digest: sha256:5ac74ff037126e46123abe22ce81b56879e9b916e191809303b9efedacf6d85d size: 2403
用 curl 查看仓库中的镜像。
# curl -XGET "http://192.168.4.1:5000/v2/_catalog"
{"repositories":["busybox","httpd_sshd","myos_test"]}
# curl -XGET "http://192.168.4.1:5000/v2/busybox/tags/list"
{"name":"busybox","tags":["latest"]}
# curl -XGET "http://192.168.4.1:5000/v2/httpd_sshd/tags/list"
{"name":"httpd_sshd","tags":["latest"]}
使用启动仓库中的镜像
# docker run -it 192.168.4.1:5000/busybox
四、Harbor企业级镜像仓库
docker registry可能比较适合个人使用,针对企业级别,可能就不那么适用了,这时就可以使用企业级别的harbor镜像仓库:
harbor
harbor意为港湾, 很贴合它的作用
github地址: https://github.com/goharbor/harbor
记得以前是在vmware下, 现在地址转到goharbor下了
官方的定义是企业级私有Registry服务器, 实际内部也是依靠docker registry
那么它与registry相比, 一定提供了很多企业级的特性, 例如:
- 提供良好的Web界面
- 提供良好的安全机制, 包括角色, 权限控制, 日志等
- 支持水平扩展
- 传输优化, 因为镜像的分层机制, 所以每次传输并非全量, 从而提升速度
搭建
环境准备
在安装harbor之前, 需要docker环境, 除此还需要docker-compose, 不说了
安装Harbor
在github release中查看需要安装的版本, 这里我用当前最新的v1.7.5
文档中有两种安装方式: offline和online, 也就是在线和离线
- online: 在线方式会下载一个很小的tar包, 里面只有
docker-compose.yml
和启动脚本, 会在启动安装时在线拉取镜像 - offline: 下载一个大概500多M的tar包, 里面包括了镜像文件, 所以安装时会快
我的浏览器设置了代理, 所以选择offline的离线包, 再上传放到docker环境的主机上
大致看下解压后的目录
[root@localhost opt]# tree harbor -CL 2
harbor
├── common
│ ├── config
│ └── templates
├── docker-compose.chartmuseum.yml
├── docker-compose.clair.yml
├── docker-compose.notary.yml
├── docker-compose.yml
├── harbor.cfg
├── harbor.v1.7.5.tar.gz
├── install.sh
├── LICENSE
├── open_source_license
└── prepare
接下来对harbor.cfg
几个配置做修改, 我修改了如下:
# 注释中也说了, 不要设置成localhost和127.0.0.1阿
hostname = hub.thank.com# 邮箱相关的设置
email_server = smtp.163.com
email_server_port = 25
email_username = coderthank@163.com
email_password = ******
email_from = thank <coderthank@163.com># 修改admin默认的登录密码
harbor_admin_password = 123123
更多详细的设置可参考官方文档和配置文件的注释
然后执行install.sh
即可
[Step 0]: checking installation environment ...
Note: docker version: 1.13.1
Note: docker-compose version: 1.16.1
[Step 1]: loading Harbor images ...
...略
[Step 2]: preparing environment ...
...略
[Step 3]: checking existing instance of Harbor ...[Step 4]: starting Harbor ...
...略
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://hub.thank.com.
For more details, please visit https://github.com/goharbor/harbor .
从Step可以看到这个一键脚本帮我们做了傻瓜式的安装
docker-compose帮我们完成了Harbor所需要的多个容器服务
来看一眼
-
镜像
[root@localhost harbor]# docker images --format "table {{.Repository}}\t{{.Size}}" | grep harbor goharbor/chartmuseum-photon 113 MB goharbor/harbor-migrator 679 MB goharbor/redis-photon 101 MB goharbor/clair-photon 164 MB goharbor/notary-server-photon 135 MB goharbor/notary-signer-photon 132 MB goharbor/harbor-registryctl 102 MB goharbor/registry-photon 86.7 MB goharbor/nginx-photon 35.9 MB goharbor/harbor-log 81.4 MB goharbor/harbor-jobservice 84.1 MB goharbor/harbor-core 95.6 MB goharbor/harbor-portal 40.6 MB goharbor/harbor-adminserver 72.3 MB goharbor/harbor-db 138 MB
-
容器
[root@localhost harbor]# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}" | grep harbor c517af1cff6a goharbor/nginx-photon:v1.7.5 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp 7bb6eac57291 goharbor/harbor-jobservice:v1.7.5 723cb4c96a0d goharbor/harbor-portal:v1.7.5 80/tcp 1425f64756d1 goharbor/harbor-core:v1.7.5 f19a00ce693b goharbor/registry-photon:v2.6.2-v1.7.5 5000/tcp 4d3f0f8929c7 goharbor/harbor-adminserver:v1.7.5 23df470d2b0d goharbor/harbor-db:v1.7.5 5432/tcp e7d6d1cc3b1b goharbor/harbor-registryctl:v1.7.5 6e2912ec566e goharbor/redis-photon:v1.7.5 6379/tcp ee8685192041 goharbor/harbor-log:v1.7.5 127.0.0.1:1514->10514/tcp
界面使用,因为刚才在配置文件赔了一个假域名, 这里我修改下hosts
192.168.118.143 hub.thank.com
访问http://hub.thank.com
, 可以看到Harbor的登录页面
直接访问IP也可, 默认80端口
登录后的主页面
harbor主页
测试: 创建用户thank
, 创建项目cloudlink-base
和项目中添加用户thank
, 角色为项目管理员
其它功能就不做介绍了, 中文简体点一点就好啦
运维管理
从前面的一键启动脚本也能看出, 我们可以用docker-compose统一完成harbor服务的运维管理
- 停止:
docker-comose stop
- etc...
image管理
这里测试一下镜像的拉取和上传
方法跟其它仓库的没什么不一样, 不说了
# login
docker login hub.thank.com
# image tag
docker tag redis:latest hub.thank.com/cloudlink-base/thank-redis:latest
# push
docker push hub.thank.com/cloudlink-base/thank-redis:latest
# pull
docker pull
https问题
刚才在配置文件harbor.cfg
中可以看到默认配置了http协议访问
这里在其它主机上传镜像时, docker客户端默认都是https访问Harbor, 所以会出现connection refused
的错误
有两种解决办法:
- 前面提到过, 在
/etc/docker/daemon.json
加入
{"insecure-registries" : ["hub.thank.com"]
}
- 修改harbor配置文件为https方式:
ui_url_protocol = https
, 除此之外还需要配置证书
不是很复杂, 可以参照搭建Harbor企业级docker仓库#五、Harbor配置TLS证书
参考文档1 https://blog.51cto.com/u_13558754/2064405
参考文档2 https://www.jianshu.com/p/a9bc6825650f