使用FFmpeg命令rtsp推流到Docker中MediaServer服务器,15秒timeout一到就会打印错误信息,如下图:
av_interleaved_write_frame():Broken pipe
命令中指定rtsp传输方式为tcp(-rtsp_transport tcp
),虽然不会出现上面的问题,但是不符合我们的使用要求,因此就怀疑是不是docker映射端口有问题。
Docker映射端口:
-p 1935:1935 -p 554:554 //默认TCP,即如上图 554:554/tcp
-p 554:554/udp //指定为UDP,即如上图 554:554/udp
然后测试发现,端口映射指定了UDP仍然不能解决此问题。
后来突发奇想,让docker容器打开时,映射所有端口,能不能就解决这个问题了呢?
找到命令参数:
--net host
我们在使用docker run创建Docker容器时,可以用–network标志选项指定容器的网络模式,Docker有以下4种网络模式:
- host模式:使用 --net=host 指定。
- none模式:使用 --net=none 指定。
- bridge模式:使用–net=bridge 指定,默认设置。
- container模式:使用 --net=container:NAME_or_ID 指定。
host模式
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。host模式类似于Vmware的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
经过测试,发现指定容器的网络模式为host能解决此问题!