ts2009 发表于 2015-10-13 08:47:30

如何从docker将image镜像到私有的registry


      docker越来越炙手可热,如果你的团队已经准备开始使用docker,那么私有仓库是必不可少的东西,首先是可以帮助你加快从服务器pull镜像的速度,其次也可以帮助你存放私有的镜像,本文主要为大家介绍如何从公用服务器上讲开放的images备份到本地私有服务器上。

本文中以index中的ubuntu镜像举例


从官方的Index服务器上下载ubuntu镜像

docker pull ubuntu


查看现有的images


REPOSITORY
TAG
IMAGE ID
CREATED
VIRTUAL SIZE
ubuntu
13.10
9f676bd305a4
5 weeks ago
178 MB
ubuntu
saucy
9f676bd305a4
5 weeks ago
178 MB
ubuntu
raring
eb601b8965b8
5 weeks ago
166.5 MB
ubuntu
13.04
eb601b8965b8
5 weeks ago
166.5 MB
ubuntu
12.10
5ac751e8d623
5 weeks ago
161 MB
ubuntu
quantal
5ac751e8d623
5 weeks ago
161 MB
ubuntu
10.04
9cc9ea5ea540
5 weeks ago
180.8 MB
ubuntu
lucid
9cc9ea5ea540
5 weeks ago
180.8 MB
ubuntu
12.04
9cd978db300e
5 weeks ago
204.4 MB
ubuntu
latest
9cd978db300e
5 weeks ago
204.4 MB
ubuntu
precise
9cd978db300e
5 weeks ago
204.4 MB

一般来讲,我们会使用最新版本的ubuntu,大家可以发现多个TAG对应同一个image,Tag只是一个名字而已。


为需要push到私有registry的image打tag

docker tag 9cd978db300e rd-server:5000/ubuntu


我们可以执行docker
images查看效果


REPOSITORY
TAG
IMAGE ID
CREATED
VIRTUAL SIZE
ubuntu
13.10
9f676bd305a4
5 weeks ago
178 MB
ubuntu
saucy
9f676bd305a4
5 weeks ago
178 MB
ubuntu
raring
eb601b8965b8
5 weeks ago
166.5 MB
ubuntu
13.04
eb601b8965b8
5 weeks ago
166.5 MB
ubuntu
12.10
5ac751e8d623
5 weeks ago
161 MB
ubuntu
quantal
5ac751e8d623
5 weeks ago
161 MB
ubuntu
10.04
9cc9ea5ea540
5 weeks ago
180.8 MB
ubuntu
lucid
9cc9ea5ea540
5 weeks ago
180.8 MB
ubuntu
12.04
9cd978db300e
5 weeks ago
204.4 MB
ubuntu
latest
9cd978db300e
5 weeks ago
204.4 MB
ubuntu
precise
9cd978db300e
5 weeks ago
204.4 MB
rd-server:5000/ubuntu
latest
9cd978db300e
5 weeks ago
204.4 MB

将ubuntu push到私有registry

docker push rd-server:5000/ubuntu


如何将ubuntu的所有分支都镜像到自己的私有仓库?


1.先打TAG,把需要的版本打上标签,然后进行推送

语句大概是这个样子的:

docker tag eb601b8965b8 rd-server:5000/ubuntu:raring
docker tag eb601b8965b8 rd-server:5000/ubuntu:13.04
docker tag 9f676bd305a4 rd-server:5000/ubuntu:saucy
docker tag 9f676bd305a4 rd-server:5000/ubuntu:13.10
docker tag 9cd978db300e rd-server:5000/ubuntu:precise
docker tag 9cd978db300e rd-server:5000/ubuntu:latest
docker tag 9cd978db300e rd-server:5000/ubuntu:12.04
docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:lucid
docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:10.04
docker tag 5ac751e8d623 rd-server:5000/ubuntu:quantal
docker tag 5ac751e8d623 rd-server:5000/ubuntu:12.10


开始推送

docker push rd-server:5000/ubuntu


如果返回的内容的最后一行是下面这个样子的

2014/03/14 08:22:14 push: }


请反复执行,没错,不要怀疑,请循环一直反复执行下去

docker pull rd-server:5000/ubuntu


直到不再出现 push:
}的字样

不知道这是docker的BUG还是本身设计是这样的,需要反复多次push才能将完整的tag推送到private registry里,否则在客户端下载的时候总会提示某些image找不到,个人猜测可能是这么设计的,因为docker image比较大,而一个repo会有很多的块文件,每次push的时候只Push一个块,好了,猜测就道这,活还是得干,所以,写个脚本解决手工的问题吧。

#!/bin/sh
#
#Copyright (c) 2014 ZhengXujin xujinzheng@gmail.com
#
server="127.0.0.1:5000"
index_repo_name="username/ubuntu"
private_repo_name="ubuntu"

echo "\n"
echo "                        ##      ."
echo "                  ## ## ##       =="
echo "               ## ## ## ##      ==="
echo "         /""""""""""""""""\___/ ==="
echo "      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /===- ~~~"
echo "         \______ o          __/"
echo "             \    \      __/"
echo "            \____\______/"
echo "\n"
idx=0
is_continue=1
docker images|grep -q "$server/$private_repo_name"
if [[ $? -ne 0 ]]; then
    docker images|grep $index_repo_name|awk -F" " '{printf("docker tag %s %s/%s:%s\n",$3,"'$server'","'$private_repo_name'",$2)}'|bash
fi
while [ $is_continue -eq 1 ]
do
   docker push $server/$private_repo_name
is_continue=$?
let idx=$idx+1
echo "$(tput setaf 1)continue push, $idx times pushed. $(tput sgr 0)"
done


从客户端获取私有库的镜像

docker pull rd-server:5000/ubuntu


或者获取某个版本的ubuntu

docker pull -t 13.04 rd-server:5000/ubuntu


在从公有库往私有库上推送的时候,可能会遇到一些依赖的镜像并没有完全推送到服务器上,在客户端pull的时候会有错误,提示如下

eb601b8965b8: Error pulling image (13.04) from rd-server:5000/ubuntu, Server error: 400 trying to fetch remote history for eb601b9cd978db300e: Download complete


请反复执行下面的语句,一直到完整上传所有的images

docker push rd-server:5000/ubuntu


当然也不是每次出现这样的问题都是因为上传不完整导致的,也有可能是pull的客户端网络不好,如果反复出现相同问题,就需要考虑上面的方法

如果出现如下的问题,请将主机名直接换成IP来pull库

Invalid Registry endpoint: Get http://rd-server:5000/v1/_ping: dial tcp: lookup rd-server: no such host


例如

docker pull 172.16.1.88:5000/ubuntu
         
版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: 如何从docker将image镜像到私有的registry