网上找到的教程
通过homebrew安装xquartz,socat。
brew cask install xquartz
brew install socat
进入xquartz的设置中
"Preferences > Security" 勾选 "Allow connections from network clients"
关闭xquartz
转发x11 socket
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
查看macOS的ip
ifconfig en0
启动xquartz
open -a XQuartz
运行xhost并允许本机连接
export IP=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}')
xhost + $IP
启动docker
docker exec -it -e DISPLAY=$IP:0 containerName /bin/bash
出现的问题
但在转发x11 socket后启动xquartz会出现xquartz打不开的情况
我的系统版本为macOS 14.0,XQuartz版本为2.8.5
查看了xquartz的github仓库中的一些issue发现有些人使用macOS 14也出现了类似的问题
解决方法
将 X11 从 docker 容器内部转发到运行 macOS 的主机
- 安装 XQuartz:XQuartz
- 启动 XQuartz。在“XQuartz”菜单下,选择“首选项”
- 转到“安全”选项卡,并确保选中“允许来自网络客户端的连接”。
- 运行以允许连接到 macOS 主机 *
xhost + ${hostname}
- 设置 HOSTNAME env var
export HOSTNAME=`hostname`
* - 将以下内容添加到 docker-compose:
environment:
- DISPLAY=${HOSTNAME}:0
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
为此编写了一个启动docker的脚本:
#/bin/bash
# Set up XQuartz https://gist.github.com/cschiewek/246a244ba23da8b9f0e7b11a68bf3285
xhost + ${hostname}
export HOSTNAME=`hostname`
docker run -ti --name='xxx'\
-e DISPLAY=${HOSTNAME}:0 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
XXXXX
启动docker后在macOS打开xquartz,
再在docker中运行
export DISPLAY=<macOS的ip>:0.0
export XDG_RUNTIME_DIR=/tmp/runtime-root
即可正常显示GUI