海康摄像机使用GB28181接入SRS服务器的搭建步骤---封装docker镜像运行容器的方式,本篇侧重于如何封装镜像
使用第三方提供的镜像
说明:这个是我在网上找的,没有实际验证及使用过,具体效果未知,看下文,我采用的是自己依据官方基础镜像进一步二次封装的镜像
地址:https://hub.docker.com/r/hasspi/srs4.0
下载镜像支持GB28181
docker pull hasspi/srs4.0:latest
运行镜像
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 5060:5060 -p 5060:5060/udp -p 9000:9000/udp --name srs4.0 --network br0 --ip 192.168.10.111 hasspi/srs4.0 ./objs/srs -c conf/push.gb28181.conf
进入docker 修改vim conf/push.gb28181.conf 配置文件
host $CANDIDATE; 将 $CANDIDATE 修改为自己的IP例如host 192.168.10.111;后保存配置文件
重启docker镜像
webui控制台:http//ip:1985/console/ng_index.html#/
依据官方基础镜像进一步二次封装的镜像
官方提供的有基础镜像
地址:地址:https://github.com/ossrs/dev-docker
封装这个基础镜像的步骤如下:
1.Install docker
2.Clone SRS
cd ~/git &&
git clone https://gitee.com/ossrs/srs.git srs && cd srs/trunk &&
git remote set-url origin https://github.com/ossrs/srs.git && git pull
3.Build SRS in dev docker
cd ~/git/srs/trunk &&
docker run -it --rm -v `pwd`:/srs -w /srs ossrs/srs:dev \
bash -c "./configure && make"
After build, the binary file ./objs/srs is generated.
4.Run SRS in dev docker
cd ~/git/srs/trunk &&
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8085:8085 \
-it --rm -v `pwd`:/srs -w /srs ossrs/srs:dev \
./objs/srs -c conf/console.conf
# Or for macOS, with WebRTC.
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8085:8085 \
--env CANDIDATE=$(ifconfig en0 inet| grep 'inet '|awk '{print $2}') -p 8000:8000/udp \
-it --rm -v `pwd`:/srs -w /srs ossrs/srs:dev \
./objs/srs -c conf/console.conf
Debug SRS by GDB in dev docker
cd ~/git/srs/trunk &&
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8085:8085 \
--env CANDIDATE=$(ifconfig en0 inet| grep 'inet '|awk '{print $2}') -p 8000:8000/udp \
--privileged -it --rm -v `pwd`:/srs -w /srs ossrs/srs:dev \
gdb --args ./objs/srs -c conf/console.conf
封装后的镜像是:ossrs/srs:dev,这个就是官方提供的基础镜像
自己使用的话,依据官方基础镜像做进一步的封装,比如源码编译运行使用的srs-gb28181-feature-gb28181给封装进去,路径:srs-gb28181-feature-gb28181/trunk里有对应的Dockerfile文件
默认提供的Dockerfile文件内容如下:
# cat Dockerfile
FROM ossrs/srs:dev AS build
# Install depends tools.
RUN yum install -y gcc make gcc-c++ patch unzip perl git
ARG SRS_AUTO_PACKAGER
# Build and install SRS.
COPY . /srs
WORKDIR /srs/trunk
RUN ./configure --srt=on --jobs=2 && make -j2 && make install
# All config files for SRS.
RUN cp -R conf /usr/local/srs/conf && \
cp research/api-server/static-dir/index.html /usr/local/srs/objs/nginx/html/ && \
cp research/api-server/static-dir/favicon.ico /usr/local/srs/objs/nginx/html/ && \
cp research/players/crossdomain.xml /usr/local/srs/objs/nginx/html/ && \
cp -R research/console /usr/local/srs/objs/nginx/html/ && \
cp -R research/players /usr/local/srs/objs/nginx/html/ && \
cp -R 3rdparty/signaling/www/demos /usr/local/srs/objs/nginx/html/
############################################################
# dist
############################################################
FROM centos:7 AS dist
# Expose ports for streaming @see https://github.com/ossrs/srs#ports
EXPOSE 1935 1985 8080 8000/udp 10080/udp
# FFMPEG 4.1
COPY --from=build /usr/local/bin/ffmpeg /usr/local/srs/objs/ffmpeg/bin/ffmpeg
# SRS binary, config files and srs-console.
COPY --from=build /usr/local/srs /usr/local/srs
# Default workdir and command.
WORKDIR /usr/local/srs
CMD ["./objs/srs", "-c", "conf/docker.conf"]
二次封装具体操作步骤:
1.修改Dockerfile文件中关于编译的命令,加上--gb28181=on
也就是把RUN ./configure --srt=on --jobs=2 && make -j2 && make install
修改成RUN ./configure --srt=on --jobs=2 --gb28181=on && make -j2 && make install
2.使用修改好的push.gb28181.conf文件替换原有的
该文件中有关服务器IP的变量:$CANDIDATE
仍做保留,在使用的时候先设置这环境变量 (不把里面的服务器IP写死,有区别是源码安装运行的那篇文章使用的方式)
该文件可以参考使用源码安装运行使用的那个,地址:https://www.cnblogs.com/hahaha111122222/p/16725612.html
比如:
CANDIDATE="192.168.1.165"
3.修改Dockerfile文件中最后启动使用的配置文件
把CMD ["./objs/srs", "-c", "conf/docker.conf"]
修改成 CMD ["./objs/srs", "-c", "conf/push.gb28181.conf"]
若是不这样修改,那么运行容器的时候需要增加启动参数来覆盖Dockerfie文件中的CMD命令,如下所示:
CANDIDATE="192.168.1.165"
docker run -d \
-p 1935:1935/tcp \
-p 1985:1985/tcp \
-p 8000:8000/tcp \
-p 9000:9000/tcp \
-p 8080:8080/tcp \
-p 1935:1935/udp \
-p 1985:1985/udp \
-p 8000:8000/udp \
-p 9000:9000/udp \
-p 8080:8080/udp \
-p 5060:5060/udp \
srs:5.0.26_gb28181 ./objs/srs -c conf/push.gb28181.conf
在这里修改后直接一步到位了
4.修改映射出去的端口
注意:端口映射也是直接参考源码安装运行使用的那个,地址:https://www.cnblogs.com/hahaha111122222/p/16725612.html
把Dockerfile文件中的这行
EXPOSE 1935 1985 8080 8000/udp 10080/udp
修改成如下行
EXPOSE 1935/tcp 1985/tcp 8080/tcp 8000/tcp 9000/tcp 1935/udp 1985/udp 5060/udp 8080/udp 8000/udp 9000/udp
生成镜像
问题:官方文件中提供的Dockerfile文件使用过程中有问题
在编译的时候会报:/bin/sh: ./configure: No such file or directory
也就是这一段命令:
# Build and install SRS.
COPY . /srs
WORKDIR /srs/trunk
RUN ./configure --srt=on --jobs=2 && make -j2 && make install
增加输出当前路径及文件的命令:
# Build and install SRS.
RUN pwd
COPY . /srs
WORKDIR /srs/trunk
RUN pwd && ls -al
RUN ./configure --srt=on --jobs=2 && make -j2 && make install
结果如下:
Step 1/15 : FROM ossrs/srs:dev AS build
---> d7c3f5717f25
Step 2/15 : RUN yum install -y gcc make gcc-c++ patch unzip perl git
---> Using cache
---> 92ddfdcf4b0c
Step 3/15 : ARG SRS_AUTO_PACKAGER
---> Using cache
---> d3fc55d2d52e
Step 4/15 : RUN pwd # 查看当前路径
---> Running in c889972ba694
/tmp/srs
Removing intermediate container c889972ba694
---> 33e2af0f7a76
Step 5/15 : COPY . /srs # 复制宿主机同Dockerfile路径下所有文件到容器指定路径中
---> 2efac7af508f
Step 6/15 : WORKDIR /srs/trunk # 切换容器路径
---> Running in 2c53628204f7
Removing intermediate container 2c53628204f7
---> 53627c4b1514
Step 7/15 : RUN pwd && ls -al # # 查看当前路径,发现并没有输出任何文件,没有把Dockerfile文件所在宿主机路径下的文件COPY过去,才导致找不到文件,编译失败的
---> Running in 94818ade063b
/srs/trunk
total 0
drwxr-xr-x 2 root root 6 Sep 24 05:38 .
drwxr-xr-x 1 root root 19 Sep 24 05:38 ..
Removing intermediate container 94818ade063b
---> 586fcb293406
Step 8/15 : RUN ./configure --srt=on --jobs=2 --gb28181=on && make -j2 && make install # 这一步编译报错
---> Running in b18ca82e6863
/bin/sh: ./configure: No such file or directory
The command '/bin/sh -c ./configure --srt=on --jobs=2 --gb28181=on && make -j2 && make install' returned a non-zero code: 127
因此修改Dockerfile文件中有关上述命令为:
# Build and install SRS.
WORKDIR /srs/trunk
COPY . /srs/trunk/
RUN ./configure --srt=on --jobs=2 && make -j2 && make install
这样才能编译成功,具体使用的命令如下:
cd srs-gb28181-feature-gb28181/trunk/
docker build -t srs:5.0.26_gb28181 .
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
srs 5.0.26_gb28181 c665bf3d5eea About an hour ago 264MB
ossrs/srs dev d7c3f5717f25 6 weeks ago 1.33GB
centos 7 eeb6ee3f44bd 12 months ago 204MB
运行容器
关于配置文件中变量CANDIDATE要用服务器外网IP的设置有两种方式:
第一种方式,直接设置系统环境变量:
CANDIDATE="192.168.2.164"
第二种方式,直接在命令中获取
--env CANDIDATE=$(ifconfig ens32 | grep 'inet '|awk '{print $2}') # 输出当前使用的网卡IP,网卡名称根据实际情况而定
在这里我采用的是第二种方式
docker run -d \
-p 1935:1935/tcp \
-p 1985:1985/tcp \
-p 8000:8000/tcp \
-p 9000:9000/tcp \
-p 8080:8080/tcp \
-p 1935:1935/udp \
-p 1985:1985/udp \
-p 8000:8000/udp \
-p 9000:9000/udp \
-p 8080:8080/udp \
-p 5060:5060/udp \
--env CANDIDATE=$(ifconfig ens32 | grep 'inet '|awk '{print $2}') --name srs srs:5.0.26_gb28181
查看日志,配置摄像机,后续其他的均跟源码安装那篇一样
docker logs -f srs