前言
毋庸置疑,容器化部署已经是近两年的大趋势了。
本文介绍基于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包
- /mysql
目录准备
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
配置说明:
- 总共使用了两个容器,一个mysql,一个spiderflow
- 配置了一个网络 spider-flow-net
- mysql版本使用的是5.7, 配置了root密码,/mysql/init.d 这个目录下对应的是数据库初始化脚本, 配置了字符集和系统语言
- spiderflow依赖于mysql, 配置了对应的mysql信息作为环境变量可以在应用的配置文件中引用
- 上文使用的docker-compose版本是2.4, 如果有朋友使用3的话需要注意有些配置语法会有差异。
关于jar包及配置
docker-compose中的spider-flow-prod服务引用了一个jar包,这个包的生成可以通过源码编译生成,在本文最后我会提供一个编译好的jar包方便大家下载使用。
gitee仓库地址: spider-flow: 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。 (gitee.com)
关于配置的说明:
-
如果是从上述gitee仓库下载的源码的话,下载到本地后在对应目录执行mvn clean package后即可在spider-flow-web/target下生成jar包
这个是修改过的代码,与原来的仓库代码区别在于:
- 升级了mysql驱动,解决了数据源链接测试时报错的问题
- 新增或者编辑数据源时添加了mysql8对应的驱动选项
-
如果想本地启动可以设置spring.profiles.active=dev,然后在application-dev.yml配置数据库即可。
-
如果按上文配置的话,jar包需要放在spider-flow目录下
其他说明
-
在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 '爬虫任务通知表';
- jar包需要重命名为spider-flow-1.0.jar,需要与配置文件中jar包名称和位置对应即可。
- 如果需要访问web页面的话需要检查9998端口是否放开。
启动容器
万事俱备,可以启动容器了。
在docker-compose.yml同级目录下执行docker-compose up -d
通过docker ps可以查看启动的容器。
通过服务器IP:9998可以访问到spiderflow对应的web页面。
总结
本文介绍了docker-compose的常用命令及配置,并以spiderflow为例说明了基于docker-compose快速部署springboot应用的过程,
只是提供一种思路,希望能对大家有所帮助。
针对以上内容有任何疑问或者建议欢迎留言评论~~~
创作不易,欢迎一键三连~~~~