一种利用docker-compose配合脚本的快速部署方法
介绍
利用docker-compose服务编排,并编写脚本实现“一键”部署。包含jar包、前端、数据库、redis等各种中间件、第三方软件。通过简单的修改配置,实现不同项目的快速部署。。适用于小项目、传统项目,不支持分布式集群等。
一:快速部署操作流程
将项目文件包【project.tar】拷贝至服务器 ,如/home下:
① 解包:
tar -zxvf project.tar
解压完成后得到项目文件夹 project
② 赋权限:
chmod +x -R ./project
③ 修改配置:
进入项目文件夹
cd /project
vim run.sh
rootPath的值修改为run.sh所在的文件夹:
进入文件夹cd /service
vim docker-compose.env
修改为当前服务器IP,此处是jar包服务中配置文件的配置内容,通过读取环境变量实现:
④ 安装部署:
进入项目文件夹:
执行 ./install_docker_import_build.sh
等待执行完毕即部署完成,此脚本包含离线安装docker、导入镜像、构建容器一整套自动安装部署流程,无需多余操作,并已自动实现开机自启。
不必一个一个安装mysql、nacos、redis等服务,项目工程微服务也已编排好,极大的简便了部署流程。
目前支持CentOS
二:具体实现
2.1 目录&文件介绍
【docker】文件夹包含docker和docker-compose的安装文件,实现离线安装docker。
【env】文件夹是项目所需环境支撑的容器编排文件,如:MySQL、redis、nacos、jdk。
【front】文件夹是前端页面部署容器编排文件。
【service】文件夹是后端服务部署容器编排文件。
【images】文件夹包含所需镜像,可实现离线安装容器。
****.sh是各个运行脚本,
install_docker_import_build.sh 包含离线安装docker、导入镜像、构建容器一整套自动安装部署流程的操作。
import_build.sh 只包含导入镜像、构建容器的操作,首次执行前需要执行./install_docker.sh安装docker或手动在线安装docker。
build.sh 只有构建容器的操作,首次执行前需要安装docker并执行 ./import.sh 导入镜像。
之后用 ./run.sh 和 ./stop.sh 启停, ./restart.sh 重启。
./uninstall.sh 卸载docker容器
2.2 实现离线安装docker
docker/ce/x86_64中包含docker安装文件,docker文件夹中包含docker-compose安装文件和docker国内镜像配置文件。
2.3 实现批量导入镜像
images文件夹中包含项目所需软件的docker镜像
脚本参考网上批量导入镜像脚本:import.sh,可实现批量导入镜像。导入后docker就不必从网上缓慢的拉镜像了。可实现离线导入。
2.4 后端服务容器编排
service文件夹包含后端服务容器编排。
jar文件夹中包含项目所有的jar包
① docker-compose.env
docker-compose.env是项目配置环境变量,可在jar包中的配置文件和nacos中的配置引用,引用方式如下:
server-addr:
N
A
C
O
S
H
O
S
T
:
{NACOS_HOST}:
NACOSHOST:{NACOS_PORT}
或:
可实现在现场部署时,不必一个一个改配置,只需在docker-compose.env中统一修改。
② Dockerfile_***
利用Dockerfile将jar包打成docker容器。
FROM java:8-jdk
MAINTAINER niuyf
ADD ./jar/mky-projection-2.4.0.jar mky-projection-2.4.0.jar
EXPOSE 9911
ENTRYPOINT java ${JAVA_OPTS} -jar mky-projection-2.4.0.jar
配置大同小异,只需修改红框中的,每个jar包对应一个Dockerfile。
③ docker-compose.yml
对容器进行编排,每个服务对应一组
version: "3"
services:
mky-projection:
build:
context: .
dockerfile: Dockerfile_mky-projection-2.4.0
image: mky-projection
container_name: mky-projection-2.4.0
environment:
TZ: Asia/Shanghai
JAVA_OPTS: '-Xmx512m'
env_file: docker-compose.env
volumes:
- ./jar/mky-projection-2.4.0.jar:/mky-projection-2.4.0.jar
ports:
- "9911:9911"
network_mode: host
ruoyi-gateway:
build:
context: .
dockerfile: Dockerfile_ruoyi-gateway
image: ruoyi-gateway
container_name: ruoyi-gateway
environment:
TZ: Asia/Shanghai
JAVA_OPTS: '-Xmx512m'
env_file: docker-compose.env
volumes:
- ./jar/ruoyi-gateway.jar:/ruoyi-gateway.jar
ports:
- "10004:10004"
network_mode: host
...
只需修改红框中的内容:
2.5 项目环境相关软件容器编排
env文件夹中包含项目环境相关软件的容器编排
(nacos-mysql.sql是nacos的初始数据库文件,目前nacos采用文件持久化配置的方式,nacos-mysql.sql没用;如需使用数据库持久化,需要改docker-compose.yml中的配置)
data文件夹是docker映射出来的volumes数据卷。
2.6 前端容器编排
front文件夹中包含前端容器编排。
dist文件夹是前端打包后的文件,映射到docker中,Dockerfile_front使用nginx构建容器。
nginx.conf是docker映射出来的nginx配置文件。
2.7 脚本说明
① install_docker_import_build.sh
包含离线安装docker、导入镜像、构建容器一整套安装部署流程的操作。
#!/bin/bash
chmod +x -R ./
########安装docker###########
./install_docker.sh
########安装docker-compose完成###########
########导入镜像###########
./import.sh
########导入镜像完成###########
########构建项目容器并注册为服务运行###########
./build.sh
########构建项目容器并注册为服务运行完成###########
另有单独的脚本,可分别实现各个操作,如install_docker.sh、import.sh、build.sh,以下详细介绍。
② install_docker.sh
实现离线安装docker和docker-compose
#!/bin/bash
chmod +x -R ./
#!/bin/bash
########安装docker###########
echo "==========开始安装docker=========="
get_arch=`arch`
if [[ $get_arch =~ "x86_64" ]];then
echo "this is x86_64"
rpm -ivh ./docker/ce/x86_64/docker-scan-plugin-0.12.0-3.el7.x86_64.rpm --force --nodeps
rpm -ivh ./docker/ce/x86_64/container-selinux-2.107-3.el7.noarch.rpm --force --nodeps
rpm -ivh ./docker/ce/x86_64/docker-ce-cli-20.10.12-3.el7.x86_64.rpm --force --nodeps
rpm -ivh ./docker/ce/x86_64/containerd.io-1.4.12-3.1.el7.x86_64.rpm --force --nodeps
rpm -ivh ./docker/ce/x86_64/docker-ce-20.10.12-3.el7.x86_64.rpm --force --nodeps
elif [[ $get_arch =~ "aarch64" ]];then
echo "this is arm64"
rpm -ivh ./docker/ce/aarch64/container-selinux-2.107-3.el7.noarch.rpm --force --nodeps
rpm -ivh ./docker/ce/aarch64/docker-ce-cli-20.10.12-3.el7.x86_64.rpm --force --nodeps
rpm -ivh ./docker/ce/aarch64/containerd.io-1.4.12-3.1.el7.x86_64.rpm --force --nodeps
rpm -ivh ./docker/ce/aarch64/docker-ce-20.10.12-3.el7.x86_64.rpm --force --nodeps
elif [[ $get_arch =~ "mips64" ]];then
echo "this is mips64"
else
echo "unknown!!"
fi
rm -rf /etc/docker/
mkdir /etc/docker/
cp ./docker/daemon.json /etc/docker/daemon.json
systemctl daemon-reload
systemctl enable docker
systemctl start docker
echo "==========docker安装完成=========="
########安装docker完成###########
########安装docker-compose###########
cp ./docker/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
echo "==========docker-compose安装完成=========="
########安装docker-compose完成###########
③ import.sh
#!/bin/sh
chmod +x -R ./
STATE=""
RECEIVE=$1
TARDIR="./images"
SUFFIX="*.tar"
LIST=`ls $TARDIR/$SUFFIX`
LOGFILE=$TARDIR/import.error.`date +%Y%m%d`.log
BAKLOGFILE=$TARDIR/bak.`date +%Y%m%d`.log
STATEIMPORT() {
for i in $STATE
do
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}
RECEIVEIMPORT() {
for i in $RECEIVE
do
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}
LISTIMPORT() {
for i in $LIST
do
echo 开始导入:$i
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}
IMAGESBAK(){
IMGINFO=`docker images |awk '{print $1,$2,$3}'|sed 1d >> $TARDIR/tmp.txt`
RESLIST=`/usr/bin/cat $TARDIR/tmp.txt |awk '{print $1}' `
for i in $RESLIST
do
RESTAG=`docker images |grep "$i" |awk '{a=$1":"$2;print a }'`
BAKNAME=`docker images |grep "$i" |awk '{a=$1":"$2;print a }'|sed 's/\//_/g'`
/usr/bin/docker save $RESTAG -o $TARDIR/$BAKNAME_`date +%Y%m%d`.tar >/dev/null 2>>$BAKLOGFILE
done
if [ -s $BAKLOGFILE ]
then
echo -e "\033[31mERROR:Images Backup Failed!\033[0m"
echo -e "\033[31mPlease View The Log Lile : $BAKLOGFILE\033[0m"
else
/usr/bin/rm -f $BAKLOGFILE
fi
/usr/bin/rm -f $TARDIR/tmp.txt
}
/usr/bin/rm -f $TARDIR/*.log
#read -p "Whether to backup the current images(输入n导入镜像,需要消耗一定的时间)[y/n]:" INPUT
#if [[ $INPUT = "y" ]] || [[ $INPUT = "Y" ]]
#then
# IMAGESBAK
#else
# if [[ -n "$RECEIVE" ]] || [[ -n "$STATE" ]]
# then
# if [ -n "$RECEIVE" ]
# then
# RECEIVEIMPORT
# else
# STATEIMPORT
# fi
# else
echo "==========开始导入镜像=========="
LISTIMPORT
# fi
#fi
##ERROR Output
if [ -s $LOGFILE ]
then
echo -e "\033[31mERROR:Images Import Failed!\033[0m"
echo -e "\033[31mPlease View The Log Lile : $LOGFILE\033[0m"
else
/usr/bin/rm -f $LOGFILE
fi
echo "==========导入镜像完成=========="
实现批量导入镜像。
④ build.sh
echo "==========开始构建容器=========="
chmod +x -R ./
TZ='Asia/Shanghai'; export TZ
cd ./env
docker-compose up -d --build
sleep 60
cd ../service
docker-compose up -d --build
cd ../front
docker-compose up -d --build
echo "==========构建容器完成=========="
cd ..
chmod +x run.sh
cp run.sh /etc/init.d/
chkconfig --add run.sh
此处sleep 60是为了避免nacos等环境未启动时就启动jar包服务,导致jar包启动失败的情况。
⑤ run.sh
实现启动项目所有容器,也是注册为服务的脚本,实现开启自启。
#!/bin/bash
# chkconfig: 2345 10 90
# description: resind
#配置run.sh所在目录
export rootPath=/home/tim-wh-project/
cd $rootPath/env
docker-compose up -d
sleep 120
cd $rootPath/service
docker-compose up -d
cd $rootPath/front
docker-compose up -d
echo "==========运行成功=========="
修改rootPath的值是为了此脚本注册为服务后仍然可以找到项目文件。
⑥ uninstall.sh
卸载容器。
echo "==========开始卸载容器=========="
chkconfig --del run.sh
cd ./env
docker-compose down
cd ../service
docker-compose down
cd ../front
docker-compose down
echo "==========卸载容器完成=========="
⑦ stop
停止运行容器。
cd ./env
docker-compose stop
cd ../service
docker-compose stop
cd ../front
docker-compose stop
echo "==========停止容器=========="
⑧ restart
重启容器。
cd ./env
docker-compose restart
sleep 60
cd ../service
docker-compose restart
cd ../front
docker-compose restart