前言
Docker仓库(Repository)是集中存放镜像的地方。
一个容易与之混淆的概念是注册服务器(Registry)。实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面又可以有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。
在使用docker一段时间后,我们会发现手头积累了大量的自定义镜像文件,这些文件通过公有仓库进行管理并不十分方便,此外有时候我们也只是希望内部用户之间进行分享。在这种情况下,就有必要搭建一个本地的私有仓库服务器。
和maven管理一样,docker不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库。使用私有仓库有许多有点:
- 节省网络带宽,针对每个镜像不要都去中央仓库里下载,只需要从私有仓库中下载即可;
- 提供镜像资源利用,针对公司内部开发,不能联网情况下,有一些使用到的镜像可以推送到本地的私有仓库中,以供内部开发人员便捷下载使用。
接下来,我们将尝试着在本地搭建docker的私有仓库。
1、环境准备
虚拟机 | IP地址 | 描述 |
master03(CentOS7.2) | 192.168.0.145 | 用途1:开发用机 用途2:作为docker私有仓库 |
环境准备好后,接下来我们就开始搭建docker私有镜像仓库。
2、搭建私有docker镜像仓库
- 首先,要确保我们已经在目标主机上安装好docker。
- 然后,在虚拟机上下载registry镜像:
[root@master03 /]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Image is up to date for registry:latest
- 下载完成后,我们通过该镜像启动一个容器。
docker run -d -p 5000:5000 registry
默认情况下,该命令将运行一个Registry应用的容器,并绑定到本地宿主机的5000端口。
一般情况下我们并不会使用上边的命令去启动registry容器,该命令会将仓库存放于容器/tmp/regitry目录下,这样如果容器被删除,则存放于容器中的镜像也将被删除。
- 接下来,我们将通过如下配置来指定本地一个目录挂载到容器的/tmp/registry下。
[root@master03 registry]# docker run -itd -v /opt/data/registry:/tmp/registry -p 5000:5000 --restart=always --name registry registry:latest
becb7857f5d96695d2d10ab4e87849c2faaa6516f89943ec90c79447299640dd
[root@master03 registry]#
参数说明:
- -itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
- -v:把宿主机的/opt/data/registry目录绑定到容器的/var/lib/registry目录(这个目录是registry容器中国存放镜像文件的目录),来实现数据的持久化;
- -p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
- --restart=always:这个是重启策略,假如这个容器异常退出就会自动重启容器;
- --name registry:创建容器命名为registry,可以随便命名;
- registry:latest:这个是刚pull下来的镜像;
测试一下镜像仓库中所有的镜像:
[root@master03 registry]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
可以看到仓库是空的,因为刚运行,里边没有任何镜像内容。
3、测试镜像仓库
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"]
}
【2】从docker公有仓库上下载在一个ubuntu镜像
【3】为源镜像打上标签v14.04
使用docker tag命令将这各源镜像标记为192.168.0145:5000/ubuntu:v14.04
命令格式:
docker tag IMAGE[:TAG] [REGISTORY/][USERNAME/]NAME[:TAG]
打完标签后:
[root@master03 registry]# docker tag ubuntu:14.04 192.168.0.145:5000/ubuntu:v14.04
[root@master03 registry]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.0.145:5000/ubuntu v14.04 2c5e00d77a67 2 months ago 188MB
ubuntu 14.04 2c5e00d77a67 2 months ago 188MB
registry latest f32a97de94e1 5 months ago 25.8MB
- ubuntu 这个是源镜像,即刚pull下来的镜像文件
- 192.168.0.145:5000/ubuntu:v14.04 这个是目标镜像,也就是registry私有镜像服务器的IP地址和端口;
【4】上传到镜像服务器/docker本地私有仓库
[root@master03 registry]# docker push 192.168.0.145:5000/ubuntu:v14.04
Error response from daemon: Get https://192.168.0.145:5000/v2/: http: server gave HTTP response to HTTPS client
[root@master03 registry]#
- 注意:上传时报错了,因为Docker从1.3.X之后默认docker registry使用的是https,所以当用docker pull/push命令下载、上传远程镜像时,如果远程docker registry是非https的时候就会报上面的错误。我们需要修改一下docker的镜像源文件配置:
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": [ "192.168.0.145:5000"]
}
添加本地私有镜像服务器的地址,然后重启docker服务。现在只要任意一台部署了docker服务,并在镜像源文件中配置了“ "insecure-registries": [ "192.168.0.145:5000"] ”这个私有仓库地址的主机就能够下载这个目标镜像了。
- 再次上传目标镜像:
这次终于上传成功。
【5】测试下载镜像
镜像已经能够成功上传,接下来我们来测试一下从reigistry服务器上下载刚才上传的镜像。
- 先删除本地宿主机上的192.168.0.145:5000/ubuntu:v14.04这个镜像。
这步删除镜像操作要谨慎,依次把关联镜像全部删除完了。
- 然后,从registry服务器上下载我们的目标镜像192.168.0.145:5000/ubuntu:v14.04。
可以看到,目标镜像已经成功地从本地私有仓库中拉下来了。
下载后,我们还可以添加一个更加通用的标签ubuntu:v14.04.
docker tag 192.168.0.145:5000/ubuntu:v14.04 ubuntu:v14.04
四、列出所有镜像
- 列出本地私有仓库的所有镜像:
[root@master03 registry]# curl http://192.168.0.145:5000/v2/_catalog
{"repositories":["ubuntu"]}
可以看到,目前私有仓库中只有ubuntu一个镜像。
- 列出ubuntu镜像有哪些tag标签:
[root@master03 registry]# curl http://192.168.0.145:5000/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["v14.04"]}
可以知道,目前我们的本地私有仓库中存有一个标签为v14.04的ubuntu镜像。