前言

首先试想这样一个场景:当在自己的机器上(docker中)构建了mysql镜像,eureka镜像等等微服务镜像,这些镜像有可能需要放到其他的机器上docker环境中去运行,实行分布式架构部署。但如何把这些镜像共享到其他机器上去呢?可能很多小伙伴想到的是使用docker 的save和load命令或docker export和import命令。除此之外,还有更好的解决方案,就是这章要讲的使用registry这个工具。使用registry可以很方便的在团队内部,或者公司内部,在不同的linux主机上分享镜像。

registry的作用就是共享镜像。

一、使用docker命令导入导出镜像

在讲使用registry私服共享镜像之前,先讲如何使用docker命令共享镜像,肯定是因为使用这些命令在某些情况下有局限性。

使用docker命令导入导出容器有两种方式:

一种是使用save和load命令,另一种是使用export和import命令。需要注意的是这两种方法不可混用。

#使用docker save和load命令
docker save ubuntu:load>root/ubuntu.tar
docker load<ubuntu.tar # 使用docker export和import命令
docker export 98ca35> ubuntu.tar
cat ubuntu.tar | sudo docker import - ununtu:import

可点击下面四个命令,进入官网查看对该命令的详细介绍,这里就不一一展开。

docker savedocker loaddocker exportdocker import

使用docker命令进行导入和导出的局限性:

  • 不知道对方是使用docker save还是docker export生成的tar文件
  • 当镜像更新比较频繁时(如在测试阶段,集成测试时),需要频繁的去生成tar文件,并进行传输。如果是只传给一个人,实在要忍,或许你能忍,如果是需要对多个人传输,频繁生成tar文件,并且有多个版本时,你还能忍吗?

有没有更好的解决方案?当然有,那就是这章的主角,docker私服Registry。

二、Docker私服Registry安装

# regisry镜像下载
$ sudo docker pull registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5
Status: Downloaded newer image for registry:latest
# 安装并运行regisry,端口映射为5000
$ sudo docker run -d --name=registry -p : registry
72ceb5dc167ea9a50c92dbf46f8b06d5ecd5222377d440174e4f4f7a7da9049d

通过浏览器访问registry的入口,http://192.168.31.181:5000/v2/_catalog,可以看到返回的repositories的结果中是空的,也就是docker私服registry中,并没有私服镜像。

三、修改docker配置,让docker信任registry地址

已经安装好了registry,接着就是把docker中的镜像,传到regisry。但是,由于docker是没有对registry开放权限,所以需要修改配置,让docker信任regisry。

修改/etc/docker/daemon.json文件,添加:"insecure-registies":["192.168.31.181:5000"]。由于docker和registry是在同一台主机中,所以这里的registry地址也是本机地址。如果是要往别的主机的registry中上传镜像,可加入其它主机的ip地址。添加之后重启docker,这时docker就信任regisry地址了。

$ sudo vi /etc/docker/daemon.json
{
# ustc的加速源
"registry-mirrors": ["https://nrbewqda.mirror.aliyuncs.com"],#由于该文件是个json格式的文件,所以需要先在这行最后面添加一个,
# 让docker信任192.168.31.:5000registry私服地址
"insecure-registries":["192.168.31.181:5000"]
} # 重启docker,如果docker中服务较多,重启操作,可能需要很久
$ sudo systemctl restart docker

四、上传镜像到regisry

上传镜像到regisry有两种方式:

  • 手动上传
  • 利用DockerMaven插件自动上传

五、手动上传镜像到私服Registry

上传镜像到registry命令:docker tag 本地镜像REPOSITORY名称 registry地址/registry中的名称

$ sudo docker tag eureka 192.168.31.181:/eureka
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
...
192.168.31.181:/eureka latest 9b410097b49e hours ago 645MB
eureka latest 9b410097b49e hours ago 645MB
...

命令详解:

docker tag : 给镜像打标签

eureka :本机docker本地仓库中的一个REPOSITORY名为eureka的镜像

192.168.31.181:5000/eureka :registry私服地址/私服地址中该镜像的名称为eureka

在上面通过docker images的输出结果可以看到,可以看到多了一个REPOSITORY名为192.168.31.181:5000/eureka的镜像,而且该镜像的IMAGE ID以及其他,和REPOSTIRY名为eureka的镜像的IMAGE ID以及其他都是一模一样的。表明该两个镜像是一样的。

然后通过docker push命令上传刚刚的192.168.31.181:5000/eureka镜像到私服registry,出现如下结果,表示已经上传了该镜像到私服registry中。

$ sudo docker push 192.168.31.181:/eureka
The push refers to repository [192.168.31.181:/eureka]
0fd51de780a4: Pushed
c302e69bdee3: Pushed
dd836de89ae0: Pushed
d69483a6face: Pushed
latest: digest: sha256:6ddce0d73923b3a6efcf5892f239c48c8197890892b2cbeb9b1f37d10fb070fa size:

