由于网速和大中华局域网效果,使得我们在DockerHub下载镜像的速度很慢,甚至一些国内的镜像仓库,也感觉速度不是很好。所以,很有必要在本地或者一个我们访问很快速的地方(自己的云服务器)搭建一套镜像仓库。有了这样一个仓库,不仅可以提高下载速度,而且可以增加我们个性化定制的镜像,以备后续使用。这篇将介绍怎样搭建本地镜像。
1、运行docker仓库容器
环境准备 环境:两个装有Docker的Ubuntu虚拟机
- 虚拟机一:192.168.112.132 用户开发机
- 虚拟机二:192.168.112.136 用作私有仓库
备注:也可以使用一台直接在开发机器上安装私有仓库
此处我们准备了两个虚拟机,分别都安装了Docker,其中132机器用作开发机,136机器用作registry私有仓库机器。环境准备好之后接下来我们就开始搭建私有镜像仓库。
搭建私有仓库
首先在136机器上下载registry镜像,这里我指定了tag为2
$ docker pull registry:2
2: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:2
docker.io/library/registry:2
此过程会持续几分钟,视网络状况而定,请读者耐心等候。
注意:笔者在pull的时候,指定了TAG,即为使用v2版本的registry,对于v1版本的registry,读者大可不必在意了,基本上是淘汰了。
下载完之后我们通过该镜像启动一个容器
$ docker run -d -p 5000:5000 registry:2
facbef4cddad45676efd27385deb0cc1d7bfef378bee07993b926de8c97c3abb
默认情况下,会将仓库存放于容器的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/tmp/registry下,如下:
$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry:2
这是一条典型的run命令,不出意外的话,Registry就在5000端口启动了。使用下面命令查看
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
facbef4cddad registry:2 "/entrypoint.sh /etc…" 53 seconds ago Up 50 seconds 0.0.0.0:5000->5000/tcp exciting_kalam
可以看到我们启动了一个容器,地址为:192.168.112.136:5000
接下来我们就要操作把一个本地镜像push到私有仓库中 在132机器下pull一个比较小的镜像来测试(此处使用的是busybox)
$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:9f1003c480699be56815db0f8146ad2e22efea85129b5b5983d0e0fb52d9ab70
Status: Image is up to date for busybox:latest
docker.io/library/busybox:latest
接下来修改一下该镜像的tag
$ docker tag busybox 192.168.112.136:5000/busybox
查看一下
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress <none> 57d9b2fca364 6 days ago 501MB
mysql <none> 2151acc12881 6 days ago 445MB
192.168.112.136:5000/busybox latest db8ee88ad75f 10 days ago 1.22MB
busybox latest db8ee88ad75f 10 days ago 1.22MB
接下来把打了tag的镜像上传到私服
$ docker push 192.168.112.136:5000/busybox
The push refers to repository [127.0.0.1:5000/busybox]
0d315111b484: Pushed
latest: digest: sha256:895ab622e92e18d6b461d671081757af7dbaa3b00e3e28e12505af7817f73649 size: 527
2、修改通信方式为http
Registry官方镜像为了保证安全,缺省使用https进行通信,毕竟在生产环境中如果使用了http,是很容易被中间人攻击的。 测试环境中我们可以将通信方式修改为http,生产环境强烈不建议这样做。 修改/etc/docker/daemon.json文件,没有则手动创建,在这个文件添加如下内容:
{
"insecure-registries" : ["192.168.132.131:5000"]
}
重启docker服务
$ systemctl daemon-reload
$ systemctl restart docker
获取私有仓库列表
$ curl -XGET http://192.168.112.136:5000/v2/_catalog
# 获取httpd镜像列表
$ curl -XGET http://192.168.112.136:5000/v2/httpd/tags/list