一种利用docker-compose的快速部署方法

一种利用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值