0x01 前言

之前我根据官网的安装教程使用源码安装了摄像头录制软件shinobi,以下是相关文章:

但在最近的一次升级过程中出现严重的程序错误,经过多日排查依旧无法找到原因。因此我决定重新安装,但在centos7环境中无论如何都无法成功部署。在安装最后一直提示找不到npm命令,实际情况是我在一开始就通过手动安装的方式完成了nodejs与npm的安装,完全找不到原因。

经过仅一天的排错,我放弃了通过这种方式安装,转而使用docker。

0x02 准备

因为需要存储摄像头录像、数据库文件、日志文件等数据,建议准备一个较大的存储空间并挂载到本地,而我则给该虚拟机挂载了一个500G的存储空间在以下路径:

[root@shinobi ~]# df -h | grep shinobi
/dev/sdb1                                  500G   14G  487G   3% /mnt/shinobi

而后在该目录下使用以下命令新建文件夹:

[root@shinobi ~]# cd /mnt/shinobi/ && mkdir configs mysql videos

紧接着准备docker环境,在centos7下通过yum命令安装即可,随后设为开机启动并立即启动docker服务。

[root@shinobi ~]# yum install docker -y && systemctl enable docker && systemctl start docker

完成后需要检查docker是否正常启动:

[root@shinobi ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-11-03 13:12:15 CST; 8h ago

紧接着使用git命令从gitlab中把shinobi软件的docker代码clone到本地:

git clone https://gitlab.com/Shinobi-Systems/ShinobiDocker.git ShinobiDocker

在该目录下有一个start-image.sh的文件可以实现自动化启动,但不建议使用。

通过查看Dockerfile可以知道它使用alpine作为基础环境,并在此环境安装需要的软件:

[root@shinobi ~]# cat /root/ShinobiDocker/Dockerfile | grep FROM
FROM node:8-alpine

这里有个问题,在通过apk命令安装alpine软件时会从国外的软件源下载,下载速度惨不忍睹,所以建议将软件源改为国内的镜像,这里使用中科大的镜像站。

这一步需要手动修改Dockerfile,在第一个apk命令执行前加入以下内容:

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

至此,准备工作已完成。

0x03 构建

构建过程十分简单,先进入源码文件夹,然后执行build命令即可:

# 进入文件夹
[root@shinobi ~]# cd ShinobiDocker/

# 构建
[root@shinobi ShinobiDocker]# docker build -t shinobi:181103.1 .

构建所需要的时间根据网络质量的好坏而有所不同,我构建只花了2分钟左右。无错误地完成构建后通过以下命令即可查看相关镜像:

[root@shinobi ShinobiDocker]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
shinobi             181103.1            2055f1d93cf3        20 hours ago        1.07 GB
docker.io/node      8-alpine            df48b68da02a        7 weeks ago         65.7 MB

0x04 部署

在部署前再次查看Dockerfile,在文件最后可以看到以下内容:

VOLUME ["/opt/shinobi/videos"]
VOLUME ["/config"]
VOLUME ["/var/lib/mysql"]

EXPOSE 8080

该Dockerfile指定了3个存储路径,我们可以将其映射到一开始新建的文件夹中;最后一行是向外暴露了8080这个端口,而在我的环境中,我会将80端口映射到该8080端口。这样我就可以直接访问IP地址或域名而不需要输入端口号。

部署只需要一行命令:

docker run -d --name shinobi -p 80:8080 --restart always \
-v /mnt/shinobi/videos:/opt/shinobi/videos \
-v /mnt/shinobi/configs:/config \
-v /mnt/shinobi/mysql:/var/lib/mysql 2055f1d93cf3

相关参数的简介如下:

  • -d:在后台运行并打印容器ID
  • –name:给该容器命名,以便在多容器的情况下进行区分
  • -p:监听host的80端口并映射到容器暴露出来的8080端口
  • –restart:容器崩溃后自动拉起,docker服务重启后也自动拉起
  • -v:将本地目录挂载到容器中

最后的字符串为docker镜像的ID。

执行命令后会打印出该容器的ID,也可以通过以下命令检查容器的运行情况:

[root@shinobi ShinobiDocker]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
114a7ef022f4        2055f1d93cf3        "/opt/shinobi/dock..."   20 hours ago        Up 9 hours          0.0.0.0:80->8080/tcp   shinobi

因为我将host的80端口进行了映射,可以使用以下命令检查监听情况:

[root@shinobi ShinobiDocker]# netstat -anp | grep LISTEN
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      1344/zabbix_agentd  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1825/docker-proxy-c 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1320/sshd

稍等片刻,等服务完成启动后即可通过浏览器访问shinobi服务了:

shinobi的配置请移步至以下文章:

0x05 结语

在完成添加摄像头之后可以留意下一开始建立的目录里是否有文件:

[root@shinobi ~]# tree -L 2 /mnt/shinobi/
/mnt/shinobi/
├── configs
├── mysql
│   ├── 114a7ef022f4.err
│   ├── 114a7ef022f4.pid
│   ├── 40368a506285.err
│   ├── 40368a506285.pid
│   ├── aria_log.00000001
│   ├── aria_log_control
│   ├── ccio
│   ├── ib_buffer_pool
│   ├── ibdata1
│   ├── ib_logfile0
│   ├── ib_logfile1
│   ├── ibtmp1
│   ├── multi-master.info
│   ├── mysql
│   ├── mysql-bin.000001
│   ├── mysql-bin.000002
│   ├── mysql-bin.000003
│   ├── mysql-bin.000004
│   ├── mysql-bin.000005
│   ├── mysql-bin.index
│   ├── performance_schema
│   └── test
└── videos
    └── DNqBfpXqQt

8 directories, 18 files

正常情况下会先生成数据库文件,完成用户的建立与添加摄像头后,在videos目录中会有用户ID的文件夹,如上所示。

需要升级也很简答, 构建新版的镜像并赋予一个新的tag,停止旧的容器并拉起新的就好了。