【工作记录】基于docker-compose快速部署springboot应用的实践

news/2024/11/25 13:33:29/

前言

毋庸置疑,容器化部署已经是近两年的大趋势了。

本文介绍基于docker-compose快速实现springboot单体应用的容器化部署操作实践,应用使用开源的可视化爬虫spiderflow

当然也可以通过其他方式可以完成部署,本文也只是提供一种思路。

关于spiderflow的使用可以参考之前的文章: 可视化爬虫框架spiderflow入门及实战_spider-flow_泽济天下的博客-CSDN博客

docker-compose

介绍

Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。

通过 Docker-Compose ,不需要使用shell脚本来启动容器,而使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令,根据 YAML 的文件配置创建并启动所有服务。

docker-compose.yml配置简介

Docker-Compose 将所管理的容器分为三层

  • 工程(project):一个工程包含多个服务
  • 服务(service):一个服务当中可包括多个容器实例
  • 容器(container)
    Docker-Compose 运行目录下的所有文件(docker-compose.yml、extends文件 或 环境变量文件等)组成一个工程,若无特殊指定 工程名即为当前目录名。

Docker Compose 的核心就是其配置文件,采用 YAML 格式,默认为 docker-compose.yml 。

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

一个服务当中可包括多个容器实例,但是:Docker-Compose 并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul 技术。

Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量 COMPOSB_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目 (project)。

docker-compose.yml基本结构如下:

version: '2.4'
services:web:images: nginxvolumns:- xxx: xxx- xxx: xxxports:- "10010:10010"environments:- spring.profiles.active=prodlinks:- mysql- redisdepends_on:- mysql- rediscommand: java -jar xxx.jar

以上yml文件只展示了一个service的配置,实际使用时可以有多个。

常用配置项如下:

配置key配置说明
images镜像名,如果本地不存在会尝试从网络拉取
volumns挂载配置 接受数组参数,可参考上文示例
network网络配置
ports端口映射关系,容器内部端口和宿主机端口映射关系
environments环境变量
links引用的容器声明
depends_oin依赖的容器
command执行命令
restart重启方式
container_name容器名称

熟悉docker使用的朋友应该会发现这些配置和直接使用docker run命令启动容器基本都能对应上。这不是本文重点,不再赘述。

常用命令

命令格式命令说明
docker-compose 命令 --help获得一个命令的帮助
docker-compose up -d nginx构建启动nignx容器
docker-compose exec nginx bash登录到nginx容器中
docker-compose down此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose ps列出项目中目前的所有容器
docker-compose restart nginx重新启动nginx容器
docker-compose build nginx构建镜像
docker-compose build --no-cache nginx不带缓存的构建
docker-compose top查看各个服务容器内运行的进程
docker-compose logs -f nginx查看nginx的实时日志
docker-compose images列出 Compose 文件包含的镜像
docker-compose config验证文件配置,当配置正确时,不输出任何内容,
当文件配置错误,输出错误信息。
docker-compose events --json nginx以json的形式输出nginx的docker日志
docker-compose events --json nginx以json的形式输出nginx的docker日志
docker-compose pause nginx暂停nignx容器
docker-compose unpause nginx恢复ningx容器
docker-compose rm nginx删除容器(删除前必须关闭容器,执行stop)
docker-compose stop nginx停止nignx容器
docker-compose start nginx启动nignx容器
docker-compose restart nginx重启项目中的nignx容器
docker-compose run --no-deps --rm php-fpm php -v在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

docker compose up 常用参数说明

docker-compose up 启动所有服务
docker-compose up -d 在后台所有启动服务
其他参数说明:
–no-color 不使用颜色来区分不同的服务的控制输出
–no-deps 不启动服务所链接的容器
–force-recreate 强制重新创建容器,不能与–no-recreate同时使用 –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
–scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
-f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
示例:
docker-compose -f docker-compose.yml up -d

开始

目录结构

  • /opt/software/spider
    • /mysql
      • /data mysql运行数据
      • /init.d mysql初始化脚本
      • logs mysql运行日志
      • conf.d mysql配置文件
      • docker-compose.yml
      • spider-flow
        • spider-flow-1.0.jar jar包

目录准备

mkdir -p /opt/software/spider
cd /opt/software/spider
mkdir -p mysql/data mysql/conf.d mysql/logs mysql/init.d
mkdir spider-flow

配置docker-compose

新建docker-compose.yml,位置: /opt/software/spider