========================================

提示:

如果运行上面的命令报connect:connection refused错误,那是因为刚重启了registry,而regisry是安装在docker中的,重启docker之后,registry是出来停止状态的,需要重启registry。重启registry的命令为:

$ sudo docker start registry

然后再执行上面的push命令。

========================================

如何确认192.168.31.181:5000/eureka镜像是否上传到了私服registry中呢?

可通过浏览器访问私服registry的入口地址:http://192.168.31.181:5000/v2/_catalog

为什么私服registry中的名称是eureka?还记得上面写的docker tag命令吗?

六、 利用DockerMaven插件自动镜像上传到私服Registry

手动上传镜像到私服registry,有个前提,那就是需要上传的镜像(通过docker tag命令之前的镜像)必须是在docker的本地仓库(也就是通过docker images命令中可以查看到)。

如果在docker的本地仓库中还没有镜像,那么手动上传镜像到私服registry,需要做两步,第一步:打包微服务项目并上传到docker本地仓库,并生成镜像;第二步:通过docker tag命令和docker push命令上传镜像到私服registry。其实,这不是两步,而是四五步。

1.为了演示自动打包项目和上传镜像,需要先删除正在运行的镜像,实际操作中可省略此步

由于需要演示利用DockerMaven插件自动打包项目、自动生成镜像和上传到私服,所以需要删除掉某个正在运行的项目镜像。

以zuul镜像为例,来讲解如何删除zuul镜像

# 查看所有zuul容器(运行中的和非运行中的)
$ sudo docker ps -a | grep zuul
a959a9465e7c zuul "/.r/r java -jar /ap…" hours ago Exited () About an hour ago r-microservice-zuul--c8c7c48d
# 可以看到zuul的STATUS为Exited表示已经是停止状态,如果STATUS为UP,则表示是运行状态,需要先停止
# 停止运行中的zuul容器,a959a9465e7c为zuul的CONTAINER ID
# 如果有多个运行中的zuul容器,可在stop命令后面跟上多个CONTAINER ID,中间以空格隔开
$ sudo docker stop a959a9465e7c
a959a9465e7c
# 删除zuul容器,如果有多个zuul容器,可在rm命令后面跟上多个CONTAINER ID,中间以空格隔开
$ sudo docker rm a959a9465e7c
a959a9465e7c
# 查看zuul镜像,镜像只可能有一个
$ sudo docker images | grep zuul
zuul latest ffed513f7188 hours ago 642MB
# 删除zuul镜像
$ sudo docker rmi zuul
Untagged: zuul:latest
Deleted: sha256:ffed513f7188562d2ee9544ff369ebe0472977295ea5ba83a32261d45f98e517
Deleted: sha256:eee67d5f43adf92a58cc0cad84a1e5f02f9c962e8b8ddfc9fc68275c4af12305
Deleted: sha256:6fc9d1be85a095edb7342f99a57669dab11e82dbb5b913f1f1a081ac501112ea

2.利用DockerMaven插件自动上传镜像到Registry

下面就讲利用DockerMaven插件,一步搞定项目的打包、上传到linux系统、生成docker镜像,执行docker tag和push到私服registry。在docker微服务部署之:五、利用DockerMaven插件自动构建镜像中,已经讲了利用DockerMaven插件自动构建镜像。

方法一

首先,需要修改demo_zuul项目的pom.xml文件,将configuration的imageName标签中镜像名前面加上私服registry的地址192.168.31.181:5000/即可。

...
<configuration>
<!-- 下面为此次修改的地方,在原来的zuul前,添加了192.168.31.181:5000/ -->
<imageName>192.168.31.181:5000/zuul</imageName>
<!-- 上面为此次修改的地方 -->
<baseImage>jdk1.8</baseImage>
...

然后点击idea左小角的Terminal窗口,把demo_zuul项目,拖动到该窗口(或者输入 cd demo_zuul),然后执行mvn clean package docker:build -DpushImage

命令详解:

cd demo_zuul :在当前的目录....\demo_parent,进入子目录(zuul项目的目录)demo_zuul

mvn clean package :将demo_zuul项目打成jar包

docker:build :将jar包上传到linux主机,并通过Dockerfile配置生成镜像到docker的本地仓库

-D :代表增加一个参数

pushImage :参数名为pushImage,即为同时将本地仓库中的zuul镜像,上传到私服registry(192.168.31.181:5000),并命名私服registry中的镜像名为pom.xml中imageName标签中的zuul

通过docker images名称查看镜像

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.31.181:/zuul latest 09449796276f minutes ago 642MB

刷新registry

方法二

原有demo_zuul项目中的pom.xml文件不动,复制该pom.xml文件,重命名为一个pom_registry.xml的pom文件。修改pom_registry.xml文件中的内容:

