1、理解概念。
2、学会搭建使用方法。
1、为什么用它?
公司服务器大部分都是私网,为了安全和方便可以搭建私有仓库,而不用完全手动的去导入导出镜像,因为是局域网拉取速度非常快,可以节省带宽和大量时间。 有时候使用 Docker Hub 这样的公共仓库可能不方便(隐私文件),用户可以创建一个本地仓库供私人使用。
2、是什么?
docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。
一般情况下,不论是通过commit容器得到的镜像,或者是用dockerfile 制作的镜像,如果需要将镜像保存,可以使用我们之前提到的导出导入命令(save -o ; load -i)。导出的包,然后再传给其他dockerHost,这种方法也是可行的。
但往往在公司会有大量的镜像,而且不仅仅是单台的dockerHost。我们迫切需要有一个本地的共用的仓库,来实现多台dockerHost直接拉取镜像而不用手动的将镜像传来传去,之前的DockerHub可以帮助我们解决这个问题,当然前提需要申请一个DockerHub的账号,创建一个仓库。但这种方法需要消耗我们的带宽,因为是通过网络传输,既然是网络传输,就需要消耗一定的时间。
Registry仓库,是通过一个容器给我们提供的服务,是比较简易的私有仓库,以后在企业中还会有功能更加完善的Harbor仓库。
registry是官方提供的工具,可以用于构建私有的镜像仓库。你可以通过获取官方 registry 镜像来运行。
注意:我们使用的是registry:2版本,还有一个registry镜像,这两个没有什么大的区别。registry: 是用Python语言写的,registry:2使用Go 语言写的,理论上来说,registry:2这个版本运行更快些。
搭建基于registry的私有仓库
1)用docker容器运行registry私有仓库服务。
注:registry是官方打包好的服务,端口为5000,就像其他虚拟出来的web服务一样
2)运行私有仓库服务
创建数据卷目录:
mkdir /registry
执行命令运行容器:
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.100.205:5000/nginx
4)编辑docker配置文件(因为默认是拉取docker官方的镜像,需要重新指定)
#初次上传命令:
docker push 192.168.100.205:5000/nginx #上传私有仓库会报错
#The push refers to repository [192.168.100.205:5000/nginx]
#Get https://192.168.100.205: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.100.205:5000
#修改完成之后重新加载docker和重启
systemctl daemon-reload
systemctl restart docker
#再次上传测试
docker push 192.168.100.205:5000/nginx
5)其他dockerhost上传私有仓库
这里注意,既然是私有仓库,肯定是要考虑多台DockerHost共用的情况, 如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后, daemon-reload ,restart docker服务。
vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.100.205:5000
systemctl daemon-reload
systemctl restart docker.service
docker info
看到私仓ip即成功