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

前言

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

本文介绍基于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: nginx
    volumns:
      - xxx: xxx
      - xxx: xxx
    ports:
      - "10010:10010"
    environments:
      - spring.profiles.active=prod
    links:
      - mysql
      - redis
    depends_on:
      - mysql
      - redis
    command: 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: bridge

services:
  spider-flow-mysql:
    image: mysql:5.7
    container_name: spider-flow-mysql
    hostname: spider-flow-mysql
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d
      - ./mysql/init.d:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - LANG=C.UTF-8
    privileged: true
    ports:
      - "31306:3306"
    restart: always
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - spider-flow-net

  spider-flow-prod:
    image: adoptopenjdk/openjdk8
    container_name: spider-flow-prod
    restart: always
    cap_add:
      - SYS_PTRACE
    depends_on:
      - spider-flow-mysql
    ports:
      - "9998:9998"
    links: 
      - spider-flow-mysql
    environment:
      - spring.profiles.active=prod
      - server.port=9998
      - DB_HOST=spider-flow-mysql
      - DB_PORT=3306
      - DB_NAME=spiderflow
      - DB_USERNAME=root
      - DB_PASSWORD=123456
    volumes:
      - ./spider-flow:/data
    working_dir: /data
    command: java -Xmx1024m -jar spider-flow-1.0.jar
    networks:
     - 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应用的过程,

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泽济天下

你的鼓励是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值