一.应用背景:

基于FISCO BCOS部署去中心化的食品溯源系统,部署方式为基于容器技术Docker,部署内容包括系统前端、后端、数据库,并在最后进行验证。具体工作内容如下:

1. 以容器的方式部署Mysql以及Redis数据库

2. 配置Dockerfile,生成系统后端的镜像

3. 配置docker-compose.yaml以容器集群的方式启动整体系统,包括系统后端、系统前端、Mysql数据库、Redis数据库。

如下图为食品溯源系统的整体架构:

1. 测量点[M]:以容器的方式部署Mysql并配置。

(1)具体试题示例:

以容器的方式启动Mysql与Redis数据库,具体要求如下:

1)Mysql:5.7数据库:对外映射3306,管理员root账户密码为123456,在用户根目录下挂载数据库用于数据存储与配置的文件夹

2)Redis数据库:对外映射端口6379

3)配置Mysql数据库,相关操作创建data_export数据库,以及user表。

(1)具体实现:

先建一个文件夹

cd foodtrace

第一步:容器启动Mysql:

docker run -itd --name food_mysql -v /home/arthur/foodtrace/datadir:/var/lib/mysql -v /home/arthur/foodtrace/conf.d:/etc/mysql/conf.d -p 3560:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

第二步:容器启动Redis:

docker run -itd --name redis -p 6379:6379 redis

注意,如果出现以下问题,需要执行停止redis操作

先停止redis,删除redis,在重新运行

service redis stopdocker rm -v redisdocker run -itd --name redis -p 6379:6379 redis

第三步:使用docker ps查看进程

在Mysql中创建data_export数据库,以及user表,当创建成功有下图内容:

先在MobaXterm里面打开连接mysql的进程

docker exec -it food_mysql bash#进入mysql终端mysql -uroot -p#查看数据库show databases;#使用数据库use data_export#使用数据表desc user;

连接数据库:端口为MobaXterm的端口,主机为你的ip地址,密码是123456,用户名:root

连接成功之后新建数据库data_export,新建表user,在里面添加内容。

2. 测量点[M]:使用WeBASE-Front在区块链中部署食品溯源智能合约
(1)具体试题示例:

WeBASE-Front工具部署食品溯源的智能合约,具体代码带后端项目的contracts目录中,具体操作包括:

1. 使用WeBASE-Front创建admin账户,截图账户信息

2. 使用admin账户部署合约,截图包括合约地址和abi。

(2)具体操作如下:

1)创建admin用户

2)部署智能合约

3. 测量点[M]:修改系统后端配置内容,完成集群化容器部署相关配置
(1)具体试题示例:

修改后端代码的配置文件config.py,修改包括MySQL数据库、Redis数据库、合约名称、合约abi、WeBASE-Front的IP等信息,确保可以使用容器化部署。

(2)具体操作示例:

第一步:首先把food-trace.zip文件传到foodtrace里面,创建back文件,把food-trace.zip移到back,然后进行解压

mkdir backmv food-trace.zip backcd back#解压该文件unzip food-trace.zip

上面部署成功的FoodTraceNew的abi地址,以及admin地址(不要忘记修改主机接口)

4. 测量点[M]:编写Dockerfile生成系统后端镜像
(1)具体试题示例:

使用Dockerfile生成系统后端,具体要求如下:

1) 对外暴露5000端口

2) 能够启动flask后端

3) 生成镜像名称为web:v2

4) 生成的Dockerfile名称命名为WebDockerfile

(2)具体代码截图示例:

第一步:在foodtrace创建WebDockerfile,在WeDockerfile文件里面配置Dockerfile

vim WebDockerfile#配置内容FROM python:3.9ADD ./back /root/food-traceADD ./.pip /root/.pipWORKDIR /root/food-traceRUN pip install -r requirements.txtEXPOSE 5000CMD python app.py

第二步:复制pip文件

cp -r ~/.pip .

如果没有运行以上命令会报下面的错误

第三步:生成镜像的操作:

sudo docker build -f WebDockerfile -t web:v2 .

第四步:查看镜像

5. 测量点[M]:以集群的形式完整启动食品溯源系统
(1)具体试题示例:

