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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从docker将image镜像到私有的registry相关的知识,希望对你有一定的参考价值。

参考技术A 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本回答被提问者和网友采纳

docker——docker搭建本地私有仓库

搭建本地私有仓库

  • 有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
    使用私有仓库有许多优点:

1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

1. 首先下载registry 镜像

docker pull registry

Docker 官方提供了一个搭建私有仓库的镜像 registry (注册服务器),只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库

2. daemon.json文件中添加私有镜像仓库地址

vim /etc/ docker/daemon.json

"insecure-registries": ["192.168.163.136:5000"],
#添加,注意用逗号结尾
"registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]

systemctl restart docker.service

3. 运行 registry 容器

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest 

-itd: 在容器中打开一个伪终端进行交互操作,并在后台运行

-v: 把宿主机的/data/registry目录绑定到容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;

在容器中启动私有镜像仓库并将私有仓库的存储目录挂载到宿主机指定目录中,这样做的目的是,如果容器被删除了,存储在容器中的镜像就不会被删掉(默认情况下如果容器被删除,则存放于容器中的镜像也会丢失)

-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了

--restart=always: 这是重启的策略,在容器退出时总是重启容器

--name registry: 创建容器命名为registry

registry:latest:这个是刚才pull下来的镜像

Docker容器的重启策略如下:

4. 为镜像打标签

docker tag centos:7 192.168.163.136:5000/centos:v1

如果不对私有仓库命名的话,默认走的是公共仓库(docker hub),所以需要命名镜像。

私有仓库镜像的命名规则:宿主机ip地址:端口号/xxxx(需要更改的名称)

注意:当你对源镜像进行命名后,命名后的镜像名称也视为一个标签,因为id号是相同的。如果当源镜像删除,命名后的镜像依然会存在,因为删除的是一个标签。  

5. 上传到私有仓库

docker push 192.168.163.136:5000/centos:v1

6. 列出私有仓库的所有镜像

curl http://192.168.163.136:5000/v2/_catalog

浏览器访问:192.168.163.136:5000/v2/_catalog

7. 列出私有仓库的centos镜像有哪些tag

curl http://192.168.229.90:5000/v2/centos/tags/list

浏览器访问:192.168.163.136:5000/v2/centos/tags/list

8. 先删除原有的centos的镜像,再测试私有仓库下载

docker rmi -f 8652b9f0cb4c
docker pull 192.168.229.90:5000/centos:v1

以上是关于如何从docker将image镜像到私有的registry的主要内容,如果未能解决你的问题,请参考以下文章

如何将本地docker 镜像上传到我的私有仓库

docker基础 私有仓库repository搭建 registry

搭建docker私有镜像仓库

Docker的私有仓库

如何将 docker 镜像推送到私有仓库

docker——docker搭建本地私有仓库