使用docker私有仓库

1,342 阅读2分钟

由于网速和大中华局域网效果,使得我们在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