完善容器集群启动文件docker-compose.yaml,完善包括前端容器(nginx),后端容器(web),Mysql数据库容器(mysql),Redis容器(redis)。在确保4个容器均启动的前提下,实现容器间的互联。

(2)具体操作示例:

在操作前需要删除已存在的mysql和redis容器

docker stop food_mysqldocker rm food_mysql

1)修改nginx.conf配置文件

nginx.conf文件已经放在资源里面了(点击下面的nginx.conf就可以跳到此文件的链接),基于已有文件去修改就可以了。

添加server映射反向代理至web容器的域名,具体具体的nginx.conf文件:

第二步:首先把dist.zip文件传到foodtrace里面,创建dist文件夹,把dist.zip移到back,然后进行解压

mkdir distmv dist.zip dist#解压该文件cd distunzip dist.zip

第三步:编写docker-compose.yaml

version: '3.3'services:web:image: web:v2container_name: food_webports:- 5000:5000depends_on:- mysql- redisnginx:image: nginxcontainer_name: food_nginxvolumes:- ./dist:/root/dist- ./nginx.conf:/etc/nginx/nginx.confports:- 8020:8020depends_on:- web mysql:image: mysql:5.7container_name: food_mysqlenvironment:- MYSQL_ROOT_PASSWORD=123456volumes:- /home/arthur/foodtrace/datadir:/var/lib/mysql- /home/arthur/foodtrace/conf.d:/etc/mysql/conf.dports:- 3356:3306redis:image: rediscontainer_name: food_redisports:- 6379:6379

第四步:启动集群容器

当有以下4个容器被启动时说明操作成功:

第五步:启动容器

docker-compose up

6. 测量点[M]:验证系统部署完成情况
(1)具体试题示例:

登录系统8020端口,使用注册操作后,验证系统已启动成功,具体操作:

1)使用浏览器访问指定页面

2)使用系统注册功能,完成操作后,在mysql交互框验证是否成功。

(2)具体操作示例:

实现以下命令要确保mysql能够成功连接MobaXterm

1)访问页面,当有如下显示说明启动成功

2)使用注册功能,并验证,当有以下输出说明系统启动成功

首先打开注册界面

填写用户名admin,密码:123456,address:(地址为webase-front上admin的地址),角色:管理员,点击注册,上面会显示注册成功

在添加一个用户名为test1,密码是333444555,address:(地址为webase-front上admin的地址),角色:生产商,点击注册,上面会显示注册成功

然后打开mysql,在数据表user里面可以看到添加的用户

二.食品溯源项目数据导出试题

1.确认项目已经正常运行

使用docker ps确认有四个容器正在运行

页面验证

2. 使用data-export导出对应项目合约中的数据到指定mysql数据库(port: 3356)

首先,进入~/fisco-bcos/data-export-docker目录

在目录中对应config目录的abi和bin子目录中添加对应FoodTraceNew合约的abi和bin

在.abi与.bin文件中需要添加WeBASE-Front中对应的内容

修改application.properties,将mysql导出的配置指向3356端口

拷贝fisco bcos对应sdk证书到config目录下

启动data-export组件

验证:

如果遇到以下问题,重启虚拟机:

如果重启虚拟机,需要执行以下操作恢复

1. 启动fisco bcos

2. 启动webase-front

3. 关闭redis

4. 启动foodtrace容器集群

重新启动dataexport,删除已经存在的dataexport容器

创建一个新的

查看日志,有如下正确输出

使用mysql客户端连接3356 mysql容器,在容器中添加data_export数据库

进入

验证:

Grafana监控,运行grafana

docker run -itd -p 3000:3000 --name=grafana grafana/grafana

使用浏览器访问,并登录(admin/admin)

配置mysql连接

有如下输出说明连接成功:

加载default_dashboard.json(在群共享文件中可以找到)

有如下输出:

验证可视化:

使用食品溯源项目,注册一个新用户

观察grafana数据变化:

7.其他一些报错信息

(1).下面问题端口被占用,需要先删除food_mysql,在重新运行

docker rm -f food_mysql

(2).下面问题是因为mysql建立的数据表,数据表里的address长度偏小,要修改长度。

修改之后停止进程,在重新开启进程

docker-compose downdocker-compose up

(3).以下问题表示容器正在运行需要删除镜像

docker rm 镜像id

(4).下面错误原因是id没有选择自增