这几天在研究docker并实现了spring cloud微服务在docker上的部署,在这里mark一下!
全文分2个部分,假设spring cloud项目创建和docker的安装已经顺利完成。项目源码比较简单可直接下载,注册中心:eureka-server,服务提供者:hi-service。docker安装在ubuntu.18,内核版本:4.18.0-25-generic。
1、docker镜像的创建和容器的启动
2、过程中的坑
一、docker镜像的创建和容器的启动
题外话:docker镜像和容器的关系就像面向对象中类和对象的关系,可以运行某个镜像的多个容器。
1、docker镜像创建
①对于单机版war包的部署,docker可以直接下载镜像,比如tomcat镜像,下载完成之后可以将程序的war包通过docker cp命令拷贝到镜像的目录下,启动tomcat容器即可。整个命令行如下:
#①到docker仓库中搜索tomcat镜像
docker search tomcat
#②拽取镜像到本地
docker pull tomcat
#③将程序war包拷贝到镜像文件中
docker cp app.war tomcat8:/opt/tomcat/webapps
#④启动tomcat
docker run -d -p 80:8080 tomcat8
#正常的话这时候就可以在浏览器里边直接访问了
②对于微服务建构的docker部署是本文的重点,我看网上大部分都是通过Dockerfile创建镜像,创建的时候通过maven工具直接将单个微服务生成jar包直接放在镜像中(这么理解不知道是否有问题),然后启动容器,启动时会自动运行jar包(在Dockerfile文件中指定运行命令)。思考另一种思路是否可以:如果是在docker库中拽取jdk镜像,然后在本地打包微服务为jar包,然后将jar包放在jdk镜像中,启动jdk容器,不知道是否可以,不知道服务之前的调用怎么样,后续有时间再尝试下,再补充。
源码已放置github服务器上,实现的功能很简单,eureka-server作为服务注册中心,hi-service作为服务提供者,实现hi-server注册至注册中心,浏览器可直接访问服务提供者。本文会根据需要展示出关键源码。开始搭建:目录结构如下:
1)对eureka-server进行改造,使用docker-maven-plugin插件构建docker自己的镜像。左边是工程的pom.xml文件,右边是工程的application.yml文件。
在application.yml文件中,不需要再配置defaultZone这个属性了,需要设置prefer-ip-address属性为true, 为true后可以将IP地址直接注册到eureka-server中,根据spring.application.name属性进行通信。在pom.xml文件中,<dockerDirectory>标签内放入docker文件的路径,docker文件内容如下:
FROM:从仓库里边下载一个模板镜像,自己所做的eureka-server镜像就是在这个模板镜像基础上改造或“添油加醋”来的。
VOLUMN:宿主机共享镜像产生文件的路径,允许宿主机和镜像可以访问,一般是镜像有持久化需求的时候设置该路径,比如将容器写日志写入/tmp中,通过宿主机就能直接访问日志。
ADD:将项目根据pom.xml规则生成的jar包复制到镜像中。add source dest:这里的source必须和pom.xml中配置的项目名称完全一致。我的配置如下:

ENTRYPOINT: docker启动时执行的命令
EXPOSE:容器对外的端口号,不一定是容器开放的端口,容器内部映射出来的端口号。
以上配置完成之后,切换到pom.xml文件所在的文件夹(即项目根目录),执行如下命令,调用docker-maven插件生成本地镜像。执行命令如下:
mvn clean
#构建eureka-server镜像
mvn package docker:build
执行完成之后,这个过程比较久,如果显示:

则镜像创建成功,可通过: docker image ls查看是否在镜像列表中。
一般都不是一下子成功的,我这边卡了很久,一直提示出错:no such file or directory。参考网上说的,说是路径错误或者文件名称写错,jar包文件名称和pom.xml中不一致等各种解释,我这边试了好像都是不行。然后瞎折腾,不小心可以了,可以参考第二部分:过程中的坑。
2)对hi-service进行改造,pom.xml文件和Dockerfile文件都是一致的,别忘了改下服务名称和jar包的名称。hi-service的application.yml文件如下图:
需要注意的是,这里的defaultZone不能写IP地址了,要改为eureka-server,即注册中心的地址。
然后创建镜像的命令和上一部分是一样的,这里不再重复。
查看镜像列表:docker image ls

2、启动容器
接下来就比较简单了,启动容器:
#启动注册中心,--name属性标记容器名称为eureka-server,
docker run --name eureka-server -p 8761:8761 -t eureka-server
#启动服务提供者,这里的--link后面的名称要和注册中心的--name属性必须保持一致
docker run --link eureka-server:8761 -p 8763:8763 -t hi-service
我这边之前采用的是下面这种模式,启动服务提供者的时候一直报错说找不到注册中心。
docker run -p 8761:8761 -t eureka-server
docker run -p 8763:8763 -t hi-service
至此,在ubuntu上访问浏览器,http://localhost:8763。
二、过程中的坑
1、从github上直接下载的工程如果直接执行的话,我感觉很多都会报错,最多的就是执行Dockerfile文件的第三步:
add 【source】 【destination】
报错:ADD failed: stat /var/lib/docker/tmp/docker-builderXXXXXX: no such file or dir
看着这个问题,应该就是【source]文件夹下找不到eureka-server-0.0.1.SNATSHOT.jar,这个文件在target目录(和src平级)下,不知道为什么docker总是自动去/var/lib/docker.....这个目录下去找,然后就找不到了。网上各种搜索都没找到怎么解决(可能是我搜索的关键字有问题),最后这么想的:既然jar包在target目录下,就把/src/main/docker/Dockfile文件直接也给拷贝到target目录下,然后把pom.xml文件中的dockerDirectory属性值由src/main/docker/改为target/,修改完之后再次执行命令:mvn package docker:build,发现居然打包成功了(虽然也报错了,但报错不一样了,应该是ADD通过了),然后这时候到target目录下居然找不到Dockerfile文件了,自动跑到target/docker/Dockerfile目录下了(这里说的不对,没复制Dockerfile文件之前就已经有了)。
完全不明白,不知道咋回事就ADD成功了,这是件可怕的事,查了下资料没效果,我就又给恢复过去了,即恢复到第一部分的截图,这时候再启动,直接就成功了!:

阴差阳错的,还不知道什么原因,这两天再琢磨琢磨看下咋回事。
趁着周末写了个简单的工程,集成了Eureka, Feign,Zuul,Hystrix等,准备给扔到docker上试下。

本文介绍了如何在Docker环境下部署Spring Cloud微服务项目,包括创建Docker镜像、启动容器,并分享了过程中遇到的坑和解决办法。重点讲述了通过docker-maven-plugin构建eureka-server和hi-service的Docker镜像,以及容器启动的步骤。在实践中,注意Dockerfile的配置,如ENTRYPOINT、EXPOSE等,以及解决ADD命令找不到文件的问题。

1565

被折叠的 条评论
为什么被折叠?



