毋庸置疑,容器化部署已经是近两年的大趋势了。
本文介绍基于docker-compose快速实现springboot单体应用的容器化部署操作实践,应用使用开源的可视化爬虫spiderflow。
当然也可以通过其他方式可以完成部署,本文也只是提供一种思路。
关于spiderflow的使用可以参考之前的文章: 可视化爬虫框架spiderflow入门及实战_spider-flow_泽济天下的博客-CSDN博客
Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。
通过 Docker-Compose ,不需要使用shell脚本来启动容器,而使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令,根据 YAML 的文件配置创建并启动所有服务。
Docker-Compose 将所管理的容器分为三层
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
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.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
配置说明:
docker-compose中的spider-flow-prod服务引用了一个jar包,这个包的生成可以通过源码编译生成,在本文最后我会提供一个编译好的jar包方便大家下载使用。
gitee仓库地址: spider-flow: 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。 (gitee.com)
关于配置的说明:
如果是从上述gitee仓库下载的源码的话,下载到本地后在对应目录执行mvn clean package后即可在spider-flow-web/target下生成jar包
这个是修改过的代码,与原来的仓库代码区别在于:
如果想本地启动可以设置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 '爬虫任务通知表';
万事俱备,可以启动容器了。
在docker-compose.yml同级目录下执行docker-compose up -d
通过docker ps可以查看启动的容器。
通过服务器IP:9998可以访问到spiderflow对应的web页面。
点击进入下载页面
本文介绍了docker-compose的常用命令及配置,并以spiderflow为例说明了基于docker-compose快速部署springboot应用的过程,
只是提供一种思路,希望能对大家有所帮助。
针对以上内容有任何疑问或者建议欢迎留言评论~~~
创作不易,欢迎一键三连~~~~