基于Git的代碼版本控制,能保證每個開發人員的開發成果得到有效的保護,不會發生因為其他人的“誤操作”操作將自己辛辛苦苦寫的代碼刪除,而且能夠跟蹤每一次的改動,能快速回滾到之前任一版本。
基于Docker鏡像的版本控制,能保證應用服務的正常迭代更新,某一版本出問題了可以快速切換至其他鏡像版本。
1,鏡像倉庫
鏡像的版本控制,主要是通過給image加tag來區分。首先,我們需要一個鏡像倉庫,最好是私有倉庫。目前國內阿里云和騰訊云都提供免費的私有鏡像服務,當然,我們還可以自己搭建私有鏡像倉庫。
1.1,騰訊云鏡像倉庫:(https://console.qcloud.com/ccs)
1.2,阿里云鏡像倉庫:(https://cr.console.aliyun.com)
1.3,自建私有倉庫
參考本人博客: docker私有倉庫搭建
2, 上傳鏡像
以騰訊云鏡像倉庫為例。先開通鏡像倉庫,然后在命令行登錄:
$ docker login --username=yourname -p=yourpassword ccr.ccs.tencentyun.com
Login Succeeded
username:騰訊云賬號,p為密碼
本地鏡像上傳
$ sudo docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[鏡像版本號]
$ sudo docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[鏡像版本號]
例如:
$ docker tag fof_api:v20170808 ccr.ccs.tencentyun.com/sk/api:v20170808
$ docker push ccr.ccs.tencentyun.com/sk/api:v20170808
3, 下載鏡像
$ 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):
# 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。
$ 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
<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包生成腳本
#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 鏡像制作及上傳
#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 "上傳鏡像成功!"
5,鏡像使用
本地push鏡像(需先登錄)
$ docker push ccr.ccs.tencentyun.com/sk/api:[tag]
上傳成果的鏡像在鏡像倉庫能看到:
還可以在后臺自動構建,關聯github工程,指定Dockerfile,commit觸發自動構建。
PS: commit觸發自動構建,在阿里云和騰訊云上測試沒成果,需手動構建。