使用Azure云存储构建高速 Docker registry

使用Docker来构建应用程序最常见的操作就是 docker run 或者 docker pull了,但是由于众所周知的原因,在国内想要高速稳定的获取docker hub上面的资源并不是件容易的事情,虽然国内的一些docker社区也提供了所谓的加速器,但是实测结果并不理想。今天这篇文章就给大家介绍一下怎么借助Azure Storage来搭建一个高速的私有 Docker Hub (Registiry)。

一图解千言,基本上一看你就明白了。我们利用Docker Registry 提供的 Azure Storage 存储模式,将2个不同的registry 容器连接到同一个blob存储上,其中一个registry容器运行在Azure香港的数据中心,另外一个运行在我本地docker-machine中。需要docker pull的时候,我们使用香港的容器进行操作,并push到本地的registry中;这个操作其实会把镜像上传至Azure的blob存储中;本地在pull镜像的时候就可以直接从Azure存储中下载了,速度非常快,关键是更加稳定。

搭建这个环境也很简单:

1. 使用docker-machine 在香港的Azure数据中心中创建一台容器化主机

docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 --azure-location "EastAsia" {machine-name}

2. 在Azure Storage中创建存储帐号,获取访问密钥

如果你有中国版Azure的帐号,建议把这个存储放置在北京或者上海;如果只有国际版的帐号,放在香港速度也是不错的。

3. 在香港和本地的docker-machine中分别使用同样的命令启动regsitry容器

macOS/linux 脚本

docker run -d -p 5000:5000 \
-e REGISTRY_STORAGE=azure \
-e REGISTRY_STORAGE_AZURE_ACCOUNTNAME="{Account Name}" \
-e REGISTRY_STORAGE_AZURE_ACCOUNTKEY="{access key}" \
-e REGISTRY_STORAGE_AZURE_CONTAINER="{storage container name}" \
-e REGISTRY_STORAGE_AZURE_REALM="core.chinacloudapi.cn" \
--name=registry \
--restart=always \
registry:2

Windows脚本

docker run -d -p 5000:5000 ^
-e REGISTRY_STORAGE=azure ^
-e REGISTRY_STORAGE_AZURE_ACCOUNTNAME="{Account Name}" ^
-e REGISTRY_STORAGE_AZURE_ACCOUNTKEY="{access key}" ^
-e REGISTRY_STORAGE_AZURE_CONTAINER="{storage container name}" ^
-e REGISTRY_STORAGE_AZURE_REALM="core.chinacloudapi.cn" ^
--name=registry ^
--restart=always ^
registry:2

注意以上我所使用的是中国版Azure存储帐号,如果使用国际版,请更新 REGISTRY_STORAGE_AZURE_REALM 这个参数。

4. 使用脚本一次性完成镜像拉取

macOS或者Linux的脚本 pull-image.sh

 echo There are $# arguments to $0: $*
echo Pulling image $3 from docker hub via azure storage
echo Usage
echo "-------------------------------------------"
echo "$1 is the offshore docker-machine name"
echo "$2 is the local docker-machine name"
echo "$3 is the image name"
echo "-------------------------------------------" echo "-> switch to $1"
eval $(docker-machine env $1)
echo "-> pulling image $3"
docker pull $3
echo "-> tag image $3 and push to local registry"
docker tag $3 localhost:5000/$3
docker push localhost:5000/$3
echo "-> Pull from registry in localhost into $2"
eval $(docker-machine env $2)
docker pull localhost:5000/$3
docker tag localhost:5000/$3 $3
docker rmi localhost:5000/$3
echo "-> Done!"

Windows 脚本 pull-image.cmd

 echo off
echo Usage
echo "-------------------------------------------"
echo "%1 is the offshore docker-machine name"
echo "%2 is the local docker-machine name"
echo "%3 is the image name"
echo "-------------------------------------------" echo "-> switch to %1"
@FOR /f "tokens=*" %i IN ('docker-machine env %1') DO @%i
echo "-> pulling image %3"
docker pull $3
echo "-> tag image %3 and push to local registry"
docker tag %3 localhost:5000/%3
docker push localhost:5000/%3
echo "-> Pull from registry in localhost into %2"
@FOR /f "tokens=*" %i IN ('docker-machine env %2') DO @%i
docker pull localhost:5000/%3
docker tag localhost:5000/%3 %3
docker rmi localhost:5000/%3
echo "-> Done!"

