转载至:http://blog.itpub.net/7607759/viewspace-2134637/ 侵删
root@docker01:~# vi /data/dockerfiles/scripts/deploy.sh
#!/bin/bash ############################################ # this script function is : # deploy new docker container # # USER YYYY-MM-DD - ACTION # kaka 2020-07-01 - CREATED # ############################################ parasnum=5 # function help_msg() { cat << help +----------------------------------------------------+ + Error Cause: + you enter $# parameters + the total paramenter number must be $parasnum + 1st :DOCKER_NAME + 2nd :PROJECT_NAME + 3rd :PROJECT_VERSION + 4th :SOURCE_PORT + 5th :DESTINATION_PORT +----------------------------------------------------+ help } # ---------------------------------------------------- # Check parameter number # ---------------------------------------------------- if [ $# -ne ${parasnum} ] then help_msg exit fi # ---------------------------------------------------- # Initialize the parameter. # ---------------------------------------------------- DOCKER_NAME=$1 PROJECT_NAME=$2 PROJ_VERSION=$3 SPORT=$4 DPORT=$5 PROJ_VERSION=${PROJ_VERSION/"origin/"/""} DOCKER_FILE="/data/dockerfiles/${DOCKER_NAME}/Dockerfile" DOCKER_FILE_DIR=/data/dockerfiles/${DOCKER_NAME} if [ ! -d ${DOCKER_FILE_DIR} ]; then mkdir -p ${DOCKER_FILE_DIR} fi # ---------------------------------------------------- # check docker images # ---------------------------------------------------- DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'` if [ -n "${DOCKER_IMAGE}" ]; then # check docker container for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'` do echo "Stop container: ${dc}" /usr/bin/docker stop ${dc} # delete while docker container was exists echo "##Delete exists Container_Id: "${dc} /usr/bin/docker rm ${dc} done # delete while docker image was exists echo "##Delete exists Image: "${DOCKER_IMAGE} /usr/bin/docker rmi ${DOCKER_IMAGE} fi echo "" # ---------------------------------------------------- # Init dockerfile # ---------------------------------------------------- echo "**Init dockerfile start: "${DOCKER_FILE} echo "FROM tomcat" > ${DOCKER_FILE} echo 'MAINTAINER junsansi "junsansi@sina.com"' >> ${DOCKER_FILE} echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE} echo "EXPOSE 8080" >> ${DOCKER_FILE} echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE} cat ${DOCKER_FILE} echo "**Init dockerfile end." # ---------------------------------------------------- # Build dockerfile # ---------------------------------------------------- cd ${DOCKER_FILE_DIR} rm *.war -rf mv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./ echo "" echo "##Build dockerfile for "${DOCKER_NAME} /usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . # ---------------------------------------------------- # Run docker container # ---------------------------------------------------- echo "" echo "##Running docker container: "${DOCKER_NAME} /usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION} #/usr/bin/docker run ${cmd} echo ""为该脚本增加运行权限:
root@docker01:~# chmod +x /data/dockerfiles/scripts/deploy.sh
修改属主为docker用户:
root@docker01:~# chown docker:docker /data/dockerfiles -R
Maven Configuration JDK Git Maven
具体的配置过程,界面已经非常直观,这里就不演示了。
接下来要配置SSH Servers。在本例中,我们要部署和运行docker容器的服务器是172.19.10.157,因此我们需要在系统设置中,配置通过SSH连接该服务器的访问用户名和密码,如下所示:
系统管理->系统设置->Publish over SSH
如果有多个服务器可用于发布,那么可以一次性都添加进去。 五、Jenkins中创建和配置发布任务 在Jenkins主界面右侧,点击“创建一个新任务”,在页面上输出项目名称(名称完全由操作者自定义),这里我们选择构建的是MAVEN项目:
在《通用设置》中操作如下:
选中丢弃旧的构建->保持构建的最大个数为10个;
选中参数化构建->选择Git Parameter->定义名称为release_branch,因为我们内部应用的发布管理都是基于分支的,因此选择参数类型为Branch:
在《源码管理》中选择Git,根据实际情况指定仓库地址和鉴权证书,Branches那里修改为前面定义的$release_branch参数名称,具体设置如下图所示:
在《Build》设置中设置Goals and options选项值为:clean package -DskipTests=true,当然,这里您也可以根据您的项目实际情况进行设置:
在《构建后操作》中选择“Send build artifacts over SSH”,通过SSH发送文件到远端,并执行远端服务器命令,配置如下:
配置操作完成之后点击左下角“保存”按钮。
点击左侧“Build with Parameters”,在随后出现的页面中选择要构建项目的版本,这里目前仅只有一个版本,不管,先选中它,而后点击开始构建:
执行部署,我们可以通过当前正在构建任务的“Console Output”来获取任务的执行情况,例如,本次构建过程中的输出日志摘要如下:
通过日志可以看到,容器创建和启动均已成功,接下来就可以通过浏览器访问该docker中运行的工程了:
竣工! 六、Jenkins中将同一个服务发布到多个容器
如果你有多个工程,需要部署到不同的服务器,那么参照前面2-6小节中的步骤,对目标服务器和项目进行适当配置即可。
如果你有一个工程,需要以集群方式部署到多个服务器,那么参照前面4-5小节中的步骤,新增SSH服务器,而后在“构建后操作”中加入对该服务器的部署步骤即可。
如果你有一个工程,需要以集群方式部署多个容器,那么我来演示一下嘛,尽管我们当前没有多余的服务器,不过通过docker宿主机演示这样的过程还是没什么问题。
我们仍然进入到“first_docker_project”这个项目的配置页面,在“构建后操作”设置中,点击“Add Server”新增一台服务器,配置如下 :
如果是部署到不同的服务器,那么此处只需要选择适当的SSH Server即可,不过当前的演示环境只有一台服务器,那么SSH Server还是172.19.10.157,只是要对Remote Directory和Exec command两项配置中的参数做适当调整,以避免路径冲突。
修改完成后点击保存,然后再次尝试构建,注意观察日志,等看到SUCCESS提示之后,同一个项目就被成功发布到两个容器中了。
登录到docker宿主机查看一下容器的状态:
docker@docker01:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed763842395e first_docker_proj02:master "/bin/sh -c '/usr/..." 18 seconds ago Up 17 seconds 0.0.0.0:12000->8080/tcp first_docker_proj02_d1
6a907dfae707 first_docker_proj01:master "/bin/sh -c '/usr/..." 19 seconds ago Up 18 seconds 0.0.0.0:11000->8080/tcp first_docker_proj01_d1
docker@docker01:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
first_docker_proj01 master 4adbac00f9ed 21 seconds ago 355 MB
first_docker_proj02 master 4adbac00f9ed 21 seconds ago 355 MB
tomcat latest 99765a0d7f44 2 days ago 355 MB