Mac OS下XQuartz运行Docker容器xeyes报Can't open display如何解决
问题背景
在版本为10.15.5的Mac设备上,尝试通过XQuartz运行Docker容器内的Xeyes应用时,进入容器执行xeyes命令收到报错:Error: Can't open display: 192.168.1.9:0,复现步骤如下:
- 执行命令
brew install --cask xquartz安装XQuartz; - 编写Dockerfile:
# Base Image FROM alpine:latest RUN apk update && \ apk add --no-cache xeyes # Set a working directory WORKDIR /work # Start a shell by default CMD ["ash"]
- 执行命令
docker build -t so_xeyes .构建镜像; - 执行以下命令配置并启动容器:
# Set your Mac IP address IP=$(/usr/sbin/ipconfig getifaddr en0) echo $IP # 输出为192.168.1.9 # Allow connections from Mac to XQuartz /opt/X11/bin/xhost + "$IP" # 输出为192.168.1.9 being added to access control list # Run container docker run -it -e DISPLAY="${IP}:0" -v /tmp/.X11-unix:/tmp/.X11-unix so_xeyes
- 进入容器后执行
xeyes命令触发上述报错。
排查与解决步骤
按以下顺序逐一排查即可解决问题:
- 第一步:确认XQuartz网络监听配置开启
打开XQuartz,点击顶部菜单栏「XQuartz」→「偏好设置」→「安全性」标签,必须勾选「允许从网络客户端连接」选项。XQuartz默认关闭TCP 6000端口监听,仅靠xhost添加授权根本无法接收外部连接,这是该场景最高发的漏项。修改配置后必须完全退出XQuartz再重新启动才会生效。 - 第二步:验证XQuartz本身运行正常
在Mac本地终端执行/opt/X11/bin/xeyes,如果本地都无法弹出Xeyes窗口,先排查XQuartz安装问题:brew安装XQuartz后需要注销当前Mac用户重新登录,让X11相关环境变量加载生效,必要时可以重启设备后再测试。 - 第三步:修正IP获取方式,避免网卡识别错误
手动取en0网卡IP的方式兼容性很差:如果设备插了有线网卡、连了手机热点、开了VPN,活跃网卡可能不是en0,取到的IP根本不是当前和Docker互通的宿主机地址。Mac版Docker自带专用宿主机域名host.docker.internal,容器内可以直接解析到宿主机,无需手动取IP。
测试阶段可以先临时放开XQuartz访问授权,避免IP授权范围错误:
等功能跑通后再改成精确IP授权即可。/opt/X11/bin/xhost + - 第四步:排查防火墙拦截
打开Mac系统偏好设置→「安全性与隐私」→「防火墙」,临时关闭防火墙测试;如果关闭后能正常连接,给XQuartz添加允许传入连接的规则即可。 - 第五步:用正确参数启动容器
不需要挂载/tmp/.X11-unix目录(走TCP连接不需要Unix Socket,Mac版Docker对该套接字的挂载存在权限兼容问题),直接执行以下命令启动容器:
进入容器后直接执行docker run -it -e DISPLAY="host.docker.internal:0" so_xeyesxeyes即可正常弹出窗口。
内容的提问来源于stack exchange,提问作者ScottFred
相关产品推荐
相关产品推荐

