目录
Docker本地上传下载镜像一般可以通过公有仓库实现。但是如果想要将镜像不公开仅供一部分人使用,则可以建立私有仓库。
1.私有仓库创建
a.下载私有仓库镜像
sudo docker pull registry:latest
查看本地镜像:sudo docker images
b.创建一个仓库容器
sudo docker run -d -p 5000:5000 --name server-registry -v /tmp/registry:/tmp/registry docker.io/registry:latest
-v a:b :是指宿主机中的a目录挂载到容器的b目录中
c.本地标记镜像(以ubuntu和java镜像为例子)
sudo docker tag ubuntu:18.04 localhost:5000/ubuntu:18.04
sudo docker tag java:latest localhost:5000/java:latest
从上图可以看出localhost:5000/ubuntu:18.04和localhost:5000/java.latest两个镜像已经存在。
d.上传镜像到私有仓库
sudo docker push localhost:5000/ubuntu:18.04
sudo docker push localhost:5000/java:latest
e.登陆私有仓库查看
curl 127.0.0.1:5000/v2/_catalog
或者在浏览器中输入:http://127.0.0.1:5000/v2/_catalog
可以看出镜像已经上传到私有仓库中
2.使用私有仓库上传镜像
在本地建立私有仓库之后,如果每次都要标记然后逐个上传,重复工作量比较大,因此可以考虑将重复性的这部分工作交给脚本来实现。
1.批量上传指定镜像
实现该功能首先在/usr/local/bin/文件夹下建立一个push_images.sh脚本文件,push_images.sh脚本内容如下所示:
registry=127.0.0.1:5000;#指定目标注册服务器
echo_r(){
[ $# -ne 1 ] && return 0;
echo -e "\033[31m$1\033[0m"
}
echo_g(){
[ $# -ne 1 ] && return 0;
echo -e "\033[32m$1\033[0m"
}
echo_y(){
[ $# -ne 1 ] && return 0;
echo -e "\033[33m$1\033[0m"
}
echo_b(){
[ $# -ne 1 ] && return 0;
echo -e "\033[34m$1\033[0m"
}
usage(){
sudo docker images
echo "Usage: $0 registry1:tag1 [registry2:tag2...]"
}
[ $# -lt 1 ] && usage && exit
echo_b "The registry server is $registry"
for image in "$@"
do
echo_b "Uploading $image..."
sudo docker tag $image $registry/$image #标记镜像
sudo docker push $registry/$image #上传镜像到仓库
sudo docker rmi $registry/$image #删除本地标记镜像
echo_g "Done"
done
然后对该脚本文件添加可执行权限 :
sudo chmod a+x /usr/local/bin/push_images.sh
最后可以利用/usr/local/bin/push_images.sh image1 [image2...] 来批量上传镜像。以下进行实践:
首先上传单个镜像,先检查私有仓库的镜像,如下图所示:
上传一个python镜像,并检查仓库中有没有上传成功。如下图所示,说明镜像上传成功
一次性上传两个镜像:registry和sshd:ubuntu14,实现了批量上传的功能。
2.上传本地所有镜像
在/usr/local/bin/文件夹下建立一个push_all.sh脚本文件,脚本内容如下所示:
for image in `sudo docker images|grep -v "REPOSITORY"|grep -v "<none>"|awk '{print $1":"$2}'`
do
push_images.sh $image
done
!!!注意,sudo前面的`是特殊字符,并非标点符号'。不能一概而论,否则会报错。
在push_images.sh添加可执行权限之后,给push_all.sh添加可执行权限
sudo chmod a+x /usr/local/bin/push_all.sh
先检查本地的镜像;sudo docker images
接着执行脚本文件:/usr/local/bin/push_all.sh,以下则是执行过程
最后检查仓库,可以看出本地的镜像全部都上传了。
因此,我们可以通过自己编写脚本,可以实现批量上传镜像以及将本地镜像全部上传的功能,从而提高了将镜像上传到私有仓库的效率。
3.Tips
1.输入127.0.0.1:5000/v2/_catalog可以获取仓库内容
2.输入127.0.0.1:5000/v2/image/tags/list 可以获取image镜像的相关信息,主要是标签。