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,停止旧的容器并拉起新的就好了。