是否可以运行 Docker 容器并在主机上显示其图形应用程序窗口?

是否可以运行 Docker 容器并在主机上显示其图形应用程序窗口?

我已经创建了最简单的(最小工作示例)Dockerfile来在我的 Ubuntu 16.04 LTS 主机系统上使用 19.10 内部容器运行图形应用程序:

mkdir ~/docker-xclock

cat > ~/docker-xclock/Dockerfile << EOF
FROM ubuntu:19.10
RUN apt-get update
RUN apt-get install -y x11-apps
CMD xclock
EOF

然后使用以下方法创建容器

docker build -t ubuntu:xclock ~/docker-xclock

当我尝试运行此容器时,它会显示有关显示的错误:

$ docker run ubuntu:xclock 
Error: Can't open display: 

怎么了?

答案1

我们需要使用特殊语法[1]通知容器在主机上运行X11服务器:

docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --user="$(id --user):$(id --group)" ubuntu:xclock

docker 上的 xclock

其中[2]:

-e,--env = []
设置环境变量
-u,--用户=“”
设置使用的用户名或 UID,以及指定命令的组名或 GID(可选)。
-v|--卷[=[[主机目录:]容器目录[:选项]]]
创建绑定挂载。如果指定 -v /HOST-DIR:/CONTAINER-DIR,Docker 会将主机中的 /HOST-DIR 绑定挂载到 Docker 容器中的 /CONTAINER-DIR。如果省略“HOST-DIR”,Docker 会自动在主机上创建新卷。OPTIONS 是一个逗号分隔的列表,可以是:


参考:

  1. https://forums.docker.com/t/x11-forwarding-with-v-on-docker-run-not-working/17708/4
  2. man docker-run

完整可重复的解决方案:

mkdir ~/docker-xclock

cat > ~/docker-xclock/Dockerfile << EOF
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y x11-apps
CMD xclock
EOF

docker build -t ubuntu:xclock ~/docker-xclock

docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --user="$(id --user):$(id --group)" ubuntu:xclock

答案2

如果仍然出现类似错误:

No protocol specified
Error: Can't open display: :0

确保你跑

$ xhost local:docker

*-从https://github.com/jessfraz/dockerfiles/issues/6#issuecomment-266230114

答案3

Dockerfile在文件夹中创建docker-xclock

mkdir ~/docker-xclock

cat > ~/docker-xclock/Dockerfile << EOF
FROM ubuntu:19.04
ENV https_proxy="xxx"
ENV http_proxy="xxx"
ENV no_proxy="xxx"
RUN apt-get update
RUN apt-get install -y x11-apps
CMD xclock
EOF

docker build -t ubuntu:xclock ~/docker-xclock

docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --user="$(id --user):$(id --group)" ubuntu:xclock

注意:ubuntu:xclock放在命令末尾。使用 X11 进行 GUI 交互。

相关内容