version: "2.4"networks: spider-flow-net: driver: bridgeservices:spider-flow-mysql:image: mysql:5.7container_name: spider-flow-mysqlhostname: spider-flow-mysqlvolumes:- ./mysql/data:/var/lib/mysql- ./mysql/logs:/var/log/mysql- ./mysql/conf.d:/etc/mysql/conf.d- ./mysql/init.d:/docker-entrypoint-initdb.denvironment:- MYSQL_ROOT_PASSWORD=123456- LANG=C.UTF-8privileged: trueports:- "31306:3306"restart: alwayscommand: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cinetworks:- spider-flow-netspider-flow-prod:image: adoptopenjdk/openjdk8container_name: spider-flow-prodrestart: alwayscap_add:- SYS_PTRACEdepends_on:- spider-flow-mysqlports:- "9998:9998"links: - spider-flow-mysqlenvironment:- spring.profiles.active=prod- server.port=9998- DB_HOST=spider-flow-mysql- DB_PORT=3306- DB_NAME=spiderflow- DB_USERNAME=root- DB_PASSWORD=123456volumes:- ./spider-flow:/dataworking_dir: /datacommand: java -Xmx1024m -jar spider-flow-1.0.jarnetworks:- spider-flow-net

配置说明:

  1. 总共使用了两个容器,一个mysql,一个spiderflow
  2. 配置了一个网络 spider-flow-net
  3. mysql版本使用的是5.7, 配置了root密码,/mysql/init.d 这个目录下对应的是数据库初始化脚本, 配置了字符集和系统语言
  4. spiderflow依赖于mysql, 配置了对应的mysql信息作为环境变量可以在应用的配置文件中引用
  5. 上文使用的docker-compose版本是2.4, 如果有朋友使用3的话需要注意有些配置语法会有差异。

关于jar包及配置

docker-compose中的spider-flow-prod服务引用了一个jar包,这个包的生成可以通过源码编译生成,在本文最后我会提供一个编译好的jar包方便大家下载使用。

gitee仓库地址: spider-flow: 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。 (gitee.com)

关于配置的说明:

  1. 如果是从上述gitee仓库下载的源码的话,下载到本地后在对应目录执行mvn clean package后即可在spider-flow-web/target下生成jar包

    这个是修改过的代码,与原来的仓库代码区别在于:

    • 升级了mysql驱动,解决了数据源链接测试时报错的问题
    • 新增或者编辑数据源时添加了mysql8对应的驱动选项
  2. 如果想本地启动可以设置spring.profiles.active=dev,然后在application-dev.yml配置数据库即可。

  3. 如果按上文配置的话,jar包需要放在spider-flow目录下

