【问题标题】:Running X-Windows Desktop Apps in Docker Containers on Windows 10在 Windows 10 上的 Docker 容器中运行 X-Windows 桌面应用程序
【发布时间】:2017-09-16 10:27:41
【问题描述】:

我想在我的 Windows 10 机器(i5、8GB、240 GB ssd、2&1 笔记本)中拥有一个 Linux 开发环境(Java、Intellij Idea、Clojure 和 ClojureScript)。我可以使用:

  1. Linux 虚拟机(使用 Hyper-V、VMware Player 或 Virtual Box),或
  2. 一个运行桌面应用程序的 docker 容器。

我想尝试第二个选项。在Docker Containers on the Desktop,作者运行一个Chrome浏览器docker使用:

$ docker run -it \
--net host \ # may as well YOLO
--cpuset-cpus 0 \ # control the cpu
--memory 512mb \ # max memory it can use
-v /tmp/.X11-unix:/tmp/.X11-unix \ # mount the X11 socket
-e DISPLAY=unix$DISPLAY \ # pass the display
-v $HOME/Downloads:/root/Downloads \ # optional, but nice
-v $HOME/.config/google-chrome/:/data \ # if you want to save state
--device /dev/snd \ # so we have sound
--name chrome \
jess/chrome

他使用的 Dockerfile 可以适应运行其他桌面应用程序,但是上面的命令在 Windows 中不起作用。我有一个正在运行的 XWindows 服务器(在 Windows 10 中),但我想知道如何更改 -e DISPLAY=unix$DISPLAY--device /dev/snd 选项。如何更改此命令才能工作?

Docker 使用 Hyper-V Linux VM 在 Windows 中运行。它会比 Hyper-V(或其他 VM 系统)中的完整 Linux VM 更快,还是模块化是 docker 在这种情况下的唯一优势?

【问题讨论】:

    标签: linux docker windows-10 virtual-machine hyper-v


    【解决方案1】:

    我遇到了同样的问题,我需要更多步骤。

    docker文件几乎一样:

    FROM ubuntu:18.04
    
    RUN apt-get update && apt-get install -y firefox
    
    # Replace 1000 with your user / group id
    RUN export uid=1000 gid=1000 && \
        mkdir -p /home/developer && \
        echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
        echo "developer:x:${uid}:" >> /etc/group && \
        echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
        chmod 0440 /etc/sudoers.d/developer && \
        chown ${uid}:${gid} -R /home/developer
    
    USER developer
    ENV HOME /home/developer
    CMD /usr/bin/firefox
    

    构建是:

    cat firefox.dockerfile | docker build -t firefox -
    

    然后我必须打开我的 x 服务器以接受与以下的连接:

    xhost +
    

    最后我不得不选择在与主机相同的网络中运行容器:

    docker run --net host -e DISPLAY=$DISPLAY firefox
    

    【讨论】:

    • 完成并退出此操作后,如何重新启动前一个会话(即使用 cookie,保存历史记录)?
    【解决方案2】:

    以下命令有效(我正在使用XcXsrv Xserver 允许来自任何来源的连接):

    docker run -d --name firefox1 -e DISPLAY=your-machine-ip-address:0  jess/firefox
    

    如果您不想命名 docker,可以删除 --name firefox1。电影工作正常,但没有声音。有人可以帮忙吗?

    其他 Xserver 也应该能正常工作,只要确保您允许来自任何来源的连接(请注意,此设置在开放网络中可能会构成安全威胁)。

    【讨论】:

    • 你知道如何启用声音吗?
    【解决方案3】:

    请记住,您的 docker 容器和主机实际上是不同的机器。从 docker 容器中使用 GUI 应用程序与在远程主机上运行 Linux GUI 应用程序并在本地 Windows 主机上显示它完全相同。

    当您的主机是 Linux 机器时,这很容易。您的主机已经运行了 X 服务器。 docker 容器可以将其 X 显示导出到主机并使用主机的 X 服务器来运行 GUI 应用程序。这就是你的 docker 命令所做的。

    对于Windows主机则没有这种可能,因为它不运行X,所以没有任何轻微的修改可以实现你想要的。

    您的选择是使用某些第三方工具在 Windows 上运行 X 服务器,或者使用任何其他远程连接技术,例如 VNC 或 RDP。但是既然你想要一个开发环境,我猜你想要一个无缝的体验,而 VNC 或 RDP 窗口将无法工作。然后你应该去在 Windows 上运行 X 服务器。

    查看this answer 了解实现此目的的可能方法。另请阅读该问题的其他答案。将主机 X 服务器用于 docker 容器应用程序可能存在安全隐患。由于您使用的是主机 X 服务器,因此应用程序不再是真正的沙盒。

    【讨论】:

    • 我想我不够具体,我在 Windows 中运行 X 服务器。
    • 我认为您无法将声音桥接到主机。对于显示部分,您应该像这样使用 Windows 主机的主机名:-e DISPLAY=kitchen-computer:0
    • macOS 主机怎么样?
    • 同样的故事。尽管 macOS 在 Linux 内核上运行,但 UI 子系统不是 X 兼容的显示服务。所以你需要在 macOS 上运行一个 X 服务来运行 GUI 应用程序。
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 2018-12-04
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多