Docker 安装 tomcat 部署 jenkins 最新版系统

1、环境准备

虚拟机系统 Ubuntu 18.04.5

Docker 安装 tomcat 部署 jenkins 最新版系统_jenkins

Docker 已安装完成,查看安装的版本信息:

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_02

ERROR: Got permission denied  ,说明 docker 需要 root 权限执行,切换到 root 权限后,查看版本信息,执行下面的指令:

# docker version

Docker 安装 tomcat 部署 jenkins 最新版系统_ubuntu_03

查看已经安装的本地镜像列表,输入如下指令:

# docker images

Docker 安装 tomcat 部署 jenkins 最新版系统_ubuntu_04

可以看到已安装了一些系统镜像,本文是要在 docker 上安装 tomcat 服务,然后在部署 jenkins 最新系统,下面就开始上手实操。

二、下载镜像

还继续使用 Ubuntu 操作系统,就下载个 Ubuntu 的镜像,先搜索查看一下可用的版本,使用如下指令:

# docker search ubuntu

Docker 安装 tomcat 部署 jenkins 最新版系统_ubuntu_05

拉取官方的镜像,使用如下指令:

# docker pull ubuntu

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_06

使用命令查看本地镜像列表,可以看到 ubuntu 镜像已拉到本地。

  在本地 宿主机 先创建 /home/scm/tomcat 目录,并把相关安装包放在该目录下,也就是 tomcat & jdk 。

Docker 安装 tomcat 部署 jenkins 最新版系统_apache_07

容器是在镜像的基础上来运行的,只有容器启动运行了,就可以登录到容器中进行任何操作,也就可以安装任何所需的软件或应用程序。

使用下面的指令启动容器:

# docker run -i -t -v /home/scm/tomcat/:/mnt/tools/ 7e0aa2 /bin/bash

Docker 安装 tomcat 部署 jenkins 最新版系统_apache_08

执行指令相关参数说明:


  • -i:表示以 “交互模式” 运行容器
  • -t:表示容器启动后会进入其命令行
  • -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

进入容器后,可以看到挂载到容器中的目录。

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_09

执行解压指令,解压 tomcat & jdk 软件包

# tar -xvf jdk-8u251-linux-x64.tar.gz

# tar -xvf apache-tomcat-8.5.66.tar.gz

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_10

把解压目录移动到 /usr/local/ 目录下,

执行如下指令:

# mv jdk1.8.0_251 /usr/local/ 

# mv apache-tomcat-8.5.66 /usr/local/tomcat8.5.66

Docker 安装 tomcat 部署 jenkins 最新版系统_jenkins_11

移动到指定的目录下后,编写个启动脚本,当启动容器时,运行该脚本就可以直接自动启动 tomcat 服务了。

下面在做什么操作,想必应该知道吧?

Docker 安装 tomcat 部署 jenkins 最新版系统_apache_12

要编写一个启动脚本,必须得有上面的一步更新、安装操作后,才可以使用 vim 编辑器编写脚本。

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_13

启动脚本编写完成后,添加执行权限 # chmod a+x run.sh  ,以上步骤全部操作完成后,即可先退出容器。

Docker 安装 tomcat 部署 jenkins 最新版系统_apache_14

查看正在运行的容器,此时,应该看不到任何正在运行的程序,因为刚才已经使用 exit 命令退出了容器,此时容器处于停止状态,如上图所示。

记住以上 CONTAINER ID(容器 ID),随后将通过 容器 ID,创建一个可运行的 tomcat 镜像,执行如下指令:

# docker commit ebbe22 mytomcat:tomcat8

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_15

该容器的 ID 是 ebbe22d1edba ,自定义创建的镜像名是 “mytomcat:tomcat8”,随后可使用镜像来启动 tomcat8 容器。

三、启动容器

可以通过 “镜像名” 或 “镜像 ID” 来启动容器,与上次启动容器不同的是,现在不再进入容器的命令行,而是直接启动容器内部安装好的 tomcat 服务。

执行以下指令即可:

# docker run -d -p 28080:8080 -v /home/scm/tomcat/webapps/:/usr/local/tomcat8.5.66/webapps/ --name mytomcat_1 mytomcat:tomcat8 /root/run.sh

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_16