当然,你也可以把这个registry容器运行在云端的docker-machine里面,这样你就可以把这个registry共享给团队使用了,但是不要忘记加入验证。

另外,如果你使用的是AWS或者阿里云,Docker Registry也提供了类似的driver可以搭建一样的环境,具体请参考:https://docs.docker.com/registry/storage-drivers/

相关阅读:


请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

使用Azure云存储构建高速 Docker registry的更多相关文章

  1. docker4dotnet #4 使用Azure云存储构建高速 Docker registry

    使用Docker来构建应用程序最常见的操作就是 docker run 或者 docker pull了,但是由于众所周知的原因,在国内想要高速稳定的获取docker hub上面的资源并不是件容易的事情, ...

  2. 【Microsoft Azure 的1024种玩法】三.基于Azure云平台构建Discuz论坛

    [简介] Discuz!是一套通用社区论坛软件系统,用户在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能.很强负载能力和可高度定制的论坛服务. [前期文章] [操作步骤] ...

  3. Microsoft Azure 云存储服务概念

    本文包括了以下几点内容: 什么是Azure云存储服务? 云存储服务分类 云存储服务的优势 什么是Azure云存储服务? Azure 云存储服务可以说是Azure 上最重要的SAAS服务了. 在Azur ...

  4. Azure Container Registry-基于开源 Docker Registry 的专用 Docker 注册表服务

    本文语雀知识库:https://www.yuque.com/seanyu/azure/acr 概述 Azure 容器注册表(Azrue Container Registry,简称ACR)是 Azure ...

  5. vsts + XX云服务器构建netcore+docker持续集成交付部署

    持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...

  6. 构建私有Docker Registry

    1.设置insecure-registry: 可能会出现无法push镜像到私有仓库的问题. 这是因为我们启动的registry服务不是安全可信赖的. 1) sudo vim /etc/default/ ...

  7. Docker registry垃圾回收

    Docker registry垃圾回收 通过: docker run -p 5000:5000 -v /netdata/xxxx/registry:/var/lib/registry registry ...

  8. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  9. 自建存储与使用微软Azure、七牛等第三方云存储综合考察分析

    http://www.cnblogs.com/sennly/p/4136734.html 各种云服务这两年炒的火热,加之可以降低成本,公司想先在部分业务上尝试使用下,刚好最近有个项目有大量小文件需要存 ...

随机推荐

  1. Cracking the coding interview--Q1.6

    原文: Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a m ...

  2. [LeetCode] 237. Delete Node in a Linked List 解题思路

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  3. Linux grep 命令中的正则表达式详解

    在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式(extended regular expres ...

  4. 解析了grid2008的代码

    import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.L ...

  5. 【转】MVC5中的区域(Areas)

    MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...

  6. ionic框架前端生产环境的简单部署

    1. 效果对比 1.1 开发环境 css+js+lib文件大小为好多M :) 1.2 部署环境(生产环境) css+js+lib文件大小约为800K 文件大小:好多M–>800K(多少自己试下) ...

  7. MyEclipse 8.0注冊码+原版下载_Java开发软件

    MyEclipse是一个十分优秀的用于开发Java, J2EE的Eclipse插件集合,MyEclipse的功能很强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错.MyEclipse眼下支持J ...

  8. HBase总结(十二)Java API 与HBase交互实例

    HBase提供了Java Api的訪问接口,掌握这个就跟Java应用使用RDBMS时须要JDBC一样重要 import java.io.IOException; import org.apache.h ...

  9. 最新的四款国外VPN,免费稳定,可以看国外网站的

    tyle="margin-top:20px; margin-right:0px; margin-bottom:0px; margin-left:0px; font-family:Arial; ...

  10. javascript封装id|class|元素选择器

    由于各个浏览器都支持的选择方法只有如下三种: 1 document.getElementById() 2 document.getElementsByName() 3 document.getElem ...