首先试想这样一个场景:当在本身的机器上(docker中)构建了mysql镜像,eureka镜像等等微服务镜像,这些镜像有可能须要放到其余的机器上docker环境中去运行,实行分布式架构部署。但如何把这些镜像共享到其余机器上去呢?可能不少小伙伴想到的是使用docker 的save和load命令或docker export和import命令。除此以外,还有更好的解决方案,就是这章要讲的使用registry这个工具。使用registry能够很方便的在团队内部,或者公司内部,在不一样的linux主机上分享镜像。html
registry的做用就是共享镜像。java
在讲使用registry私服共享镜像以前,先讲如何使用docker命令共享镜像,确定是由于使用这些命令在某些状况下有局限性。mysql
使用docker命令导入导出容器有两种方式:linux
一种是使用save和load命令,另外一种是使用export和import命令。须要注意的是这两种方法不可混用。sql
#使用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
docker save、docker load、docker export、docker import。json
使用docker命令进行导入和导出的局限性:ubuntu
有没有更好的解决方案?固然有,那就是这章的主角,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 5000:5000 registry 72ceb5dc167ea9a50c92dbf46f8b06d5ecd5222377d440174e4f4f7a7da9049d
经过浏览器访问registry的入口,http://192.168.31.181:5000/v2/_catalog,能够看到返回的repositories的结果中是空的,也就是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.181:5000registry私服地址 "insecure-registries":["192.168.31.181:5000"] } # 重启docker,若是docker中服务较多,重启操做,可能须要好久 $ sudo systemctl restart docker
上传镜像到regisry有两种方式:
上传镜像到registry命令:docker tag 本地镜像REPOSITORY名称 registry地址/registry中的名称
$ sudo docker tag eureka 192.168.31.181:5000/eureka $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... 192.168.31.181:5000/eureka latest 9b410097b49e 44 hours ago 645MB eureka latest 9b410097b49e 44 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:5000/eureka The push refers to repository [192.168.31.181:5000/eureka] 0fd51de780a4: Pushed c302e69bdee3: Pushed dd836de89ae0: Pushed d69483a6face: Pushed latest: digest: sha256:6ddce0d73923b3a6efcf5892f239c48c8197890892b2cbeb9b1f37d10fb070fa size: 1161
========================================
提示:
若是运行上面的命令报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命令吗?
手动上传镜像到私服registry,有个前提,那就是须要上传的镜像(经过docker tag命令以前的镜像)必须是在docker的本地仓库(也就是经过docker images命令中能够查看到)。
若是在docker的本地仓库中尚未镜像,那么手动上传镜像到私服registry,须要作两步,第一步:打包微服务项目并上传到docker本地仓库,并生成镜像;第二步:经过docker tag命令和docker push命令上传镜像到私服registry。其实,这不是两步,而是四五步。
因为须要演示利用DockerMaven插件自动打包项目、自动生成镜像和上传到私服,因此须要删除掉某个正在运行的项目镜像。
以zuul镜像为例,来说解如何删除zuul镜像
# 查看全部zuul容器(运行中的和非运行中的) $ sudo docker ps -a | grep zuul a959a9465e7c zuul "/.r/r java -jar /ap…" 8 hours ago Exited (143) About an hour ago r-microservice-zuul-1-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 42 hours ago 642MB # 删除zuul镜像 $ sudo docker rmi zuul Untagged: zuul:latest Deleted: sha256:ffed513f7188562d2ee9544ff369ebe0472977295ea5ba83a32261d45f98e517 Deleted: sha256:eee67d5f43adf92a58cc0cad84a1e5f02f9c962e8b8ddfc9fc68275c4af12305 Deleted: sha256:6fc9d1be85a095edb7342f99a57669dab11e82dbb5b913f1f1a081ac501112ea
下面就讲利用DockerMaven插件,一步搞定项目的打包、上传到linux系统、生成docker镜像,执行docker tag和push到私服registry。在docker微服务部署之:5、利用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:5000/zuul latest 09449796276f 3 minutes ago 642MB
刷新registry
原有demo_zuul项目中的pom.xml文件不动,复制该pom.xml文件,重命名为一个pom_registry.xml的pom文件。修改pom_registry.xml文件中的内容:
... <configuration> <registryUrl>192.168.31.181:5000</registryUrl> <pushImage>true</pushImage> <!-- article的名称为demo_zuul,若是镜像名不是用zuul,而是用demo_zuul,可修改imageName的内容为:192.168.31.181:5000/${project.artifactId} <imageName>192.168.31.181:5000/zuul</imageName> <baseImage>jdk1.8</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便可。
写给本身:有待完善的地方: