基于Git的代码版本控制,能保证每个开发人员的开发成果得到有效的保护,不会发生因为其他人的“误操作”操作将自己辛辛苦苦写的代码删除,而且能够跟踪每一次的改动,能快速回滚到之前任一版本。 基于Docker镜像的版本控制,能保证应用服务的正常迭代更新,某一版本出问题了可以快速切换至其他镜像版本。
1,镜像仓库 镜像的版本控制,主要是通过给image加tag来区分。首先,我们需要一个镜像仓库,最好是私有仓库。目前国内阿里云和腾讯云都提供免费的私有镜像服务,当然,我们还可以自己搭建私有镜像仓库。
1.3,自建私有仓库 参考本人博客: docker私有仓库搭建
2, 上传镜像 以腾讯云镜像仓库为例。先开通镜像仓库,然后在命令行登录:
1 2 $ docker login --username=yourname -p=yourpassword ccr.ccs.tencentyun.com Login Succeeded
username:腾讯云账号,p为密码
本地镜像上传
1 2 $ sudo docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号] $ sudo docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
例如:
1 2 $ docker tag fof_api:v20170808 ccr.ccs.tencentyun.com/sk/api:v20170808 $ docker push ccr.ccs.tencentyun.com/sk/api:v20170808
3, 下载镜像 1 2 $ docker login --username=yourname -p=yourpassword ccr.ccs.tencentyun.com $ docker pull ccr.ccs.tencentyun.com/sk/api:v20170808
4,镜像制作 4.1 API镜像自动构建 API是基于python的Django框架编写的。在项目的根目录定义好Dockerfile和requirements.txt,具体参考docker版Django 。然后定义Shell脚本(make.sh):
1 2 3 4 5 6 7 8 9 10 11 # make.sh #!/bin/sh git pull echo "开始制作镜像..." image_tag=`date +%Y%m%d_%H%M` echo "当前时间:$image_tag" docker build -t ccr.ccs.tencentyun.com/sk/api:${image_tag} . echo "制作镜像成功!" docker login --username=yourname -p=yourpassword ccr.ccs.tencentyun.com docker push ccr.ccs.tencentyun.com/sk/api:${image_tag}
制作流程:
更新最新代码
制作镜像
镜像添加tag,这里tag是当前日期
上传镜像只腾讯云docker仓库
4.2 Web应用镜像自动构建 Web应用是用maven搭建的SpringMVC+MyBatis项目。打包生成war包可以通过maven命令行在服务器上执行。这里我们采用的服务器是centos7.3,java版本是1.8,maven版本是3.3.9。
1 2 3 4 5 6 7 $ mvn -v Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven home: /usr/local/apache-maven-3.3.9 Java version: 1.8.0_111, vendor: Oracle Corporation Java home: /usr/local/jdk1.8.0_111/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "3.10.0-514.21.2.el7.x86_64", arch: "amd64", family: "unix"
在服务器上安装好java,maven后,配置maven repository路径:apache-maven-3.3.9/conf/settings.xml
1 2 3 4 5 6 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>/your/path/apache-maven-3.3.9/repository</localRepository> ... </settings>
4.2.1 war包生成脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #mvn_on_centos.sh #!/bin/sh APP_PATH="/mydata/code/build/fofweb" cd ${APP_PATH}/dzmsoft-ccs mvn clean mvn install -DskipTests cd ${APP_PATH}/dzmsoft-ucs mvn clean mvn install -DskipTests cd ${APP_PATH}/fofeasy-base mvn clean mvn install -DskipTests cd ${APP_PATH}/fofeasy-backstage mvn clean mvn install -DskipTests cd ${APP_PATH}/fofeay-report mvn clean mvn install -DskipTests cd ${APP_PATH}/fofeasy mvn clean mvn install -DskipTests cd /mydata/code/deploy/web_war mkdir ./ROOT cd ROOT cp /mydata/code/build/fofweb/fofeasy/target/fofeasy.war . jar xvf fofeasy.war rm fofeasy.war cd .. rm ROOT.tar.gz tar czf ROOT.tar.gz ./ROOT rm -rf ROOT/
这里,我们先生成fofeasy.war包,然后将war包移到脚本所在目录解压,打包成tar.gz。
4.2.2 镜像制作及上传 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #make_power_image_on_centos.sh #!/bin/sh MVN_PATH="/mydata/code/deploy/web_war" echo "MVN_PATH:${MVN_PATH}" echo "开始生成WAR包..." ${MVN_PATH}/mvn_on_centos.sh echo "WAR包生成成功!" echo "复制War包到source目录" cp ${MVN_PATH}/ROOT.tar.gz source/ echo "复制完成" echo "开始制作镜像..." image_tag=`date +%Y%m%d` #_%H%M echo "当前时间:$image_tag" docker build -t ccr.ccs.tencentyun.com/sk/power:v${image_tag} . echo "制作镜像成功!" docker login --username=yourname -p=yourpassword ccr.ccs.tencentyun.com docker push ccr.ccs.tencentyun.com/sk/power:v${image_tag} echo "上传镜像成功!"
4.2.3 镜像自动制作-定时任务 编译一个调用shell脚本build.sh来管理以上两个构建镜像的sh文件,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/sh POWER_PATH="/mydata/code/deploy/fofpower/web" API_PATH="/mydata/code/build/fof_api" GIT_WEB_PATH="/mydata/code/build/fofweb" echo "fofweb:git pull..." cd ${GIT_WEB_PATH} git pull echo "Build fofpower..." cd ${POWER_PATH} ${POWER_PATH}/make_power_image_on_centos.sh echo "Build fof_api..." cd ${API_PATH} ${API_PATH}/make.sh echo `date +%Y-%m-%d` `date +%X` "制作完成" >> /mydata/code/build/console.txt
在cron中添加:
在行尾添加:
1 22 11 * * * cd /mydata/code/build/ && ./build.sh
定时任务每天11:22执行。
遇到在Shell sh下执行成功,在cron中确执行不成功的问题? 这是因为cron使用的环境变量不是系统的环境变量,而是自己的环境变量。 解决方法: 在sh脚本添加如下代码:1 2 #!bin/bash source /etc/profile
5,镜像使用 本地push镜像(需先登录)
1 $ docker push ccr.ccs.tencentyun.com/sk/api:[tag]
上传成果的镜像在镜像仓库能看到:
还可以在后台自动构建,关联github工程,指定Dockerfile,commit触发自动构建。
PS: commit触发自动构建,在阿里云和腾讯云上测试没成果,需手动构建。
参考
使用阿里云免费构建docker私有仓库 Centos 下maven的安装与配置~