DaoCloud 宣布 Docker Hub Mirror 服务永久免费
| 2015-03-20 07:07 评论: 9 收藏: 2 分享: 30
2014年末,DaoCloud博客发布了《玩转Docker镜像》一文,以非常低调的方式宣布了Docker Hub Mirror服务的正式上线。在国内特殊网络环境下,Mirror服务显著加快了Docker Image的下载速度。一转眼,3个月过去了,在没有任何大规模推广宣传的情况下,Mirror服务用户已经达到数千人,各类Docker Image下载总量超过了5万。
今天,我们正式宣布,由DaoCloud运维的Docker Hub Mirror服务,永久免费!
什么是Docker Hub Mirror?
根据Docker的官方文档,Mirror的定义是:
Such a registry is provided by a third-party hosting infrastructure but is targeted at their customers only. Some mechanism ensures that public images are pulled from a sponsor registry to the mirror registry, to make sure that the customers of the third-party provider can docker pull those images locally.
Mirror是Docker Registry的一种特殊类型,它起到了类似代理服务器的缓存角色,在用户和Docker Hub之间做Image的缓存。 这个功能的设计目的是为了企业客户访问Docker Hub时降低网络开销,然而在中国这个巨大的局域网环境中,Mirror恰恰可以作为提升墙内下载速度的一种手段。
Mirror跟Private Registry有本质区别。Private Registry是开发者或者企业自建的Image存储库,通常用来保存企业内部的Docker Image,用于内部开发流程和产品的发布、版本控制。Mirror是一种代理中转服务,我们提供的Mirror服务,直接对接Docker Hub的官方Registry,Docker Hub上有数以十万计的各类Docker Image。在使用Private Registry时,需要在Docker Pull,或Dockerfile中直接键入Private Registry的地址,通常这样会导致跟Private Registry的绑定,缺少灵活性。使用Mirror服务,只需要在Docker Daemon的配置文件中加入Mirror参数,即可在全局范围内透明的访问官方的Docker Hub,避免了对Dockerfile Image引用来源的修改。
Mirror服务后台架构实现
Mirror是Docker的官方机制,它是Registry的一种特殊类型,在部署了Registry之后,需要开启Mirror模式并做一定的配置。具体的流程如下:
准备工作
- 在公有云环境部署Mirror Registry,并优化存储和网络访问(后文会详述)
- 在客户端,修改Docker的配置文件,添加registry-mirror参数(Mirror控制台中有详细的配置步骤)
Docker Hub由Index和Registry构成,Index保存Image Layer的hash和关联关系等元数据(Metadata),Registry用于存储Image Layer的实际二进制数据。在客户端没有配置registry-mirror参数的情况下,每一次docker pull,客户端都会先连接Index获取元数据,然后再连接Registry获取实际的Image文件。由于Docker Hub的Index节点和Regsitry都部署国外,国内用户访问,经常遭遇连接超时或中断的情况,下载速度也极其缓慢。在启用了Mirror之后,访问流程如下:
- 客户端的Docker Daemon连接Index获取Metadata,这一部分的数据量极小,直连国外的速度可以忍受
- 根据Metadata的信息,Docker Daemon与Mirror服务器建立连接。如果pull的Image在Mirror上已经有缓存,就直接在Mirror上返回地址并下载
- 如果Image在Mirror并无缓存,Mirror会与Docker Hub Registry建立连接,下载Image,提供给用户的同时,在本地缓存
- Mirror下载Docker Hub Image采用stream的方式,即可以一边下载,一边提供给客户端的Docker Daemon,不必等Image完全下载完
通过以上的描述,可以发现,对于常用的Image,Mirror缓存命中率会非常高,如Ubuntu等基础Image,这会极大提高下载速度。同时,Docker Image采用分层的结构,即使Image被更新,也只是下载最新一层非常少的增量数据。
Mirror服务亦可以通过网络优化,加速对远端Docker Hub Registry的访问速度,如采用高速的商业VPN建立从Mirror到Docker Hub Registry的访问。通过七牛等云存储和CDN分发网络,会进一步提高国内客户端的下载速度。
Mirror服务云端部署架构
下图是DaoCloud在搭建Mirror服务时,采用的架构。
Mirror_Arch我们选择了UCloud和七牛云存储。这样的架构是基于以下的几个考虑:
- 我们的Mirror服务主节点位于UCloud北京BGP机房。BGP机房网络上行下行的速度都非常快,有助于获得稳定高速的对外访问带宽,在Docker Hub Regsitry下载Image,获得不错的速度。
- 我们扩展了Mirror的Registry Disk Driver,使它可以支持UCloud的UDisk服务。
- BGP机房的云主机需要绑定外网IP,并且是根据带宽收费。提供类似Image下载服务,开销巨大。因此我们把下载缓存完成后的静态Image文件,定期同步到七牛云,既降低了带宽成本,同时也享受到了CDN的加速。我们通过代码检测需要下载的Image Layer是否在七牛有保存,如果有,就把访问重定向到七牛的URL,如果没有,就从UCloud的UDisk 直接下载。
代码如下:
Mirror服务线上数据统计
Mirror服务上线至今,我们已经积累了数以千计的注册用户,在UDisk和七牛使用了超过100个GB的Image缓存,每月的下载API调用达到了3-4万次,网络流量峰值曾突破10个GB,平均下载速度超过了1MBps,下载速度峰值曾经达到过8MBps。下图是我们在七牛控制台的统计数据截图:
写在最后
作为Docker技术的坚决拥护者,我们深刻理解Docker Hub对每一个程序员的重要性,也不遗余力解决国内网络访问的速度问题。
DaoCloud将坚持提供Docker Hub Mirror服务,我们承诺永久免费。
借此文,也感谢UCloud和七牛云存储,感谢他们在Mirror服务搭建和运维过程中为DaoCloud提供的支持和帮助。
还没体验过Mirror服务?赶紧注册:https://www.daocloud.io/account/signup