全功能WebRTC应用程序AppRTC应用服务阿里云搭建测试总结并docker化提供镜像

1. 前言

之前我们已经在阿里云服务器上搭建了turn/stun服务(juejin.cn/post/712226…),也使用webRTC测试过rtsp转webRTC播放视频(juejin.cn/post/711933…),实时性很好,这里我们再搭建官网的全功能WebRTC应用程序AppRTC应用服务做一下实时音视频通话的测试。

2. WebRTC资料准备

之前说了很多webrtc的内容,但是一直没有系统说过如何学习,其实就像很久前就说过的从官网了解并获取资料:webrtc.org/

借助 WebRTC,您可以为应用添加基于开放标准运行的实时通信功能。它支持在对等设备之间发送视频、语音和通用数据,使开发者能够构建强大的语音和视频通信解决方案。这项技术适用于所有现代浏览器以及所有主要平台的原生客户端。WebRTC 采用的技术是开放网络标准,以常规 JavaScript API 的形式在所有主流浏览器中提供。对于原生客户端(例如 Android 和 iOS 应用),可以使用具备相同功能的库。WebRTC 项目属于开源项目,受 Apple、Google、Microsoft 和 Mozilla 等公司支持。本页面由 Google WebRTC 团队维护。

示例:webrtc.github.io/samples/

WebRTC 有许多不同的用例,从使用摄像头或麦克风的基本 Web 应用,到更高级的视频通话应用和屏幕共享。我们收集了大量的代码示例,以便更好地说明该技术的工作原理及其用途。 使用指南:webrtc.org/getting-sta…

3. AppRTC资料准备

GitHub:github.com/webrtc/appr… image.png AppRTC 房间+Web服务器使用python+js语言 AppRTC Collider信令服务器采用go语言 Coturn 采用C语言 在部署到公网时需要通过Nginx做Web和Websocket的代理连接 实际开发:把信令+房间管理都是写到一个服务器(我们后续可以尝试将这些服务都用go来实现)

4. docker创建Ubuntu16.04镜像部署并导出

参考:chromium.googlesource.com/external/we… blog.csdn.net/lingshengxu…

注:下列搭建过程是我在阿里云的ubuntu20上利用docker实践总结的,测试效果还可以,并且测试Windows、macOS(后续可能会在支持docker的openWRT或Android上实践,有需要的可以先照猫画虎尝试一下)上docker拉取镜像后改进使用都没有任何问题,大家可以放心使用。

4.1 安装docker

自行搜索解决(个人感觉你可以将其当成git来学,虽然两者是不同的东西,但是我感觉分布式的思想和命令行操作这块两者惊人的相似):blog.csdn.net/weixin_3951…

4.2 docker获取Ubuntu16.04镜像

docker pull ubuntu:16.04
docker images
docker run -it ubuntu:16.04 /bin/bash

4.3 ubuntu16.04搭建apprtc服务

参考:blog.csdn.net/lingshengxu…

其中有一些地方有问题,我这里做了一些修改:blog.csdn.net/weixin_3951…

5. docker方式运行方案及实践

docker运行这里我们可以有三种方式:

  • 1.可以将我们安装的这些内容导出并导入为一个新的统一镜像,在新镜像中分别运行各个服务,根据运行不同的服务形成不同的容器,但是这显然有的服务没有运行,该镜像会比较大,好处是在部署的服务器上利用该镜像可以随时运行其它服务;
  • 2.在统一镜像中一次性运行所有服务,这对服务器的性能要求高一些,但是部署难度会降低,直接一个docker命令运行所有服务,而且达到开箱即用的效果;
  • 3.将不同的服务形成不同的镜像,一个镜像只包含一个服务的依赖,这样做带来了docker镜像管理的难度,我们需要学习一些docker管理的软件,但这是docker希望的样子,更符合云化和微服务化的要求和目的,我们可以利用集群的能力避免服务宕机可能带来的风险;

