因为网速和大中华局域网效果,使得咱们在DockerHub下载镜像的速度很慢,甚至一些国内的镜像仓库,也感受速度不是很好。因此,颇有必要在本地或者一个咱们访问很快速的地方(本身的云服务器)搭建一套镜像仓库。有了这样一个仓库,不只能够提升下载速度,并且能够增长咱们个性化定制的镜像,以备后续使用。这篇将介绍怎样搭建本地镜像。mysql
环境准备 环境:两个装有Docker的Ubuntu虚拟机sql
备注:也可使用一台直接在开发机器上安装私有仓库docker
此处咱们准备了两个虚拟机,分别都安装了Docker,其中132机器用做开发机,136机器用做registry私有仓库机器。环境准备好以后接下来咱们就开始搭建私有镜像仓库。json
搭建私有仓库安全
首先在136机器上下载registry镜像,这里我指定了tag为2bash
$ 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,读者大可没必要在乎了,基本上是淘汰了。网络
下载完以后咱们经过该镜像启动一个容器curl
$ docker run -d -p 5000:5000 registry:2
facbef4cddad45676efd27385deb0cc1d7bfef378bee07993b926de8c97c3abb
复制代码
默认状况下,会将仓库存放于容器的/tmp/registry目录下,这样若是容器被删除,则存放于容器中的镜像也会丢失,因此咱们通常状况下会指定本地一个目录挂载到容器的/tmp/registry下,以下:tcp
$ 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
复制代码
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
复制代码