其他说明

  1. 在mysql/init.d 目录下需要放置初始化脚本(当然手动执行也是没问题的)

    init.sql

    SET FOREIGN_KEY_CHECKS=0;CREATE DATABASE if not exists spiderflow;
    USE spiderflow;DROP TABLE IF EXISTS `sp_flow`;
    CREATE TABLE `sp_flow` (`id` varchar(32) NOT NULL,`name` varchar(64) DEFAULT NULL COMMENT '任务名字',`xml` longtext DEFAULT NULL COMMENT 'xml表达式',`cron` varchar(255) DEFAULT NULL COMMENT 'corn表达式',`enabled` char(1) DEFAULT '0' COMMENT '任务是否启动,默认未启动',`create_date` datetime DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间',`last_execute_time` datetime DEFAULT NULL  COMMENT '上一次执行时间',`next_execute_time` datetime DEFAULT NULL   COMMENT '下一次执行时间',`execute_count` int(8) DEFAULT NULL  COMMENT '定时执行的已执行次数',PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '爬虫任务表';DROP TABLE IF EXISTS `sp_datasource`;
    CREATE TABLE `sp_datasource` (`id` varchar(32) NOT NULL,`name` varchar(255) DEFAULT NULL,`driver_class_name` varchar(255) DEFAULT NULL,`jdbc_url` varchar(255) DEFAULT NULL,`username` varchar(64) DEFAULT NULL,`password` varchar(32) DEFAULT NULL,`create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;DROP TABLE IF EXISTS `sp_variable`;
    CREATE TABLE `sp_variable` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) DEFAULT NULL COMMENT '变量名',`value` varchar(512) DEFAULT NULL COMMENT '变量值',`description` varchar(255) DEFAULT NULL COMMENT '变量描述',`create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;/* v0.3.0 新增 */
    DROP TABLE IF EXISTS `sp_task`;
    CREATE TABLE `sp_task` (`id` int(11) NOT NULL AUTO_INCREMENT,`flow_id` varchar(32) NOT NULL,`begin_time` datetime DEFAULT NULL,`end_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;/* v0.4.0 新增 */
    DROP TABLE IF EXISTS `sp_function`;
    CREATE TABLE `sp_function`  (`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '函数名',`parameter` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数',`script` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'js脚本',`create_date` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;/* v0.5.0 新增 */
    DROP TABLE IF EXISTS `sp_flow_notice`;
    CREATE TABLE `sp_flow_notice` (`id` varchar(32) NOT NULL,`recipients` varchar(200) DEFAULT NULL COMMENT '收件人',`notice_way` char(10) DEFAULT NULL COMMENT '通知方式',`start_notice` char(1) DEFAULT '0' COMMENT '流程开始通知:1:开启通知,0:关闭通知',`exception_notice` char(1) DEFAULT '0' COMMENT '流程异常通知:1:开启通知,0:关闭通知',`end_notice` char(1) DEFAULT '0' COMMENT '流程结束通知:1:开启通知,0:关闭通知',PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '爬虫任务通知表';
    1. jar包需要重命名为spider-flow-1.0.jar,需要与配置文件中jar包名称和位置对应即可。
    2. 如果需要访问web页面的话需要检查9998端口是否放开。

启动容器

万事俱备,可以启动容器了。

docker-compose.yml同级目录下执行docker-compose up -d

通过docker ps可以查看启动的容器。

通过服务器IP:9998可以访问到spiderflow对应的web页面。

总结

本文介绍了docker-compose的常用命令及配置,并以spiderflow为例说明了基于docker-compose快速部署springboot应用的过程,

只是提供一种思路,希望能对大家有所帮助。

针对以上内容有任何疑问或者建议欢迎留言评论~~~

创作不易,欢迎一键三连~~~~


http://www.ppmy.cn/news/85451.html

相关文章

保姆级教程:手把手教你拿下雅思写作7分

在留学路上,雅思考试是绕不开的一道坎。然而,众所周知,雅思学习热度高,学习难度大,而且很多人找不到合适的学习方法。在这里,我们以雅思写作中的大作文为例,从大作文的结构拆解、学习的任务拆分…

【杂记】平方和公式及其证明

根据等差数列求和公式,我们知道 ∑ i 1 n i n ( n − 1 ) 2 \sum\limits_{i1}^n i\dfrac {n(n-1)}{2} i1∑n​i2n(n−1)​。那么 ∑ i 1 n i 2 \sum\limits_{i1}^ni^2 i1∑n​i2 的公式是什么呢? 平方和公式: ∑ i 1 n i 2 n ( n 1 …

每位软件测试工程师都应了解的风险管理知识

软件测试是软件开发的重要组成部分,软件测试需要的不仅仅是发现和修复默认设置,还需要识别和管理风险,由此,在整个测试计划阶段制定风险管理计划至关重要。 软件测试风险管理计划的要点 在软件测试中,风险管理是发现、…

字节8年测试经验,从功能测试到自动化测试,我整理了这一份2000字进阶学习指南

随着软件行业的不断发展,软件测试技术也在不断地更新,出现了众多的自动化功能测试工具,如HP的Quick Test Professional(最新版本名为UFT)及开源的Selenium。性能测试工具如LoadRunner、JMeter等。 所谓自动化测试&…

C++中stack的用法(超详细,入门必看)

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。 博主主页:陈童学哦 所属专栏:CSTL 前言:Hello各位小伙伴们好!欢迎来到本专栏CSTL的学习,本专栏旨在帮助大家了解…

1.java高级之文件和Io流

1.什么是流 java程序到系统文件的通道(以java程序为参照物)java<--input--文件-output-->如果以文件为参照物java--input-->文件<--output--2.File类 文件/目录 //定义文件夹 File pathnew File("E:\\data"); \\(用于文件夹) 要区分于\,\是通常用在\n \…

安科瑞电力监控系统和五防系统在锡林郭勒项目的应用

摘要&#xff1a;随着电力、计算机、信息和网络等技术的不断发展&#xff0c;推动了电力监控的快速发展&#xff0c;人们对电力系统运行的安全性以及稳定性的要求越来越高。本文针对锡林郭勒供配电系统特点及供配电系统高可靠性的要求&#xff0c;提出了保护类、监测类和防误闭…

多线程-Thread类的常用方法和生命周期

Thread类的常用结构 构造器 public Thread():分配一个新的线程对象。public Thread(String name):分配一个指定名字的新的线程对象。public Thread(Runnable target):指定创建线程的目标对象&#xff0c;它实现了Runnable接口中的run()方法。public Thread(Runnable target,S…