如何用FFmpeg录制另一Docker容器中的XVFB虚拟屏幕
解决跨Docker容器录制XVFB虚拟屏幕的问题
问题根源
你主容器里的XVFB启动命令加了-nolisten tcp参数,直接禁用了TCP监听,导致其他容器无法连接到这个虚拟X服务器;同时X11的权限机制也会阻止跨容器的访问请求。
方案一:启用XVFB的TCP监听(简单直接)
- 修改主容器的XVFB启动命令,去掉
-nolisten tcp并开启TCP监听:
Xvfb :99 -ac -screen 0 1920x1080x24 +extension RANDR -listen tcp &
注:原命令中
-screen +extension RANDR格式有误,需指定屏幕编号(如-screen 0)后再添加扩展参数。
- 在主容器中开放X服务器访问权限(测试环境可用,生产环境建议限制特定IP):
xhost +
- 在FFmpeg容器中执行录制命令,用主容器名称或IP指定X服务器:
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i application_container_name:99+100,200 output.mp4
方案二:共享X11 Unix套接字(更安全)
- 主容器启动时,创建共享卷挂载X11套接字目录:
docker run -v x11-socket:/tmp/.X11-unix --name app-container ...
同时启动XVFB(保持默认Unix套接字即可,无需TCP监听):
Xvfb :99 -ac -screen 0 1920x1080x24 +extension RANDR &
- FFmpeg容器启动时挂载同一个共享卷,并设置DISPLAY环境变量:
docker run -v x11-socket:/tmp/.X11-unix -e DISPLAY=:99 --name ffmpeg-container ...
- 执行录制命令:
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :99+100,200 output.mp4
额外注意事项
- 确保两个容器在同一个Docker网络下(默认bridge网络即可),这样容器名称可直接解析。
- 若用TCP方式,主容器的5999端口(X11默认端口为6000+显示号)无需手动映射,只要容器间网络可达即可。
内容的提问来源于stack exchange,提问作者Maged Milad
相关产品推荐
相关产品推荐

