持续集成
配置jenkins构建项目,自动build出docker镜像,发布到docker私库中,或者从目标服务器中启动容器。
Maven的Docker插件
http://www.cnblogs.com/skyblog/p/5163691.html 有讲到如何用Dockerfile构建,下面是采用Maven插件的方式构建,插件的文档在这里
Dockerfile文件在src/main/docker/Dockerfile
内容如下
|
|
https://spring.io/guides/gs/spring-boot-docker/
特别解释一下ENTRYPOINT
指令,docker run
命令中的参数都会传递给ENTRYPOINT
指令。
执行docker run -d pin-user --config.host=localhost
启动容器。
会把–config.host加在ENTRYPOINT
后面,相当于执行了java -Djava.security.egd=file:/dev/./urandom -jar /app.jar --config.host=localhost
。有了这个参数后我们就能很方便的控制环境和配置文件了。
配置jenkins
jenkins中新建一个项目,配置好git后,执行目标服务器的一个shell脚本来启动容器。
然后开始构建项目,因为在pom.xml
配置中绑定了docker:build
到package
命令中,所以会自动执行docker:build
,这里遇到了一个docker命令的权限问题,jenkins抛出一个错误。
在jenkins所在的服务器上执行以下命令查看jenkins用户组
|
|
将jenkins用户加入到docker组中。
|
|
再构建,权限问题没有了,但是我又得到另外一个错误
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.3.258:build (default) on project pin-user: Exception caught: Error getting container 1e509efd653d0a3a942bf5ef34601305b7301d64378381614b55d3f5f88c7166 from driver devicemapper: open /dev/mapper/docker-202:33-5767218-1e509efd653d0a3a942bf5ef34601305b7301d64378381614b55d3f5f88c7166: no such file or directory
说是因为docker在centos下的存储驱动原因,我这里试试把devicemapper换成btrfs。在centos下只能选择这2种方式。
需要把docker使用的分区的文件系统换掉。这一步会镜像会被全部清除掉,记得备份镜像,因为我是测试环境,所以镜像全部丢了也无所谓。教程如下。
|
|
提示divice busy。下面命令把相关进程kill掉再umount
|
|
再执行这个命令。
|
|
完事后再挂载回去
|
|
还是提示busy,reboot重启下,再mount。
然后在/etc/sysconfig/docker
加上--storage-driver btrfs
参数。
|
|
重启docker,再执行docker info
就看到docker的存储驱动已经变了
启动docker容器的时候报错了,把/var/lib/docker/linkgraph.db
删了
因为我在/etc/sysconfig/docker
修改了docker的目录。
所以我这里是目录是/mnt2/apps/docker/linkgraph.db
。
service restart docker
重启下docker即可。
现在再用jenkins构建和发布就没有错误了。
启动脚本
|
|
下面我解释一下这个启动docker容器的脚本。
脚本后面跟了3个参数,一个是镜像名称,一个是端口号,一个是启动容器加在ENTRYPOINT
的项目配置。
先找出之前镜像对应的containerId,把它删除掉,然后再用新的镜像启动容器。
可能最好的方式还是每次用不同的tag来build镜像,不过我这里就偷懒了,等到发布到生产环境的时候再指定吧。
注意到"--config.profile=dev --config.host=10.168.248.36"
这个参数配合ENTRYPOINT
就可以针对生产环境和测试环境加载不同的配置文件了。
项目中的配置文件:
|
|
到此我们的一个基本的spring-cloud项目实践就完成了,其他特性和功能自行选择后再添加就可以了。
我接下来要继续加入的模块就是使用API网关构建微服务。概念如下
http://www.infoq.com/cn/articles/construct-micro-service-using-api-gateway/