执行指令相关参数说明:


  • -d:表示以 “守护模式” 执行 /root/run.sh 脚本,此时 tomcat  控制台不会出现在输出终端上。
  • -p:表示宿主机与容器的端口映射,此时将容器内部的默认 8080 端口映射为宿主机的 28080 端口,这样就向外界暴露了 28080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
  • -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
  • --name:表示容器名称,用一个有意义的名称命名即可。

容器已顺利启动了,进入到 tomcat 容器内,查看 tomcat 启动的相关进程及服务端口是否都正常。

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_17

可以看到启动的进程及服务端口都正常

在打开浏览器,通过映射容易的端口,就可以访问到容器内的 tomcat 服务了。

Docker 安装 tomcat 部署 jenkins 最新版系统_jenkins_18


在下载个 probe.war 监控包小工具,Copy 到 tomcat 容器的 webapps 目录下,执行下面的指令:

# docker cp probe.war b246cd1:/usr/local/tomcat8.5.66/webapps

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_19

(还有另一种方法:使用挂载方式 #挂载的意思就是在宿主机上解压一个tomcat把这里面的webapps目录映射到docker内的tomcat容器中的webapps目录,这样直接把war包发送到宿主机的tomcat的webapps下面,docker的tomcat的webapps会共用此目录下的文件) 我上面是使用手动的方式 Copy 操作的。


war 包 Copy 到 tomcat 服务后,稍等几分钟,war 包会自动解析开,到时候就可以访问 probe 来监控管理 tomcat 服务了。

Docker 安装 tomcat 部署 jenkins 最新版系统_ubuntu_20

到此,Docker 里安装 tomcat 服务就顺利安装完成了。

准备好 jenkins.war 包,也可以按 probe.war  包的部署一样,直接 Copy 进容器指定目录下就可以了。

下面我将使用 probe 管理系统进行发布 jenkins.war 包到 tomcat 服务器进步部署。

Docker 安装 tomcat 部署 jenkins 最新版系统_apache_21

选择最新的 war 包,然后点击 Deploy 按钮,等待几秒后就完成了部署。

Docker 安装 tomcat 部署 jenkins 最新版系统_jdk_22

如上图所示, Jenkins v2.277.4   最新版本已部署完成,点击进行访问。

Docker 安装 tomcat 部署 jenkins 最新版系统_ubuntu_23

可以看到 Jenkins 系统正常运行了,按提示操作完成设置。

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_24

自定义选择设置

Docker 安装 tomcat 部署 jenkins 最新版系统_tomcat_25

设置完成,就成功登录到 Jenkins 系统了,到此,也全部完成 Docker 安装 tomcat 部署 jenkins 最新版系统。


一键启动脚本

# cat autojenkins.sh 

#!/bin/bash -x
#set -ex

#get cur_time
cur_time=$(date +%F-%H%M%S)
month=$(date +%Y%m)

WORK_HOME=$(pwd)
PID=`ps -ef | grep 'jenkins.war' | grep -v grep | awk '{print $2}'`
if [[ "" !=  "$PID" ]]; then
  echo "killing jenkins : $PID"
  kill -9 $PID
fi

sleep 1

LOGS_DIR=/home/scm/jenkins/logs

MAIN_JAR="-jar jenkins.war --httpPort=19090"
JAVA_ARGS="-server -Xms1024m -Xmx1024m -XX:NewSize=1500m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintHeapAtGC  -XX:ThreadStackSize=512 -Xloggc:${LOGS_DIR}/gc.log"

nohup java ${JAVA_ARGS} ${MAIN_JAR} 1>>${LOGS_DIR}/stout.log 2>>${LOGS_DIR}/error.log &

echo "startup jenkins ..."



[root@node2 scm]#

一键脚本二

# cat Jenkins.sh 

#!/bin/bash
#set -ex

cur_time=$(date +%F-%H%M%S)
month=$(date +%Y%m)

WORK_HOME=$(pwd)
JENKINS_WORKSPACE=/home/scm/jenkins
LOGS_DIR=/logs
MAIN_JAR="-server -Xms1024m -Xmx1024m -XX:NewSize=1500m -jar jenkins.war --httpPort=19090"
JENKINS_PACKAGE=jenkins.war

#停止方法

stop(){

echo "Stoping $JENKINS_PACKAGE"
ps -ef|grep $JENKINS_PACKAGE | awk '{print $2}'| while read pid

do

kill -9 $pid
echo " $pid kill"

done

}

case "$1" in

start)

