1.7 镜像仓库

前面我们介绍了镜像的制作,知道了镜像是怎么生成的。但是镜像制作好后,要怎么管理呢?它们存放在哪里呢?通过本节的讲解,大家就会清楚了。

先来看如图1-46所示的Docker架构。

图1-46 Docker架构图

注意右边有个Registry,这就是镜像仓库。镜像仓库在Docker架构里是很重要的一部分。镜像会因为业务的需要以不同类型的方式存在。所以,这么多类型的镜像如果没有一个很好的机制去管理,肯定会乱套。Docker镜像需要标准化管理,Registry就是负责这个功能的模块。

Docker仓库分为共有仓库和私有仓库,接下来我们分别介绍这两种仓库的功能和特点。

1.7.1 共有仓库

Docker Hub就是共有镜像仓库,由Docker公司自己维护,上面有数以万计的镜像供用户下载和使用。接下来介绍共有镜像仓库的特点和使用方法。

1.共有仓库Docker Hub的特点

(1)官方、权威

Docker Hub是运营多年、用户口碑很好的镜像仓库。里面的镜像都是官方推出的,由Docker公司维护,所以自然也是权威的。一些比较流行的开源软件都会先在官方仓库发布。

(2)数量大、种类多

共有仓库经过多年运营,聚集了众多全世界容器爱好者以及相关公司制作的镜像。大家有最新、最好的镜像一般都会先在共有仓库里发布,所以共有仓库镜像数量大、种类多。比较流行的镜像在这里基本都能找到。

(3)稳定、可靠、干净

正因为Docker Hub的官方权威性,所以上面的镜像都是经得住考验的,稳定性和可靠性都有保证。

(4)仓库名称前没有命名空间

这是Docker Hub独有的特点,因为Docker Hub是镜像仓库的发源地,是所有镜像仓库的“根”,加上它是放在公网上的,所以仓库名称前面不存在命名空间。

2.共有仓库的使用方式

(1)命令方式

我们可以通过login、docker search、pull和push等命令操作Docker Hub服务。

一般运行docker login命令就默认登录Docker Hub官方仓库,当然也可以带一些参数,比如带上用户名和密码(一般不推荐)。


$ docker login -u 用户名 -p 密码

如果想登录其他仓库,只要在docker login命令后边加上仓库的地址名就可以了。


$ docker login registry.tencent.com
$ docker login localhost:8080

运行如下命令即可退出当前仓库。


$ docker logout

登录仓库后,我们就可以运行命令对镜像进行操作了,比如docker search加镜像名是搜索镜像的命令,docker pull是下载镜像的命令,docker push是上传镜像的命令。

(2)Web界面方式

用Web界面的方式也可以操作Docker Hub或者其他官方仓库,只要输入仓库地址、注册账号,即可登录镜像仓库,根据界面的提示进行操作。图1-47所示就是使用Web界面方式登录Docker Hub官网,在这里可以创建仓库、创建组织、浏览提供的镜像列表、构建镜像、共享镜像等。

图1-47 使用Web界面方式登录Docker Hub官网

(3)API方式

现在的平台架构都讲究REST风格,所以都提供给用户API接口,便于用户进行一些自动化或者二次开发的操作。表1-2所示是API接口分类,供读者参考。

表1-2 API接口分类

详细的API介绍见官方说明文档:https://docs.docker.com/registry/spec/api/

3.比较好用的共有仓库推荐

官方的Docker Hub仓库是首推的仓库站点,但是有时候访问国外的仓库比较慢,我们可以看看国内的一些Docker镜像仓库。这里向大家推荐几个比较好用的。

(1)腾讯镜像仓库

购买腾讯云的CVM就能免费使用腾讯的TKE容器服务,TKE容器产品里面有免费的镜像仓库。

(2)DaoCloud

DaoCloud是国内比较早的Docker Hub加速器提供商,注意加速器2.0需要使用DaoCloud自己的云服务器,官方称会继续支持加速器1.0。

网址:https://dashboard.daocloud.io/mirror

(3)阿里云Docker仓库

阿里云技术在国内推行得比较早,容器方面也是早有涉及,在国内也有很多人用它的镜像仓库,可以参考学习。

1.7.2 私有仓库

共有仓库的特点有很多,也非常好用。但是,共有仓库也有不能满足的地方,比如公司企业级的私有镜像,这些镜像涉及机密数据和软件,私密性比较强,就不太适合放在共有仓库里。另外,假如我们的服务器环境不允许上外网,那么也无法下载共有仓库的镜像。为了解决这两大问题,我们需要搭建私有仓库,存储自己的私有镜像。

1.私有仓库的特点

(1)私密性好、安全性高

这个不难理解,共有仓库放在公网,都是第三方维护的,所以无法保障镜像的私密性和安全性。如果是私有仓库,就可以与外网进行隔离,加上有些镜像涉及公司机密,还是放在自家的仓库里放心。

(2)访问速度快

私有仓库一般是放在公司内网的,不受外网访问的限制,可以保证快速访问。

(3)可自主控制、可维护性高

共有仓库终究是别人搭建的仓库,使用方式、管理方式都要按照别人设定的规则进行,当我们需要添加存储空间、做一些额外定制化功能的时候,就受到制约了。如果是自己搭建的仓库,自主性、可维护性都比较高。

2.私有仓库的搭建

如何搭建私有仓库呢?这时我们就要用到Docker提供的镜像分发工具Registry了。

Registry是Docker公司发布的一个用于打包、传输、存储和分发镜像的工具集,它是镜像仓库的核心。

接下来我们具体了解如何搭建私有仓库,其实很简单,几步操作即可完成。

(1)下载Registry镜像


$ docker pull registry

一般安装好Docker,就会有Registry,如果没有,才需要运行上面这条命令。Registry虽然是工具集,但是Docker也把它打包成镜像了,用docker pull命令即可下载Registry工具集。

(2)规划好镜像仓库服务的存储分配

因为镜像是占存储空间的,所以需要在服务器上预留一个路径专门存储镜像文件。一般我们会专门用一个服务器作为Docker的仓库。这里我们把/data/docker_images路径作为本地存储镜像的地址。在Registry镜像内部也要定义路径存储镜像:/var/lib/registry/images。最后我们映射这两个路径。

(3)启动Registry镜像,启动仓库服务

Registry就是一个镜像,所以只要运行docker run命令就能启动它,仓库里面所有的功能都通过这个镜像提供,不需要再做额外配置,因为Registry本身就是容器。


$ docker run -d --name private-registry \
 --restart=always -hostname \
localhost -p 5000:5000  -v /data/docker_images:/var/lib/registry/images registry:2

上面的代码乍一看好像比较复杂,其实仔细看也很好理解。private-registry是私有仓库的名字;--restart=always的意思是永久启动,不会关闭或被轻易删除;localhost是设置本地路径为仓库服务地址;5000:5000是给仓库设置的端口,一般都是5000端口,也可以设置成其他的,注意打开服务器里防火墙的端口;后面的路径是本地路径和容器内部路径的映射;最后标明使用Registry的版本,现在是版本2。

3.配置HTTPS,让仓库更安全

通过前面两步,私有仓库就搭建好了。我们可以运行docker push localhost:5000/test/centos:latest命令上传制作好的镜像。但是在实际生产环境中,直接暴露5000端口是不安全的,内网仓库还好,如果仓库要放到公网就更不安全了,所以我们需要设置HTTPS,增加仓库安全性。

设置HTTPS的方法有很多,结合OpenSSL和Nginx做反向代理即可。