docker4dotnet #4 使用Azure云存储搭建高速 Docker registry

开发 开发工具
今天这篇文章就给大家介绍一下怎么借助Azure Storage来搭建一个高速的私有 Docker Hub (Registiry)。

Docker

使用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数据中心中创建一台容器化主机

  1. docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 {machine-name} 

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

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

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

macOS/linux 脚本

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

Windows脚本

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

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

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

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

  1. echo There are $# arguments to $0: $* 
  2.  echo Pulling image $3 from docker hub via azure storage 
  3.  echo Usage 
  4.  echo "-------------------------------------------" 
  5.  echo "$1 is the offshore docker-machine name" 
  6.  echo "$2 is the local docker-machine name" 
  7.  echo "$3 is the image name" 
  8.  echo "-------------------------------------------" 
  9.   
  10.  echo "-> Swithc to $1" 
  11.  eval $(docker-machine env $1) 
  12.  echo "-> pulling image $3" 
  13.  docker pull $3 
  14.  echo "-> tag image $3 and push to local registry" 
  15.  docker tag $3 localhost:5000/$3 
  16.  docker push localhost:5000/$3 
  17.  echo "-> Pull from registry in localhost into $2" 
  18.  eval $(docker-machine env $2) 
  19.  docker pull localhost:5000/$3 
  20.  docker tag localhost:5000/$3 $3 
  21.  docker rmi localhost:5000/$3 
  22.  echo "-> Done!" 

Windows 脚本 pull-image.cmd

  1. echo off 
  2. echo There are $# arguments to $0: $* 
  3. echo Pulling image $3 from docker hub via azure storage 
  4. echo Usage 
  5. echo "-------------------------------------------" 
  6. echo "%1 is the offshore docker-machine name" 
  7. echo "%2 is the local docker-machine name" 
  8. echo "%3 is the image name" 
  9. echo "-------------------------------------------" 
  10.  
  11. echo "-> Swithc to %1" 
  12. @FOR /f "tokens=*" %i IN ('docker-machine env %1') DO @%i 
  13. echo "-> pulling image %3" 
  14. docker pull $3 
  15. echo "-> tag image %3 and push to local registry" 
  16. docker tag %3 localhost:5000/%3 
  17. docker push localhost:5000/%3 
  18. echo "-> Pull from registry in localhost into %2" 
  19. @FOR /f "tokens=*" %i IN ('docker-machine env %2') DO @%i 
  20. docker pull localhost:5000/%3 
  21. docker tag localhost:5000/%3 %3 
  22. docker rmi localhost:5000/%3 
  23. echo "-> Done!" 

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

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

【本文为51CTO专栏作者“徐磊”的原创稿件,转载请通过作者微信公众号devopshub获取授权】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2017-02-14 16:39:56

docker容器化主机

2017-02-14 15:51:16

docker开发调试

2017-02-14 20:15:15

docker容器持续交付

2017-03-01 09:20:30

2017-06-23 08:29:49

Azure托管云存储

2017-08-28 09:03:11

简化云存储管理

2014-12-17 15:18:27

LinuxMonoWindows

2009-11-26 13:12:16

Silverlight

2018-09-17 10:47:28

MongoDB存储Docker

2015-01-14 11:04:07

微软Microsoft AVM

2023-04-07 08:28:14

2016-09-08 16:04:59

JavaDocker前端

2024-10-16 09:49:18

2014-03-17 10:05:45

Hadoop集群

2016-11-14 20:56:37

Docker数据中心服务器

2016-01-07 09:36:20

Docker容器

2023-11-13 09:03:10

2022-09-15 08:31:11

主从复制模式Docker

2011-11-21 10:41:51

私有云云存储
点赞
收藏

51CTO技术栈公众号