...
<configuration>
<registryUrl>192.168.31.181:</registryUrl>
<pushImage>true</pushImage>
<!-- article的名称为demo_zuul,如果镜像名不是用zuul,而是用demo_zuul,可修改imageName的内容为:192.168.31.181:/${project.artifactId}
<imageName>192.168.31.181:/zuul</imageName>
<baseImage>jdk1.</baseImage>
...

然后点击idea左小角的Terminal窗口,把demo_zuul项目,拖动到该窗口(或者输入 cd demo_zuul),然后执行mvn -f pom_registry.xml clean package docker:build

通过两个pom.xml文件,当只需要把镜像放到本地仓库时,通过mvn clean package docker:build执行即可。而需要把镜像上传到私服时,通过mvn -f pom_registry.xml clean package docker:build即可。

写给自己:有待完善的地方:

  • 把该篇文章分为两个文章:一是把构建私服,弄成两台服务器,并显示如何从私服中下载镜像
  • 把利用DockerMaven自动构建镜像,演示在一个开源项目中修改pom文件,并自动上传到私服。

 

docker私服registry管理镜像的更多相关文章

  1. Docker Registry 管理镜像

    一.使用Docker Registry管理镜像 a.登陆docker hub  https://www.docker.com/products/docker-hub b.创建仓库 c.推送镜像   打 ...

  2. Docker 私服Registry简介与使用Docker-Compose安装Registry

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  3. Docker部署Registry私有镜像库

    拉取镜像 docker pull registry:2.6.2   生成账号密码文件,这里采用htpasswd方式认证 docker run --rm --entrypoint htpasswd re ...

  4. 6.云原生之Docker容器Registry私有镜像仓库搭建实践

    转载自:https://www.bilibili.com/read/cv15219863/?from=readlist #1.下载registry仓库并设置数据存放的目录(并生成认证账号密码) doc ...

  5. Docker:搭建私有镜像仓储(image registry)(4)

    搭建私有仓储,其实本质上也是运行了一个官方提供的(Registry)镜像的容器:生产环境中,我们要搭建自己的专有仓储 下载registry镜像 docker pull registry 运行镜像 do ...

  6. 【linux】【docker】docker私服安装

    前言 系统环境:Centos7.jdk1.8 docker私服:可以把项目通过dockerfile文件build成docker镜像,供其他环境拉取.部署在本地,私有化. 安装 dockerHUB私服 ...

  7. Docker Private Registry

    Docker Private Registry 目录 Docker Private Registry Docker Registry Docker Private Registry 使用docker- ...

  8. Docker删除私有仓库镜像

    V2 安装删除脚本 # curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/dele ...

  9. docker(五) 使用Docker Registry搭建镜像私服

    1.创建私服 docker run -d --name registry -v /opt/data/registry:/var/lib/registry -p 5000:5000 registry - ...

随机推荐

  1. UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

    题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...

  2. POP介绍与使用实践(快速上手动画)[转]

    前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有 ...

  3. Linux常见配置文件

    一./etc 配置文件 /etc/passwd 用户数据库,其中的域给出了用户名.真实姓名.家目录.加密口令和用户的其他信息 /etc/group 类似/etc/passwd ,但说明的不是用户而是组 ...

  4. 解决火狐浏览器发送jquery的ajax请求无效的问题

    今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 <form> ..... <button cla ...

  5. hdu 1266 Reverse Number

    题目 一道水题,但是超时了几次(Time Limit Exceeded) 题中说:then n 32-bit integers follow.私以为可以用int来做,结果就一直超时,博客之,发现全是用 ...

  6. Fig 7.2.4 & Fig 7.3.2

    Fig 7.2.4 \documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tkz-euclide} \begin{docu ...

  7. string 和String的区别

    string 是 System.String 的别名,习惯上,我们把字符串当作对象时(有值的对象实体),我们用string.而我们把它当类时(需要字符串类中定义的方法),我们用String,比如: s ...

  8. 在 IIS8 中保持网站持续运行

    在早期版本的 IIS 中执行轮询任务不那么可靠.应用程序池回收后,网站不会自动重启,在新的请求激活应用程序之前,轮询任务不起作用.为了解决这个问题,需要引入外力驱动 Web 端执行任务,如图: 此方式 ...

  9. MLLib实践Naive Bayes

    引言 本文基于Spark (1.5.0) ml库提供的pipeline完整地实践一次文本分类.pipeline将串联单词分割(tokenize).单词频数统计(TF),特征向量计算(TF-IDF),朴 ...

  10. C#HttpUtility.UrlEncode 大写问题

    工作上和另一个公司对接,调对方的api需要用到md5加密,加密前要使用HttpUtility.UrlEncode,对方接口一直返回验证错误,定位了问题发现是中文编码使用HttpUtility.UrlE ...