我们这里由于只做初步测试将使用第一种和第二种方式。

5.1 导入导出镜像以及上传仓库

实际上我们也可以通过Dockerfile方式构建镜像,但是上述依赖太复杂了,写Dockerfile比较麻烦,我通常喜欢拉取一个基础镜像,然后bash进入后安装依赖,之后导出再导入形成一个新镜像(后续可以尝试第三种方式并根据不同的服务形成四个Dockerfile,这样更符合docker的设计目的,尽可能的将可复用的内容都单独容器化)。

#docker export -o 指定路径及镜像包名 容器名
docker export -o .\ubuntu-apprtc.tar naughty_banzai
#docker import 包名及路径 镜像名:版本tag
docker import ubuntu-apprtc.tar ubuntu-apprtc:1.0.1
#查看镜像
docker images
#登录
docker login
#添加tag:docker tag image1:tag 用户名/image1:tag版本
docker tag ubuntu-apprtc:1.0.1 19930128/ubuntu-apprtc:1.0.1
#docker push 用户名/image1:latest
docker push 19930128/ubuntu-apprtc:1.0.1
#之后可以利用pull在其它服务器上拉取现成的镜像修改运行容器了

docker hub上传失败的话可以选择国内的免费仓库,比如阿里云的,请自行搜索如何上传阿里云仓库 阿里云镜像上传参考地址:docs.docker.com/

5.2 不同容器运行不同服务测试

docker run -t -i -p 8090:8090 ubuntu-apprtc:1.0.1 /root/webrtc/google_appengine/dev_appserver.py --host=0.0.0.0 --port=8090 /root/webrtc/apprtc/out/app_engine --skip_sdk_update_check

docker run -t -i -p 8089:8089 ubuntu-apprtc:1.0.1 /root/webrtc/goworkspace/bin/collidermain -port=8089 -tls=false -room-server="http://localhost:8090"

docker run -p 3478:3478 -t -i -d ubuntu-apprtc:1.0.1 turnserver -L 0.0.0.0 -a -u admin:admin

使用三个容器运行三个服务并将端口映射出来,之后在外部使用nginx做代理进行https\wss的代理即可。

5.3 一个容器运行所有服务

我们也可以将coturn打洞中继服务默认运行在镜像内,或者直接使用一些免费的stun/turn服务;之后信令服务和nginx代理在容器内直接以服务运行,docker外部只暴露web服务启动即可(或者使用bash -c将上述三条命令放到一起启动一个容器即可)。

6. 效果展示(MacOS、Windows和鸿蒙OS都可以)

如果你是按照外部运行nginx,其它的服务运行在docker容器中的话可以直接使用我这里的镜像,修改其中的 **vim /root/webrtc/apprtc/src/app_engine/constants.py** 修改其中localhost的部分,修改为你的公网ip,修改后参考上面的编译运行方式重新运行启动(因为没有对turn进行配置,所以域名可能也不行,需要单独做域名配置) 测试Google浏览器443端口在Windows、MacOS、Android下是可用的(直接微信页面打开也可以),免费的ssl证书会报警告,不用理会。 目前我会在阿里云服务器上保留一段时间用于测试,各位i也可以测试一下:https://www.xiaoyaoyou.xyz:443

MacOS: image.png

Windows(微信直接打开链接也可以,Google浏览器打开也可以): image.png

鸿蒙OS平板: image.png Android和ios使用浏览器都报了错误,房间链接失败了,看着似乎是信令的问题,后面我们分析源码的时候再来试一下(而且退出房间后似乎ws/wss链接断开不及时,退出后再次使用一个房间号很可能会提升房间已满)。

7. 最后

docker的好处就在这里了,一次部署,只要在支持docker的环境再次部署就容易多了,再也不同担心部署过程中的环境依赖问题了,这让运维实施和开发都少了头疼的一件事(在我环境上是好的~.~)。

“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

猜你喜欢

转载自juejin.im/post/7124999769545506829