Docker 安装 tomcat 部署 jenkins 最新版系统
1、环境准备
虚拟机系统 Ubuntu 18.04.5
Docker 已安装完成,查看安装的版本信息:
ERROR: Got permission denied ,说明 docker 需要 root 权限执行,切换到 root 权限后,查看版本信息,执行下面的指令:
# docker version
查看已经安装的本地镜像列表,输入如下指令:
# docker images
可以看到已安装了一些系统镜像,本文是要在 docker 上安装 tomcat 服务,然后在部署 jenkins 最新系统,下面就开始上手实操。
二、下载镜像
还继续使用 Ubuntu 操作系统,就下载个 Ubuntu 的镜像,先搜索查看一下可用的版本,使用如下指令:
# docker search ubuntu
拉取官方的镜像,使用如下指令:
# docker pull ubuntu
使用命令查看本地镜像列表,可以看到 ubuntu 镜像已拉到本地。
在本地 宿主机 先创建 /home/scm/tomcat 目录,并把相关安装包放在该目录下,也就是 tomcat & jdk 。
容器是在镜像的基础上来运行的,只有容器启动运行了,就可以登录到容器中进行任何操作,也就可以安装任何所需的软件或应用程序。
使用下面的指令启动容器:
# docker run -i -t -v /home/scm/tomcat/:/mnt/tools/ 7e0aa2 /bin/bash
执行指令相关参数说明:
- -i:表示以 “交互模式” 运行容器
- -t:表示容器启动后会进入其命令行
- -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
进入容器后,可以看到挂载到容器中的目录。
执行解压指令,解压 tomcat & jdk 软件包。
# tar -xvf jdk-8u251-linux-x64.tar.gz
# tar -xvf apache-tomcat-8.5.66.tar.gz
把解压目录移动到 /usr/local/ 目录下,
执行如下指令:
# mv jdk1.8.0_251 /usr/local/
# mv apache-tomcat-8.5.66 /usr/local/tomcat8.5.66
移动到指定的目录下后,编写个启动脚本,当启动容器时,运行该脚本就可以直接自动启动 tomcat 服务了。
下面在做什么操作,想必应该知道吧?
要编写一个启动脚本,必须得有上面的一步更新、安装操作后,才可以使用 vim 编辑器编写脚本。
启动脚本编写完成后,添加执行权限 # chmod a+x run.sh ,以上步骤全部操作完成后,即可先退出容器。
查看正在运行的容器,此时,应该看不到任何正在运行的程序,因为刚才已经使用 exit 命令退出了容器,此时容器处于停止状态,如上图所示。
记住以上 CONTAINER ID(容器 ID),随后将通过 容器 ID,创建一个可运行的 tomcat 镜像,执行如下指令:
# docker commit ebbe22 mytomcat:tomcat8
该容器的 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
执行指令相关参数说明:
- -d:表示以 “守护模式” 执行 /root/run.sh 脚本,此时 tomcat 控制台不会出现在输出终端上。
- -p:表示宿主机与容器的端口映射,此时将容器内部的默认 8080 端口映射为宿主机的 28080 端口,这样就向外界暴露了 28080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
- -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
- --name:表示容器名称,用一个有意义的名称命名即可。
容器已顺利启动了,进入到 tomcat 容器内,查看 tomcat 启动的相关进程及服务端口是否都正常。
可以看到启动的进程及服务端口都正常
在打开浏览器,通过映射容易的端口,就可以访问到容器内的 tomcat 服务了。
在下载个 probe.war 监控包小工具,Copy 到 tomcat 容器的 webapps 目录下,执行下面的指令:
# docker cp probe.war b246cd1:/usr/local/tomcat8.5.66/webapps
(还有另一种方法:使用挂载方式 #挂载的意思就是在宿主机上解压一个tomcat把这里面的webapps目录映射到docker内的tomcat容器中的webapps目录,这样直接把war包发送到宿主机的tomcat的webapps下面,docker的tomcat的webapps会共用此目录下的文件) 我上面是使用手动的方式 Copy 操作的。
war 包 Copy 到 tomcat 服务后,稍等几分钟,war 包会自动解析开,到时候就可以访问 probe 来监控管理 tomcat 服务了。
到此,Docker 里安装 tomcat 服务就顺利安装完成了。
准备好 jenkins.war 包,也可以按 probe.war 包的部署一样,直接 Copy 进容器指定目录下就可以了。
下面我将使用 probe 管理系统进行发布 jenkins.war 包到 tomcat 服务器进步部署。
选择最新的 war 包,然后点击 Deploy 按钮,等待几秒后就完成了部署。
如上图所示, Jenkins v2.277.4 最新版本已部署完成,点击进行访问。
可以看到 Jenkins 系统正常运行了,按提示操作完成设置。
自定义选择设置
设置完成,就成功登录到 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]#