echo "Starting $JENKINS_PACKAGE"

#nohup ${WORK_HOME}/startJenkins.sh >> $JENKINS_WORKSPACE/start.log 2>&1 &
nohup java ${MAIN_JAR}  1>>$JENKINS_WORKSPACE/${LOGS_DIR}/stout.log 2>>$JENKINS_WORKSPACE/${LOGS_DIR}/error.log &

;;

stop)

stop

;;

restart)

stop

start

;;

status)

ps -ef|grep $JENKINS_PACKAGE

;;

*)

printf 'Usage: %s {start|stop|restart|status}\n' "$prog"

exit 1

;;

esac
echo "start jenkins...."
[root@node2 scm]#

一键脚本三

# cat startjenkins.sh 

#!/bin/bash -x

# 在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出
set -eu

# 检查参数个数
if [ "${#}" -lt 1 ]; then
	
   echo "\033[41;37m 脚本使用示例: sh startjenkins.sh start|stop|restart  \033[0m"
   exit
fi

# 获取脚本第一个参数
APP_OPT=${1}
# 端口
APP_PORT=19090
# 名称
APP_NAME=jenkins
# jar名 | war名
APP_JAR=${APP_NAME}.war
# 程序根目录
APP_JAR_HOME=/home/scm
# 日志名
APP_LOG_NAME=jenkins
# 日志根目录
APP_LOG_HOME=/home/scm/jenkins/logs
# 程序运行参数
JAVA_OPTS="--httpPort=${APP_PORT} --ajp13Port=-1 --prefix=/home/scm/jenkins"

echo "本次操作服务名:[${APP_NAME}]"
echo "本次操作选择:[${APP_OPT}]"

# 停止
function stop(){
  echo "<-------------------------------------->"
  echo "[${APP_NAME}] ... stop ..."
  # 查看该jar进程
  pid=`ps -ef | grep ${APP_JAR} | grep -v 'grep' | awk '{print $2}'`
  echo "[${APP_NAME}] pid="${pid}
  # 存在则kill,不存在打印一下吧
  if [ "${pid}" ]; then
    kill -9 ${pid}
      # 检查kill是否成功
      if [ "$?" -eq 0 ]; then
          echo "[${APP_NAME}] stop success"
      else
          echo "[${APP_NAME}] stop fail"
      fi
  else
    echo "[${APP_NAME}] 进程不存在"
  fi
}


# 运行
function start(){
  echo "<-------------------------------------->"
  echo "[${APP_NAME}] ... start ..."
  cd ${APP_JAR_HOME}
  echo "当前路径:`pwd`"
  # 赋予可读可写可执行权限
  chmod 777 ${APP_JAR}
  echo "启动命令: nohup java -jar ${APP_JAR} ${JAVA_OPTS} >> ${APP_LOG_HOME}/${APP_NAME}.log 2>&1 &"
  nohup java -jar ${APP_JAR} ${JAVA_OPTS} >> ${APP_LOG_HOME}/${APP_NAME}.log 2>&1 &
  if [ "$?" -eq 0 ]; then
    echo "[${APP_NAME}] start success"
  else
    echo "[${APP_NAME}] start fail"
  fi
}


# 重启
function restart(){
  echo "<-------------------------------------->"
  echo "[${APP_NAME}] ... restart ..."
	stop
	start
}


# 多分支条件判断执行参数
case "${APP_OPT}" in
	"stop")
		stop
		;;
	"start")
		start
		;;
	"restart")
		restart
		;;
	*)
	echo "\033[41;37m 提示:不支持参数 命令 -> ${APP_OPT} \033[0m"
	;;
esac

[root@node2 scm]#